Uzyskaj bieżącej strony programowo


54

W fasoli JSF podkładowej (Managed Bean, Weld Bean, nie ma znaczenia), można uzyskać ścieżkę kontekstowe klient jest na wywołując

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

To daje mi ścieżkę do klient aktualnie uzyskuje dostęp, na przykład /myapplication. Czy jest również możliwe uzyskanie bieżącej strony, np. /home.faces i jak?

102

Zazwyczaj chcą korzystać UIViewRoot#getViewId() do tego.

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

Jest również dostępny w EL następująco:

#{view.viewId} 

Dokładnie ta wartość jest reuseable w przypadku nawigacji Efekty takie jak <h:link outcome> i <h:button outcome>.


Alternatywnie, można również użyć HttpServletRequest#getRequestURI() aby niezależnie od użytkownika końcowego jest rzeczywiście widząc w pasku adresu przeglądarki.

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

który jest w EL również dostępne w następujący sposób:

#{request.requestURI} 

Dokładnie ta wartość jest reuseable w <h:outputLink value> lub zwykły <a href>. Pamiętaj, że nie możesz go użyć jako wyniku sprawy nawigacyjnej.

+1

nie niezawodnie pracować. W przypadku PrettyFaces na przykład nie podaje się adresu URL, który został wywołany w celu utworzenia bieżącej strony. 25 mar. 122012-03-25 20:10:58

+1

@DoubleMalt: OP nie wskazał, że używa PrettyFaces. 25 mar. 122012-03-25 20:12:09

+4

Chociaż prawdą jest, że nie powiedział wyraźnie, że tego nie zrobił. Chodzi mi o to, że biblioteki, które rozszerzają JSF, mogą złamać twoje rozwiązanie (a PrettyFaces jest dość powszechnym ulepszeniem, ponieważ obsługa nawigacji w standardowej implementacji jest dość nieporęczna). Chciałem tylko dać ludziom, którzy dowiadują się, że twoje czyste rozwiązanie nie działa dla nich, dlaczego. 12 kwi. 122012-04-12 11:58:49

  0

@DoubleMalt: Nie robię PrettyFaces, ale byłbym bardzo zaskoczony, gdyby jego przeglądarka nie określiła poprawnego adresu URL dla danego wyniku sprawy nawigacyjnej. 02 gru. 122012-12-02 00:56:27

+1

@DoubleMalt, Prettyfaces ma być tylko ładniejszym url URL. Twoje stwierdzenie dotyczące "standardowej implementacji nawigacji jest dość niezgrabne" ... No cóż, ślady nie mają wpływu na nawigację, której nie ma JSF. Po prostu mapuje adresy URL do ładniejszych. Ma również funkcje związane z parametrami, ale nie uważam ich za specyficzne dla nawigacji. 13 cze. 142014-06-13 22:01:34

  0

To brzmi jak dobry pomysł, jednak odlewania getRequest do HttpServletRequest rzuci się następujący błąd: ClassCastException: com.liferay.portlet.RenderRequestImpl nie mogą być oddane do javax.servlet.http.HttpServletRequest Wygląda getRequest() zwróci portletRequestImpl i nie wiem, jak uzyskać adres URL za pomocą takiej klasy. 20 sie. 142014-08-20 22:41:12

+1

@Gaara: najwyraźniej tworzysz aplikację portletową, a nie aplet. Przepraszamy, portlety są poza mną. Po prostu wyszukaj, jak uzyskać identyfikator URI żądania od instancji "PortletRequest". 21 sie. 142014-08-21 05:49:06


12

Ok, rozumiem, że to

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

Proszę wyjaśnij swoją odpowiedź również słowami. 17 lut. 132013-02-17 12:05:56

  0

To nie dodaje nic do poprzednich odpowiedzi. 10 cze. 152015-06-10 20:05:47