`
fangzhouxing
  • 浏览: 211586 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JBoss Seam (POJO without EJB) 后台 + ExtJS 前台完整例子(九)

阅读更多

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 代码
  1. @Restrict
  2. @Name("hotelService")
  3. @AutoCreate
  4. public class HotelService extends BaseService {
  5. 。。。

例子2:
java 代码
  1. @Entity
  2. @Name("user")
  3. @Scope(SESSION)
  4. @Table(name="Customer")
  5. public class User implements Serializable
  6. {
  7. 。。。
  8. @Id
  9. public String getUsername()
  10. {
  11. return username;
  12. }

4. 对象的创建与应用代码分离

应用不再由new关键字或者Class.forName()来创建(组件的)对象。我们来对比一下。

在没有使用Seam框架的程序中,外观类或控制器类中,要调用服务类的方法,必须先创建服务类的实例,这样做:
java 代码
  1. private UserService _userService = null;
  2. private void createUserService() {
  3. if (_userService == null)
  4. _userService = new UserService();
  5. }
  6. public FormValidateResult changePassword(int userId, String currentPassword, String newPassword, String newPassword2, HttpSession session) {
  7. createUserService();
  8. return _userService.changePassword(userId, currentPassword, newPassword, newPassword2, session);
  9. }

用了Seam框架后,我们可以这样做:

java 代码
  1. @In private UserService userService;
  2. public void changePassword(String newPassword) {
  3. userService.changePassword(newPassword);
  4. }

借助@In元注解,我们需要的服务类对象(userService),Seam框架会自动创建并送来。

5. 类即对象

这一点在zaya文章中有很精彩的描述。动态类型语言(如Ruby、JavaScript等)的特点就是模糊了对象和类之间的区别。对于开发人员来说,在Seam框架下编程,因为总是在与已经实例化的对象打交道,所以给人的感觉好像总是在调用类中的静态方法。

6. 层之间不再需要用接口来连接

用接口(interface)来隔离不同层,被认为是提高软件可维护性的好的做法。但是,在大多数情况下,它所带来的好处却远远没有给开发效率的影响来得大。

如果你用POJO作为Seam的组件,那么你无需编写相应的接口就能直接访问不同层的组件。

7. 无依赖扩展

这一点在zaya文章中也有很精彩的描述。本项目中的 com.divo.core.misc.ExtendedIdentity 类就是一个很好的例子:

java 代码
  1. @Name("org.jboss.seam.security.identity")
  2. @Scope(SESSION)
  3. @Install(precedence = APPLICATION)
  4. @BypassInterceptors
  5. @Startup
  6. public class ExtendedIdentity extends Identity {
  7. 。。。

通过 @Install(precedence = APPLICATION) 元注解,能自动用 ExtendedIdentity 类替换掉 Seam 框架内建的 Identity 组件。

8. 双向注入

在操作当前登录用户信息时,双向注入给编程带来的好处是很明显的。用户登录成功后,传统的做法需要自己编程把用户信息存入 session:

java 代码
  1. public FormValidateResult login(String loginName, String password, boolean remember, HttpSession session, HttpServletResponse res) {
  2. ...
  3. CurrentLogin myLogin = CurrentLogin.newInstance(userId,userName,loginName);
  4. session.setAttribute(CurrentLogin.LOGIN_KEY, myLogin);

在需要当前登录用户信息时,再从session中取出:

java 代码
  1. CurrentLogin myLogin = (CurrentLogin) session.getAttribute(CurrentLogin.LOGIN_KEY);

用Seam框架编程,相同的功能这样实现(参见UserService.java类):

java 代码
  1. @In(required = false) User user;
  2. @Out(required = false, scope = SESSION)
  3. public User getUser() {
  4. return this.user;
  5. }

通过注出(@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)单元测试
分享到:
评论
1 楼 duyunfeng 2009-02-06  
请加下我好吗?我QQ:329139017

相关推荐

Global site tag (gtag.js) - Google Analytics