Ottenere pagina corrente a livello di codice


54

In un fagiolo JSF supporto (Managed Bean, Weld Bean, non importa), posso ottenere il percorso del contesto del cliente è il chiamando

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

Questo mi dà il percorso del il cliente accede attualmente, come /myapplication. È anche possibile ottenere l'attuale pagina, come /home.faces e come?

102

Normalmente desidera utilizzare UIViewRoot#getViewId() per questo.

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

Questo si trova a El anche disponibili come segue:

#{view.viewId} 

Esattamente questo valore è riutilizzabile in caso di navigazione risultati, come <h:link outcome> e <h:button outcome>.


In alternativa, è anche possibile utilizzare HttpServletRequest#getRequestURI() per ottenere ciò l'utente finale è in realtà vedendo nella barra degli indirizzi del browser.

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

che è in EL disponibili anche come segue:

#{request.requestURI} 

Esattamente questo valore è riutilizzabile in <h:outputLink value> o semplice <a href>. Si noti che non è possibile utilizzarlo come risultato del caso di navigazione.

+1

Questo non funziona in modo affidabile. Ad esempio, con PrettyFaces questo non fornisce l'URL chiamato per creare la pagina corrente. 25 mar. 122012-03-25 20:10:58

+1

@DoubleMalt: OP non ha indicato che sta usando PrettyFaces. 25 mar. 122012-03-25 20:12:09

+4

Anche se è vero, non ha dichiarato esplicitamente di non averlo fatto. Il mio punto era semplicemente che le librerie che estendono JSF potrebbero rompere la soluzione (e PrettyFaces è un miglioramento piuttosto comune in quanto la gestione della navigazione standard è piuttosto goffa). Volevo solo dare alle persone che scoprono che la soluzione pulita non funziona per loro un indizio sul perché. 12 apr. 122012-04-12 11:58:49

  0

@DoubleMalt: Non faccio PrettyFaces, ma sarei molto sorpreso se il suo gestore di viste non determina l'URL corretto per un determinato risultato del caso di navigazione. 02 dic. 122012-12-02 00:56:27

+1

@DoubleMalt, Prettyfaces dovrebbe essere un semplice URL più carino. La tua affermazione di "la gestione della navigazione standard dell'implementazione è piuttosto goffa" ... Beh, prettyfaces non fa nulla sulla navigazione che JSF non ha. Si limita a mappare i propri URL a quelli più carini. Ha anche funzionalità relative ai parametri, ma non li considero specifici per la navigazione. 13 giu. 142014-06-13 22:01:34

  0

Questo suona come una buona idea, però colata getRequest di HttpServletRequest getteranno il seguente errore: ClassCastException: com.liferay.portlet.RenderRequestImpl non può essere lanciato a javax.servlet.http.HttpServletRequest Sembra come getRequest() restituirà un PortletRequestImpl e non sono sicuro di come ottenere l'URL utilizzando tale classe. 20 ago. 142014-08-20 22:41:12

+1

@Gaara: a quanto pare si sta sviluppando un'app portlet, non un'app servlet. Mi dispiace, i portlet sono oltre me. Basta cercare su come ottenere l'URI di richiesta da un'istanza 'PortletRequest'. 21 ago. 142014-08-21 05:49:06


12

Ok, capito, è

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

Spiega anche la tua risposta a parole. 17 feb. 132013-02-17 12:05:56

  0

Questo non aggiunge nulla alla/e risposta/i precedente/i. 10 giu. 152015-06-10 20:05:47