我正在使用带有 facelets 的 JSF,我需要在 JSF 页面中获取请求和会话参数。在 JSP 页面中,我得到了这样的参数:"${requestScope.paramName}"
或"${sessionScope.paramName}"
. 但是现在使用 JSF 后只有 bean,除了 bean 属性之外,您无法获取任何值。
注意:我需要的会话属性是使用 acegi 安全性自动填充的,因此我无法访问它们。
那么现在该怎么办呢?
您可以使用以下表达式获取请求参数id :
<h:outputText value="#{param['id']}" />
JSF 1.0 规范的第 5.3.1.2 节定义了必须由变量解析器解析的对象。
您还可以使用 bean(建议使用请求范围)并通过 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 模块可以让你访问你需要的变量。
您可以使用
<h:outputText value="#{param['id']}" />
或者
<h:outputText value="#{request.getParameter('id')}" />
但是,如果您想将参数传递给您的支持 bean,那么 usingf:viewParam
可能就是您想要的。“视图参数是查询字符串参数和模型值之间的映射。”
<f:viewParam name="id" value="#{blog.entryId}"/>
这会将 GET 参数的 id 参数设置为 blog bean 的entryId
字段。有关详细信息,请参阅http://java.dzone.com/articles/bookmarkability-jsf-2。
你可以这样:
#{requestScope["paramName"]} ,#{sessionScope["paramName"]}
因为requestScope
orsessionScope
是一个 Map 对象。
您还可以使用 OcpSoft 的PrettyFaces之类的工具将动态参数值直接注入 JSF Beans。
假设您已经将对象作为属性放在FacesContext
托管 bean 的当前实例的会话映射上,您可以通过以下方式从 JSF 页面获取它:
<h:outputText value="#{sessionScope['yourObject'] }" />
如果您的对象具有属性,请通过以下方式获取它:
<h:ouputText value="#{sessionScope['yourObject'].anyProperty }" />
您确定无法从 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>
在 bean 中,您可以使用 session.getAttribute("attributeName");