从 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】:

你可以使用

&lt;h:outputText value="#param['id']" /&gt;

&lt;h:outputText value="#request.getParameter('id')" /&gt;

但是,如果您想将参数传递给您的支持 bean,则使用 f:viewParam 可能是您想要的。 “视图参数是查询字符串参数和模型值之间的映射。”

&lt;f:viewParam name="id" value="#blog.entryId"/&gt;

这会将 GET 参数的 id 参数设置为 blog bean 的 entryId 字段。详情请见http://java.dzone.com/articles/bookmarkability-jsf-2。

【讨论】:

【参考方案4】:

你可以这样:

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

因为requestScopesessionScope 是一个地图对象。

【讨论】:

【参考方案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 - 会话超时不重定向到登录页面

JSF。在每个页面加载时调用支持 bean 方法[重复]

使用 Javascript 可以从 HTML 页面中的 servlet 设置的会话属性中获取值吗

迁移到 tomcat 后,将枚举值作为参数从 JSF 页面传递给 bean 方法失败

刷新会话jsf2,PrimeFaces中的数据