# JSP Filename ermitteln?



## zeromancer (3. Juni 2004)

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! ;-)


----------



## Christian Fein (3. Juni 2004)

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() %>


----------



## Thomas Darimont (3. Juni 2004)

Hallo!

Schau mal hier:
http://forum.java.sun.com/thread.jsp?forum=45&thread=79679


```
getServletContext().getRealPath(request.getServletPath());
```


Gruß Tom


----------



## zeromancer (3. Juni 2004)

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:


```
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.
```


----------



## Thomas Darimont (3. Juni 2004)

Hallo!


```
//...

	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


----------



## zeromancer (3. Juni 2004)

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.


----------



## Thomas Darimont (3. Juni 2004)

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


----------



## zeromancer (3. Juni 2004)

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


----------



## zeromancer (4. Juni 2004)

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:

```
<%request.setAttribute("page", request.getServletPath(); %>
```

Im Taghandler dann einfach mit


```
String pagename = request.getAttribute("page")
```

darauf zugreifen und weitermachen...

Das Fragment enthält dann das Tag

```
<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.


----------



## lominart (13. Juli 2011)

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


----------

