JBoss Seam (POJO without EJB) 后台 + ExtJS 前台完整例子(九)
1.引言
在2007年初,接触到了RubyOnRails,为其开发的快捷和方便所折服。反观用了多年的Java技术,则很难找到能与之抗衡的新框架。难怪有人要超越java(
Beyond Java)了。
Spring 曾经因为倡导无EJB的J2EE企业级开发,近几年来得到了广泛的关注和应用。JBoss Seam(本文下面简称为Seam)的出现,被认为和Spring框架存在着不同技术架构的竞争关系。对它们之间的关系出现了很多的
争论与取舍。这也许是一件好事,从另一面反映出了Java 社区的活力。
Seam的很多概念比较新,所以本文首先罗列了一些有价值的资源。然后以本项目的实践为基础,说明Seam从哪些方面简化了Java开发。
2. 认识Seam
Seam 2.0是2007年11月发布的,系统完整的中文资料可能还难以找到,你应该从阅读其发行包中的参考手册开始。不过,已经有人在
组织翻译Seam的参考手册,相信不久就会发表。
今年出版的《
JBoss seam : simplicity and power beyond Java EE》是必须阅读的一本好书。
从全局域管理的角度来认识Seam,我认为抓住了Seam的核心概念,让人有茅塞顿开的感觉。感谢zaya的这篇好
文章。
3. 元注解代替XML配置文件
每个Java开发人员对XML配置文件都不会陌生. 随着应用规模的扩大, XML配置文件的内容会随之膨胀, 带来管理上的困难. Seam用元注解(meta annotation)代替了XML配置文件。
例子1:
java 代码
- @Restrict
- @Name("hotelService")
- @AutoCreate
- public class HotelService extends BaseService {
- 。。。
例子2:
java 代码
- @Entity
- @Name("user")
- @Scope(SESSION)
- @Table(name="Customer")
- public class User implements Serializable
- {
- 。。。
- @Id
- public String getUsername()
- {
- return username;
- }
4. 对象的创建与应用代码分离
应用不再由new关键字或者Class.forName()来创建(组件的)对象。我们来对比一下。
在没有使用Seam框架的程序中,外观类或控制器类中,要调用服务类的方法,必须先创建服务类的实例,这样做:
java 代码
- private UserService _userService = null;
-
- private void createUserService() {
- if (_userService == null)
- _userService = new UserService();
- }
-
- public FormValidateResult changePassword(int userId, String currentPassword, String newPassword, String newPassword2, HttpSession session) {
- createUserService();
- return _userService.changePassword(userId, currentPassword, newPassword, newPassword2, session);
- }
用了Seam框架后,我们可以这样做:
java 代码
- @In private UserService userService;
-
- public void changePassword(String newPassword) {
- userService.changePassword(newPassword);
- }
借助@In元注解,我们需要的服务类对象(userService),Seam框架会自动创建并送来。
5. 类即对象
这一点在
zaya文章中有很精彩的描述。动态类型语言(如Ruby、JavaScript等)的特点就是模糊了对象和类之间的区别。对于开发人员来说,在Seam框架下编程,因为总是在与已经实例化的对象打交道,所以给人的感觉好像总是在调用类中的静态方法。
6. 层之间不再需要用接口来连接
用接口(interface)来隔离不同层,被认为是提高软件可维护性的好的做法。但是,在大多数情况下,它所带来的好处却远远没有给开发效率的影响来得大。
如果你用POJO作为Seam的组件,那么你无需编写相应的接口就能直接访问不同层的组件。
7. 无依赖扩展
这一点在
zaya文章中也有很精彩的描述。本项目中的 com.divo.core.misc.ExtendedIdentity 类就是一个很好的例子:
java 代码
- @Name("org.jboss.seam.security.identity")
- @Scope(SESSION)
- @Install(precedence = APPLICATION)
- @BypassInterceptors
- @Startup
- public class ExtendedIdentity extends Identity {
- 。。。
通过 @Install(precedence = APPLICATION) 元注解,能自动用 ExtendedIdentity 类替换掉 Seam 框架内建的 Identity 组件。
8. 双向注入
在操作当前登录用户信息时,双向注入给编程带来的好处是很明显的。用户登录成功后,传统的做法需要自己编程把用户信息存入 session:
java 代码
- public FormValidateResult login(String loginName, String password, boolean remember, HttpSession session, HttpServletResponse res) {
- ...
-
- CurrentLogin myLogin = CurrentLogin.newInstance(userId,userName,loginName);
- session.setAttribute(CurrentLogin.LOGIN_KEY, myLogin);
在需要当前登录用户信息时,再从session中取出:
java 代码
- CurrentLogin myLogin = (CurrentLogin) session.getAttribute(CurrentLogin.LOGIN_KEY);
用Seam框架编程,相同的功能这样实现(参见UserService.java类):
java 代码
- @In(required = false) User user;
-
- @Out(required = false, scope = SESSION)
- public User getUser() {
- return this.user;
- }
通过注出(@Out)元注解,使得登录成功后,无需写任何代码,就能自动将当前登录用户信息保存到会话域。而修改用户密码时,我们也不用写任何代码,Seam框架自动从会话域取出了当前登录用户对象给我们用。
9. 对话域
Seam框架为了解决会话域膨胀问题,引入了一个新的域,即对话域(conversation scope)。从现有设计来看,它主要是为了解决跨多个页面的请求的状态问题。客户端改用ExtJS后,跨多个页面的请求显然已经消失。
那么对话域是否还有用呢?从目前的实践来看,还不好下什么结论。所以我在这里先把问题提出来吧。
10. 安全性
Seam框架对安全性的考虑非常细致周到,本系列文章将有专门的一篇加以介绍。
11.不强制使用特定的架构
应用的规模和要求会有很多差异,用Seam框架可以选择使用EJB,也可以使用POJO without EJB。使用POJO后,仍然可以获得Seam框架提供的各种组件特性。
本项目就使用POJO without EJB这种轻量级的架构方案,并且设计了外观-服务分层架构,详细内容请参见本系列的下一篇文章。
12.结语
本人对Seam框架的学习和实践还是初步的,体会还比较粗浅。但是,Seam框架对Java开发的简化,的确是走出了很大的一步。
附:下面是本系列所有文章的完整列表:
(1)
下载示例项目并安装运行
(2)
建立Eclipse开发环境
(3)
熟悉项目中与JSF相关内容
(4)
重新认识JS
(5)
ExtJS之表单(Form)
(6)
ExtJS之布局(Layout)
(7)
ExtJS之网格(Grid)
(8)
Java后台和前台的通讯机制
(9)
Seam框架简化Java开发
(10)
分层架构设计
(11)
安全性
(12)
单元测试
分享到:
相关推荐
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码.part1 其他部分详见我的上传列表,全部分卷下载完成才能解压。 本书介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun...
经典JAVA EE企业应用实战 基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发.part2
经典Java EE企业应用实战:基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 part3
经典Java EE企业应用实战:基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 part2
经典JAVA EE企业应用实战 基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发个人认为是不错的书
经典JAVA EE企业应用实战 基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发。第三部分。
经典JAVA EE企业应用实战 基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发。第二部分。
《经典Java EE企业应用实战:基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发》介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun公司提供的JSF RI;EJB 3部分则包含Session Bean、Message Driven Bean的...
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码第3章 其他部分详见我的上传列表 本书介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun公司提供的JSF RI;EJB 3部分则包含...
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发 PDF 书籍 本书介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun公司提供的JSF RI;EJB 3部分则包含Session Bean、Message ...
经典Java EE企业应用实战:基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 part1
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码第10章 其他部分详见我的上传列表。 本书介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun公司提供的JSF RI;EJB 3部分...
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码第二章 其他部分详见我的上传列表。 本书介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun公司提供的JSF RI;EJB 3部分...
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码.part5 其他部分详见我的上传列表,全部分卷下载完成才能解压。 本书介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun...
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码第14章 其他部分详见我的上传列表。 本书介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun公司提供的JSF RI;EJB 3部分...
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码第9章 其他部分详见我的上传列表。 本书介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun公司提供的JSF RI;EJB 3部分则...
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码.part2 其他部分详见我的上传列表,全部分卷下载完成才能解压。 本书介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun公司...
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码.part3 其他部分详见我的上传列表,全部分卷下载完成才能解压。 本书介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun公司...
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码.part4 其他部分详见我的上传列表,全部分卷下载完成才能解压。 本书介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun...
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码第13章 其他部分详见我的上传列表。 本书介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun公司提供的JSF RI;EJB 3部分...