JSP Filename ermitteln?

zeromancer

Erfahrenes Mitglied
Hi Folks!

Seit Stunden beiße ich mir die Zähne aus. :(

Ich habe:

Ein JSP, welches ein eigenes Tag einbindet. Dieses Tag ist in einer Handler-Klasse definiert. Ich bräuchte nun aus diesem Context (hehe, ja ein PageContext) den Dateinamen des JSPs, welches dieses Tag einbindet.
Es kann auch eine URL sein, den Namen parse ich mir schon..

Jemand eine Idee?

Schankedön! ;-)
 
Definiere Name.

Der URL Name oder der Filename.

Denn mann kann auch über die web.xml eine Datei die sich
a.jsp nennt über die url b.jsp zugänglich machen.


<%= getServletName() %>
 
Wow, super fix Ihr beide!

@Christian:
Den URL-Filenamen brauche ich irgendwie.
Leider funktioniert Dein Beispiel nicht, ich brauche den Namen innerhalb der Klasse, nicht im JSP.

@Thomas: den Artikel hatte ich schon gesehen, nur leider wird die Methode getServletPath() moniert.

Hier mal ein Code-Auszug des Tag-Handlers:

Code:
public class Bullet implements Tag {
	PageContext context;
	String pageid;
	String pagename;
	String foundpageid = "";

	String imagepath = "/images/";
	String imagename = "arrowrightsmall.gif";

	/* (non-Javadoc)
	 * @see javax.servlet.jsp.tagext.Tag#setPageContext(javax.servlet.jsp.PageContext)
	 */
	public void setPageContext(PageContext arg0) {
		context = arg0;
		
		// Hier den Namen des JSPs ermitteln
		pagename = "?";

	}

... usw. usw.
 
Zuletzt bearbeitet:
Hallo!

Code:
//...

	public void setPageContext(PageContext arg0) {
		context = arg0;
		
		// Hier den Namen des JSPs ermitteln
		//So vielleicht?
		//Not tested.... ;-)
		pagename = context.getRequest().getRealPath(request.getServletPath());

	}
//...

Gruß Tom
 
Sorry, Tom, so gehts nicht - die Methode getServletPath() ist nicht implementiert ;-)

Man kann so ziemlich alle Infos aus dem Context ziehen, nur den Namen nicht - verbesserungsfähig, hm?
Es gibt eine Methode getServletContextName, nur nützt mir der nichts, ich brauche explizit den JSP-URL-Namen, also etwa sowas:

http://meinserver/context/index.jsp

=> index.jsp

oder von mir aus die komplette URL.
 
Hallo!

Weshalb gestalltest du dein tag nicht einfach so, dass du einfach beim Aufrufen des Tags in deiner JSP den Pfad/URL/WhatEver zu dieser als Parameter mitgibst?

Gruß Tom
 
Das wäre ja zu einfach :-)

Problematik:

Ich will ein Fragment in die JSPs einbinden. Innerhalb des Fragments sollen die Tags dafür sorgen, dass HTML-Tags nur dann an entsprechenden Stellen eingebunden werden, wo der Name des JSPs mit einem Namen, den ich aus einer DB ziehe, übereinstimmen. Es handelt sich hierbei um den Versuch, Bullets vor entsprechenden Menü-Links zu dynamisieren. Die Zuweisungen befinden sich wie gesagt in einer DB, die zu passende Page-ID übergebe ich selbstverständlich dem Tag als Parameter.

Beispiel:

Das Fragment einbindende JSP heisst index.jsp. Das Menü sieht so aus:

<meintag:bullet pageid="index"/> Sartseite
...
<meintag:bullet pageid="contact"/> Kontakt
...
usw.

Nur dort, wo pageid und JSP-Name, der aus der DB ermittelt wird, übereinstimmen, soll das Bullet erscheinen.

Zuweisungen in der DB:

index.jsp -> index
contact.jsp -> contact
extras.jsp -> index (ja, ebenfalls)

Zu Kompliziert? Ich finds klasse :-)
 
Ich habs nun doch geschafft - um die Sache mal aufzulösen:

Dem Fragment übergibt man ein Attribut, welches dann im Taghandler entsprechend ausgelesen wird - anders geht es nicht, da man vom Taghandler aus keinen Zugriff auf ein HttpServletRequest Objekt bekommt.

JSP Code:
Code:
<%request.setAttribute("page", request.getServletPath(); %>

Im Taghandler dann einfach mit

Code:
String pagename = request.getAttribute("page")

darauf zugreifen und weitermachen...

Das Fragment enthält dann das Tag
Code:
<meintag:bullet pageid="index" />

Die einbindende JSP heisst z.B. index.jsp, sodass sich das Mapping
index.jsp <-> index ergibt. Der Taghandler wertet diese Gleichheit aus und gibt entsprechend den HTML Code im doEndTag() aus, in diesem Fall ein Bildchen (Bullet). Vor dem Menüeintrag meines Fragment (ein Link mit Bullet eben...) erscheint dieses dann nur dort passend, wo ich per mySQL-DB angegeben habe. Der Datensatz

pagename = 'index.jsp'
pageid = 'index'

sorgt dafür .

Das war's... :)

Danke an alle, die mitgegrübelt haben - so einfach kann es sein, nur war ich auf der Suche nach einer reinen Klassen-Lösung.
 
Zuletzt bearbeitet:
In einer Klasse, die TagSupport erweitert, funktioniert folgendes:

-----------------

String url = ((HttpServletRequest)this.pageContext.getRequest()).getRequestURL().toString();
String uri = ((HttpServletRequest)this.pageContext.getRequest()).getRequestURI();
String cp = ((HttpServletRequest)this.pageContext.getRequest()).getContextPath();
String sp = ((HttpServletRequest)this.pageContext.getRequest()).getServletPath();

System.out.println(url);
System.out.println(uri);
System.out.println(cp);
System.out.println(sp);

-----------------

Ausgabe:

http://localhost:8080/App/index.jsp
/App/index.jsp
/App
/index.jsp
 
Zuletzt bearbeitet:
Zurück