从 JSF 页面获取请求和会话参数和属性
Posted
技术标签:
【中文标题】从 JSF 页面获取请求和会话参数和属性【英文标题】:Get Request and Session Parameters and Attributes from JSF pages 【发布时间】:2010-10-07 17:14:53 【问题描述】:我正在使用带有 facelets 的 JSF,我需要在 JSF 页面中获取请求和会话参数。在 JSP 页面中,我得到了这样的参数:"$requestScope.paramName"
或 "$sessionScope.paramName"
。但是现在使用 JSF 后只有 bean,除了 bean 属性之外,你无法获取任何值。
注意:我需要的会话属性是使用 acegi security 自动填充的,因此我无法访问它们。
那么现在该怎么办?
【问题讨论】:
【参考方案1】:您可以使用表达式获取请求参数id:
<h:outputText value="#param['id']" />
param - 此请求的请求参数的不可变 Map,由
参数名称。仅包含每个参数名称的第一个值。
sessionScope - 此请求的会话属性映射,由
属性名称。
JSF 1.0 specification 的第 5.3.1.2 节定义了必须由变量解析器解析的对象。
【讨论】:
【参考方案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 模块可以让你访问你需要的变量。
【讨论】:
+1,但到底是谁想出了这么荒谬的 API 来获取单个参数? @GDemecki:没有人...做过,也许是 php 人切换到 JSF。 ***.com/questions/28780051/…【参考方案3】:你可以使用
<h:outputText value="#param['id']" />
或
<h:outputText value="#request.getParameter('id')" />
但是,如果您想将参数传递给您的支持 bean,则使用 f:viewParam
可能是您想要的。 “视图参数是查询字符串参数和模型值之间的映射。”
<f:viewParam name="id" value="#blog.entryId"/>
这会将 GET 参数的 id 参数设置为 blog bean 的 entryId
字段。详情请见http://java.dzone.com/articles/bookmarkability-jsf-2。
【讨论】:
【参考方案4】:你可以这样:
#requestScope["paramName"] ,#sessionScope["paramName"]
因为requestScope
或sessionScope
是一个地图对象。
【讨论】:
【参考方案5】:您也可以使用像 OcpSoft 的 PrettyFaces 这样的工具将动态参数值直接注入 JSF Beans。
【讨论】:
【参考方案6】:假设您已经将对象作为属性放在托管 bean 中 FacesContext
的当前实例的会话映射上,您可以通过以下方式从 JSF 页面获取它:
<h:outputText value="#sessionScope['yourObject'] " />
如果您的对象有属性,请通过以下方式获取:
<h:ouputText value="#sessionScope['yourObject'].anyProperty " />
【讨论】:
如何将会话对象作为属性放在我的托管 bean 中的 FacesContext 的当前实例的会话映射中??? ***.com/questions/4495404/…【参考方案7】:您确定无法从 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>
【讨论】:
【参考方案8】:在 bean 中你可以使用 session.getAttribute("attributeName");
【讨论】:
以上是关于从 JSF 页面获取请求和会话参数和属性的主要内容,如果未能解决你的问题,请参考以下文章
如何在页面加载时处理辅助bean中的GET查询字符串URL参数?
JSF 2 + Spring 3 + Shiro - 会话超时不重定向到登录页面
使用 Javascript 可以从 HTML 页面中的 servlet 设置的会话属性中获取值吗