Jsf Mbean Scope

本文详细介绍了JSF中的MBean配置方法及其在不同作用域下的存储位置,并展示了如何通过JSF API获取这些MBean实例。

JSF中的MBean,其实MBean就是一个JavaBean,因此它有着和JavaBean相同的要求。 最后是MBean的配置,JSF的MBean需要在faces-config文件中做配置,配置方法如下:

 <managed-bean>

<description>demo of config</description>

 <display-name>userInfo</display-name>

<managed-bean-name>user</managed-bean-name>

 <managed-bean-class>net.moon.beans.UserInfo</managed-bean-class>

 <managed-bean-scope>session</managed-bean-scope> </managed-bean>

 

下面再对manage-bean-scope进行一下详细的解释,其有效取值为:application, session, request, none。很容易理解,它们的存活周期分别如下:

 Name Scope

Application 整个应用

Session 整个对话

Request 整个请求

 None 需要时,临时

大家知道,JSF是以JSP为基础的,那么,对于JSP的九大对象来说,这四种scope的信息到底是怎么存储的呢?经过测试证明,scope为applicatoin的MBean的实例保存在ServletContext中,也就是JSP中的application中,因此我们可以用如下的方法得到某个类的引用:

FacesContext fc = FacesContext.getCurrentInstance();

UserInfo ui = (serInfo)fc.getExternalContext().getApplicationMap().get("user");

 

对session级别的MBean,我们可以用如下方法得到其引用:

FacesContext fc = FacesContext.getCurrentInstance();

UserInfo ub = (UserInfo)fc.getExternalContext().getSessionMap().get("userInfo");

当然,我们也可以用其它的方法得到session对象后,从session中取出实例。 对request级别的MBean,我们可从request对象中取得,代码如下:

 FacesContext fc = FacesContext.getCurrentInstance();

HttpServletRequest request = (HttpServletRequest)fc.getExternalContext().getRequest();

 UserInfo ui = (UserInfo)request.getAttribute("user");

 

至于none类型的MBean,应该只能得到新的实例了。

 当然,JSF提供了另外的访问MBean的方法,我们可以用如下的代码得到MBean的实例:

 FacesContext context = FacesContext.getCurrentInstance();

ValueBinding binding = context.getApplication().createValueBinding("#{user}");

UserBean user = (UserBean) binding.getValue(context);

 

也可用如下的代碼直接得到MBean的一個屬性:

 FacesContext context = FacesContext.getCurrentInstance();

 ValueBinding binding = context.getApplication().createValueBinding("#{user.name}");

String name = (String) binding.getValue(context);

### JSF 中 requestScope 的使用及其与 ViewExpiredException 的关系 在 JavaServer Faces (JSF) 框架中,`requestScope` 是一种作用域,用于管理在单个 HTTP 请求生命周期内有效的托管 Bean。当请求完成时,该作用域中的 Bean 会被销毁。`requestScope` 通常用于处理短期数据,例如表单提交、页面导航参数或请求级别的临时状态信息 [^1]。 在 JSF 页面中,`requestScope` 可以通过 EL 表达式访问,例如: ```xhtml <h:outputText value="#{requestScope.message}" /> ``` 此方式可用于在页面中动态显示请求级别的数据,但需注意该作用域的生命周期较短,无法跨请求保留数据 [^1]。 `ViewExpiredException` 是 JSF 在恢复视图状态失败时抛出的异常,通常发生在用户提交一个已经过期的页面(如会话超时、页面缓存失效等)时 [^1]。`requestScope` 与 `ViewExpiredException` 之间存在一定的关联,主要体现在以下几个方面: 1. **作用域生命周期与视图状态恢复的关系** `requestScope` 的生命周期仅限于单个请求,因此在页面重定向或表单提交后,该作用域中的数据将不再可用。如果页面在后续请求中尝试恢复视图状态时依赖 `requestScope` 中的数据,可能导致 `ViewExpiredException`。例如,页面在首次加载时将某些状态信息存入 `requestScope`,而在后续的 AJAX 请求或表单提交中尝试访问这些信息时,由于 `requestScope` 已被清除,可能导致视图状态恢复失败 [^1]。 2. **避免在视图状态中依赖 requestScope 数据** JSF 的视图状态(View State)用于维护页面组件的状态信息,通常存储在服务器端(基于会话)或客户端(基于隐藏字段)。如果页面组件的状态依赖 `requestScope` 中的数据,而这些数据在后续请求中不可用,则可能导致视图状态恢复失败。因此,在设计页面结构时,应避免将 `requestScope` 中的数据直接嵌入视图状态中,或确保这些数据在后续请求中仍可访问 [^1]。 3. **合理使用其他作用域替代 requestScope** 在需要跨请求保持数据的场景下,应优先使用 `viewScope` 或 `sessionScope` 替代 `requestScope`。例如,`viewScope` 适用于页面级别的数据管理,其生命周期与当前视图绑定,能够在多次请求中保持数据,从而避免因 `requestScope` 数据丢失而导致的 `ViewExpiredException` [^1]。 ```xml <managed-bean> <managed-bean-name>contactBean</managed-bean-name> <managed-bean-class>com.example.ContactBean</managed-bean-class> <managed-bean-scope>view</managed-bean-scope> </managed-bean> ``` 4. **处理 requestScope 数据与页面缓存的关系** 如果页面被浏览器缓存并在后续请求中重新加载,可能会导致 `requestScope` 中的数据缺失,从而影响视图状态的恢复。为了避免此类问题,可以在响应头中设置缓存控制策略,防止浏览器缓存导致页面状态不一致: ```java @WebFilter("*.jsf") public class NoCacheFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); res.setHeader("Pragma", "no-cache"); res.setDateHeader("Expires", 0); chain.doFilter(request, response); } } ``` 综上所述,`requestScope` 在 JSF 中适用于短期数据管理,但其生命周期较短,容易导致视图状态恢复失败。在设计页面结构时,应合理选择作用域,避免在视图状态中依赖 `requestScope` 数据,同时采取适当措施防止页面缓存问题,以降低 `ViewExpiredException` 出现的可能性 [^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值