事情的起因是这样的:我想使用JSF2.0的ViewScope的MangedBean作为一个编辑界面的backing bean,但是发现它竟然要求这个bean必须要求支持序列化——因为ViewScope是通过把状态保存在ViewRoot上来实现的,这又依赖于StateManager,它在保存状态时需要序列化。本来让这个bean实现序列化接口就可以了,不过我这个bean可能还有一个属性是一个Spring的bean,难道我让这个Spring的bean也要支持序列化吗?
是的,问题的关键是序列化保存状态的问题引起的,其实SessionScope也会有这个问题——如果需要支持Session的复制的话。看来这不是JSF特有的问题,Spring中应该也有相似的问题,果不其然,我在Spring的论坛里找到了一个帖子:
http://forum.springsource.org/showthread.php?t=56569
写道
Hi,
we have a relatively large Spring-based web application. Our beans are generally of two types: application-wide services (stateless, usually singleton-scoped beans) and user-specific beans (typically stateful, session-scoped beans). Session-scoped beans are often injected with application beans and other session-scoped beans.
The problem we are facing now is that in this constellation, the HTTP session is not serializable since session beans reference application beans, which are not serializable. Another problem is that even if referenced bean is serializable, then after deserialization we'll get an multiple instances (unless we implement readResolve() and stuff).
So I'm really puzzled about how to make the HTTP session serializable in the case described above. My ideas are below:
1. Wrap all of the beans in a serializable scoped proxies. If target object is not serializable, scoped proxy will just serialize null and retrieve a new instance when called after deserialization.
This may work. However, it seems to be an overkill for me since it seems as ALL of the beans must be proxied. Means every method call will go through a proxy which I don't like much.
2. Invent some kind of a mechanism which would reinject transient properties. That is, serializable beans which reference non-serializable beans mark corresponding fields as transient. These values are not serialized. Then, when session is deserialized and the application accesses a deserialized session bean, transient properties (present in the bean definition in Spring) are re-injected by the bean factory.
From the Spring user perspective this would be the most convenient thing: just mark field as transient and Spring ("extended" session scope or whatever) will reinject the transient properties into the deserialized instance. However, I'm not sure if this is a correct approach. I also don't know what to do with bean initialization (like InitializingBean and so on). I'm also not sure if this is valid at all and if it is technically possible.
So I'd be very grateful if you guys comment on my problem/ideas.
如果你在Spring的SessionScope的bean中引用SingletonScoped的bean的话也会存在同样的问题。上面的帖子给出两种可能的解决方案,不过并不完美。或许本不该这么用?避免这么使用吗?
回到JSF,有时候这么用有很方便,我想出两种解决方案:
- 在JSF的SessionScope和ViewScope的managed bean中不注入Spring的bean,这两种Scope的managed bean只保存一般的属性和领域对象。处理界面的操作的部分放入另一个RequestScope的managed bean中,并在这个RequestScope的managedbean中引用SessionScope或ViewScope的managed bean。缺点就是无端多出几个manged bean来。
- 不使用IoC的方式注入Spring的bean到managed bean中,而是每次通过Spring的Application Context去getBean,这样manged bean中不存在对Spring bean的引用,序列化就不成问题了。缺点就是可能牺牲一些代码的优雅性,Mock测试mangaged bean的时候也不太方便。不过一般很少mock测试manged bean。
还有更好的解决方案吗?
最近开到Gavin King发表的一个评论上说使用JSF2.0,EJB和CDI的时候不需要考虑这个序列化的问题,也许JSF和EJB,CDI结合的更完美些,毕竟都是JEE的标准。
分享到:
相关推荐
domino xapges 开发sessionScope
- **PageScope、RequestScope、SessionScope、ApplicationScope**:分别代表页面、请求、会话和应用程序范围内的变量。 - **Cookie**:访问HTTP Cookie。 - **Header、HeaderValues**:访问HTTP头部信息。 - **...
它的核心理念是通过提供预定义的标签集合,使得开发者可以更加方便地处理常见的任务,如输入输出、流程控制、循环、XML处理、数据库操作以及国际化和格式化等。 **JSTL的五大标签库:** 1. **核心标签库** - `...
JSTL的四大核心库——`core`、`format`、`xml`和`sql`,分别负责数据管理、数据格式化、XML处理和数据库操作。 - **core**库包含了循环、条件判断、URL处理等标签,极大地提高了页面的可读性和可维护性。 - **...
和[ ]也可以同时混合使用,例如:${sessionScope.shoppingCart[0].price},回传结果为shoppingCart中第一项物品的价格。 EL变量: EL存取变量数据的方法很简单,例如:${username},它的意思是取出某一范围中名称...
EL表达式采用${value}的格式,可以使用点运算符或方括号运算符访问对象属性,以及执行算术和关系运算。 总结来说,Struts框架结合JSTL和EL,为Java Web开发提供了一套强大且灵活的工具,使得开发者能更专注于业务...
EL表达式支持多种运算符,包括算术运算符、关系运算符和逻辑运算符。运算符的使用与传统编程语言类似,但EL提供了更简便的语法结构,如属性访问、数组索引以及方法调用等。 例如,`bean.propertyName`可以访问...
- **逻辑运算**:EL支持逻辑运算、关系运算以及算术运算,如`true and false`的结果是`false`,`5 > 6`的结果也是`false`,而`5 + 5`的结果是`10`。 - **变量搜索范围**:EL在查找变量时会依次搜索Page、Request、...
国际化标签库用于处理国际化和区域设置相关的任务,包括日期和数字的格式化。 - `<fmt:setLocale>`:设置本地环境。 - `<fmt:bundle>` 和 `<fmt:setBundle>`:用于绑定资源文件。 - `<fmt:message>`:显示资源配置...
- JavaBean规范:学习JavaBean的创建、属性、getter/setter方法以及序列化。 - JDBC基础:熟悉数据库连接、SQL语句的执行、结果集处理等。 - JSP内置对象:理解request、response、session等内置对象的作用和用法。 ...
JSTL(JavaServer Pages Standard Tag Library)是一个用于JSP的标准标签库,它提供了一系列预定义的标签,简化了常见的编程任务,如控制流程、输出处理、URL管理和数据操作等。JSTL的核心标签库(Core Library)是...
2. **序列化**:JavaBean可以实现Serializable接口,从而可以被序列化和反序列化,便于在网络间传输。 3. **可重用性**:JavaBean的封装性使得它们可以在多个项目中重用,减少了代码的重复。 **JavaBean在JSP中的...
2. SessionScope:SessionScope 的变量生命周期是当前用户会话的生命周期,适合存储用户会话相关的变量。 3. ViewScope:ViewScope 的变量生命周期是当前页面的生命周期,适合存储当前页面相关的变量。 在 Domino ...
综上所述,EL表达式极大地简化了Web开发过程中对于JavaBean属性的访问以及数据的处理,使得开发者能够更加专注于业务逻辑的实现,而无需过多关注于底层细节。通过学习并熟练掌握EL表达式的使用方法,可以使Web开发变...
JSTL(JavaServer Pages Standard Tag Library)是一个用于简化JSP开发的标准标签库,其中的fn标签提供了一系列方便的字符串处理函数。这些函数使得在JSP页面中进行字符串操作更加简单,无需编写复杂的Java脚本。...
JSTL(JSP Standard Tag Library)是Java服务器端的一个重要组件,主要用于简化JSP页面的编程,提供了一系列的标签库来处理常见的任务,比如数据处理、URL操作、国际化等。它由Apache Jakarta小组维护,并在JSP 1.2...
通过结合使用EL表达式和JSTL标签,可以更加灵活地处理数据并构建动态网页。 ### 结论 EL表达式语言是JSP开发中不可或缺的一部分,它极大地简化了页面数据的处理过程。通过理解EL的基本语法及其与JSTL的结合使用,...
1. **标准化**:JSTL遵循一套明确的标准和约定,确保了其在不同开发环境下的兼容性和一致性。 2. **简化开发**:通过使用预定义的标签,减少了页面中Java脚本的使用,从而降低了出错率。 3. **模块化**:JSTL被分为...
- **国际化与文本格式化**:支持多语言环境下的内容展示,以及日期、数字等的格式化。 #### 三、JSTL标签库分类 JSTL提供的标签库主要分为以下五类: 1. **核心标签库**(Core Tag Library) - 前置名(Prefix)...