Получить параметры запроса и сеанса и атрибуты со страниц JSF - PullRequest
53 голосов
/ 15 февраля 2009

Я использую JSF с facelets, и мне нужно получить параметры запроса и сеанса внутри страницы JSF. На страницах JSP я получил такой параметр: "${requestScope.paramName}" или "${sessionScope.paramName}". Но теперь после использования JSF есть только бины, и вы не можете получить никакого значения, кроме атрибутов бина.

ПРИМЕЧАНИЕ. Атрибуты сеанса, которые мне нужны, автоматически заполняются с использованием безопасности acegi, поэтому я не могу получить к ним доступ.

Так что же теперь делать?

Ответы [ 8 ]

87 голосов
/ 15 февраля 2009

Вы можете получить параметр запроса id , используя выражение:

<h:outputText value="#{param['id']}" />
  • param - неизменяемая карта параметров запроса для этого запроса с ключом Имя параметра. Включено только первое значение для каждого имени параметра.
  • sessionScope - Карта атрибутов сеанса для этого запроса, основанная на имя атрибута.

В разделе 5.3.1.2 спецификации JSF 1.0 определены объекты, которые должны быть разрешены преобразователем переменных.

41 голосов
/ 17 февраля 2009

Вы также можете использовать бин (предлагается область действия запроса) и напрямую обращаться к контексту через FacesContext.

Вы можете получить объекты HttpServletRequest и HttpServletResposne, используя следующий код:

HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
HttpServletResponse res = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();

После этого вы можете получить доступ к отдельным параметрам через getParameter(paramName) или получить доступ к полной карте через getParameterMap() req объект

Причина, по которой я предлагаю bean-объект в области запроса, заключается в том, что вы можете использовать их во время инициализации (наихудший сценарий - конструктор. Большинство фреймворков предоставляют вам место для выполнения кода во время инициализации bean-компонента), и они будут выполнены по мере поступления вашего запроса в.

Это, однако, что-то вроде хака. ;) Возможно, вы захотите посмотреть, есть ли модуль JSF Acegi, который позволит вам получить доступ к нужным вам переменным.

32 голосов
/ 15 ноября 2011

Вы можете использовать

<h:outputText value="#{param['id']}" /> или

<h:outputText value="#{request.getParameter('id')}" />

Однако, если вы хотите передать параметры бэк-бинам, возможно, вам нужно использовать f:viewParam. «Параметр представления - это отображение между параметром строки запроса и значением модели.»

<f:viewParam name="id" value="#{blog.entryId}"/>

Это установит параметр id параметра GET в поле entryId bean-компонента. Подробнее см. http://java.dzone.com/articles/bookmarkability-jsf-2.

13 голосов
/ 12 ноября 2012

Вам может понравиться это:

#{requestScope["paramName"]} ,#{sessionScope["paramName"]}

Поскольку requestScope или sessionScope является объектом карты.

6 голосов
/ 08 февраля 2010

Вы также можете использовать такой инструмент, как OcpSoft's PrettyFaces , чтобы вводить динамические значения параметров непосредственно в компоненты JSF.

5 голосов
/ 17 июля 2013

Предполагая, что вы уже поместили свой объект в качестве атрибута на карту сеанса текущего экземпляра FacesContext из вашего управляемого компонента, вы можете получить его со страницы JSF следующим образом:

<h:outputText value="#{sessionScope['yourObject'] }" />

Если у вашего объекта есть свойство, получите его по:

<h:ouputText value="#{sessionScope['yourObject'].anyProperty }" />
4 голосов
/ 18 февраля 2009

Вы уверены, что не можете получить доступ к переменным области запроса / сеанса со страницы JSF?

Это то, что я делаю на нашей странице входа в систему, используя Spring Security:

<h:outputText
    rendered="#{param.loginFailed == 1 and SPRING_SECURITY_LAST_EXCEPTION != null}">
    <span class="msg-error">#{SPRING_SECURITY_LAST_EXCEPTION.message}</span>
</h:outputText>
0 голосов
/ 19 марта 2019

В бине вы можете использовать session.getAttribute ("attributeName");

...