Holen Sie sich aktuelle Seite programmatisch


54

In einer JSF Backing Bean (Managed Bean, Weld Bean, spielt keine Rolle), kann ich den Kontextpfad erhalten der Client ist durch

Aufruf
FacesContext ctx = FacesContext.getCurrentInstance(); 
String path = ctx.getExternalContext().getRequestContextPath(); 

Das gibt mir den Weg der Client greift derzeit auf, wie /myapplication. Ist es auch möglich, die aktuelle Seite, wie /home.faces, und wie?

102

Sie normalerweise wollen UIViewRoot#getViewId() für diesen Einsatz.

String viewId = facesContext.getViewRoot().getViewId(); 

Dies ist in EL erhältlich auch wie folgt:

#{view.viewId} 

Genau dieser Wert ist wieder verwendbar in Navigations Fall Ergebnisse wie <h:link outcome> und <h:button outcome>.


Alternativ können Sie auch HttpServletRequest#getRequestURI() verwenden zu bekommen, was die Enduser tatsächlich in der Browser-Adressleiste ist zu sehen.

String uri = ((HttpServletRequest) externalContext.getRequest()).getRequestURI(); 

, die in EL ist auch wie folgt:

#{request.requestURI} 

Genau dieser Wert ist wieder verwendbar in <h:outputLink value> oder schlicht <a href>. Beachten Sie, dass Sie es nicht als Ergebnis des Navigationsvorgangs verwenden können.

+1

Dies funktioniert nicht zuverlässig. Mit PrettyFaces zum Beispiel gibt dies nicht die URL, die zum Erstellen der aktuellen Seite aufgerufen wurde. 25 mär. 122012-03-25 20:10:58

+1

@DoubleMalt: OP hat nicht angegeben, dass er PrettyFaces verwendet. 25 mär. 122012-03-25 20:12:09

+4

Obwohl es wahr ist, hat er auch nicht explizit gesagt, dass er das nicht getan hat. Mein Punkt war einfach, dass Bibliotheken, die JSF erweitern, Ihre Lösung zerstören könnten (und PrettyFaces ist eine ziemlich übliche Verbesserung, da die Navigation der Standardimplementierung ziemlich unbeholfen ist). Ich wollte nur Menschen, die herausfinden, dass Ihre saubere Lösung nicht funktioniert für sie ein Hinweis warum. 12 apr. 122012-04-12 11:58:49

  0

@DoubleMalt: Ich mache PrettyFaces nicht, aber ich wäre sehr überrascht, wenn sein View-Handler nicht die richtige URL für ein gegebenes Ergebnis eines Navigationsfalls ermitteln würde. 02 dez. 122012-12-02 00:56:27

+1

@DoubleMalt, soll Prettyfaces nur eine url hübsch sein. Ihre Aussage über die Handhabung der Navigation durch die Standardimplementierung ist ziemlich unbeholfen. Nun, PrettyFaces macht nichts mit der Navigation, die JSF nicht tut. Es mappt nur seine URLs zu einem hübscheren. Es hat auch parameterbezogene Funktionalitäten, aber ich betrachte sie nicht als navigationsspezifisch. 13 jun. 142014-06-13 22:01:34

  0

Das klingt wie eine gute Idee, aber getRequest zu HttpServletRequest Gießen den folgenden Fehler werfen: Classcast: com.liferay.portlet.RenderRequestImpl nicht javax.servlet.http.HttpServletRequest gegossen werden kann Scheint wie getRequest() gibt ein PortletRequestImpl, und ich bin nicht sicher, wie man die URL unter Verwendung solcher Klasse erhält. 20 aug. 142014-08-20 22:41:12

+1

@Gaara: anscheinend entwickeln Sie eine Portlet-App, keine Servlet-App. Entschuldigung, Portlets sind über mich hinaus. Suchen Sie einfach, wie Sie den Request-URI von einer PortletRequest-Instanz erhalten. 21 aug. 142014-08-21 05:49:06


12

Ok, habe es, es ist

FacesContext ctx = FacesContext.getCurrentInstance(); 
HttpServletRequest servletRequest = (HttpServletRequest) ctx.getExternalContext().getRequest(); 
// returns something like "/myapplication/home.faces" 
String fullURI = servletRequest.getRequestURI(); 

2
String uri = ((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRequestURI(); 

1
String str = ((HttpServletRequest) FacesContext.getCurrentInstance() 
.getExternalContext().getRequest()).getRequestURI(); 
System.out.println(str); 
+2

Bitte erläutern Sie Ihre Antwort auch in Worten. 17 feb. 132013-02-17 12:05:56

  0

Dies fügt nichts zu den vorherigen Antwort (en) hinzu. 10 jun. 152015-06-10 20:05:47