Получить текущую страницу программно


54

В JSF основы боба (Managed Bean, Weld Bean, не имеет значения), я могу получить путь контекста клиент находится на по телефону

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

Это дает мне путь к клиент в настоящее время обращается, например, /myapplication. Возможно ли получить текущий страница, как /home.faces, и как?

102

Вы обычно хотите использовать UIViewRoot#getViewId() для этого.

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

Это в EL также доступно в следующем:

#{view.viewId} 

Именно это значение многоразовый в навигационном случае таких показателей, как <h:link outcome> и <h:button outcome>.


В качестве альтернативы, вы можете также использовать HttpServletRequest#getRequestURI(), чтобы получить то, что конечный пользователь фактически видит в адресной строке браузера.

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

Что в EL также доступны в следующем:

#{request.requestURI} 

Именно это значение многоразовых в <h:outputLink value> или простой <a href>. Обратите внимание, что вы не можете использовать его в качестве результата для навигации.

+1

Это не надежно работать. Например, с PrettyFaces это не дает URL-адрес, который был вызван для создания текущей страницы. 25 мар. 122012-03-25 20:10:58

+1

@DoubleMalt: OP не указывает, что он использует PrettyFaces. 25 мар. 122012-03-25 20:12:09

+4

Хотя это правда, он также явно не указал, что он этого не сделал. Моя точка зрения заключалась в том, что библиотеки, расширяющие JSF, могут нарушить ваше решение (а PrettyFaces - довольно распространенное усовершенствование, поскольку обработка стандартной навигации в навигации довольно неуклюжая). Я просто хотел дать людям, которые узнают, что ваше чистое решение не помогает им понять, почему. 12 апр. 122012-04-12 11:58:49

  0

@DoubleMalt: Я не делаю PrettyFaces, но я был бы очень удивлен, если его обработчик вида не определит правильный URL-адрес для данного результата. 02 дек. 122012-12-02 00:56:27

+1

@DoubleMalt, Prettyfaces должен быть простым URL-адресом. Ваше утверждение о том, что «стандартная реализация справляется с навигацией, довольно неуклюжие» ... Ну, поверхностные интерфейсы ничего не делают о навигации, которую не поддерживает JSF. Он просто отображает его URL в более красивые. Он также имеет связанные с параметрами функции, но я не считаю их специфичными для навигации. 13 июн. 142014-06-13 22:01:34

  0

Это звучит как хорошая идея, однако кастинг GetRequest к HttpServletRequest выбросит следующее сообщение об ошибке: ClassCastException: com.liferay.portlet.RenderRequestImpl не может быть приведен к javax.servlet.http.HttpServletRequest Похоже GetRequest() будет возвращать PortletRequestImpl, и я не уверен, как получить URL-адрес с помощью такого класса. 20 авг. 142014-08-20 22:41:12

+1

@Gaara: видимо, вы разрабатываете приложение портлета, а не приложение сервлета. Извините, портлеты находятся вне меня. Просто выполните поиск вокруг того, как получить URI запроса из экземпляра «PortletRequest». 21 авг. 142014-08-21 05:49:06


12

Хорошо, понял, что это

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

Пожалуйста, объясните свой ответ и в словах. 17 фев. 132013-02-17 12:05:56

  0

Это ничего не добавляет к предыдущим ответам. 10 июн. 152015-06-10 20:05:47