精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-20
最后修改:2009-01-20
1.4第一个用Seam实现的应用为了讲解Seam的一些核心工作原理,我将带你从头到尾地看一个管理高尔夫秘诀(golf tips)集合的基本应用。你不用担心所看到的不能完全理解,你主要关注的是Seam如何依靠注解定义组件、如何通过统一组件模型将应用层整合到一起以及由于配置特例(configuration by exception)使得在业务逻辑方面达到了“信号噪声比”(译者:言外之意应该是说通过配置例外使得开发者可以把精力主要放到业务上)。在这个例子中我介绍了大量的Seam特性,所以你不要认为要使用Seam就得掌握所有的这些技术。 我们都想成为一个更好的高尔夫球手(至少,那些喜欢用运动来折磨自己的人是这样的)。了解些打高尔夫的秘诀可以使你你在一轮当中少击几次球。为了跟踪记录你从文章或者从朋友的建议获得的秘诀,我们需要马上就拼凑一个能够从数据库读取这些秘诀的Seam应用。在这个例子中除了不用考虑部署应用之外,目前你只有少许文件,这些文件可以生成一个能够用的应用。 1.4.1实体类作为后端beans我先从GolfTip JPA实体类开始讲解,如列表1.1所示。在Seam应用中,实体类有两者用途。其主要作用就是应用程序与数据库之间传输数据。所谓的对象关系映射机制并不是Seam本身的一部分。这部分工作要么由JPA处理要么由Hibernate处理,但是在第八章你可以看到Seam可以启动ORM运行时并且管理ORM持久化管理器的生命周期。 在Seam应用中实体类的第二个作用是作为form “backing” beans(和Struts的ActionForm相似)捕获用户的输入,因此就不需要一个shallow “backing” bean类(译者:应该是不需要值对象了)。如果在类定义中有@Name注解,该类就会成为JSF视图中使用的候选者,图1.1中的GolfTip类已经满足了这个条件。然后你可以将表单输入直接绑定到实体类的属性上,由JSF处理必要的转换和验证。 带有@符号前缀的关键词是Java 5注解。加粗的@Name注释①是一个Seam注解,它表示将GolfTip类注册为名称是tip的组件。无论什么时候从Seam容器中请求上下文变量tip,Seam就会创建一个GolfTip类的新实例并将这个实例变量tip绑定到对话(conversation)上下文中(实体类的默认范围),并返回所请求的实例。 这个类中的其他注解和JPA相关。@Entity注解②把GolfTip类与同名的数据库表相关联。@Id注解③告诉JPA那个属性被用作主键。@GeneratedValue注解③表明由数据库自动生产主键。所有其他类属性(author、category、context)配置例外(configuration by exception)语法将被自动映射到GolfTip表中各个相同名称的字段。 如你所见,使用@Name注解使你少一份担忧(就是JSF受管bean功能和其冗长的XML方言)。远离受管bean配置是转移到Seam组件的初期的好处之一。另一个采用Seam的显著优点就是能够将UI命令组件的action绑定到一个事务性业务对象的方法上。 有了实体类,在Seam中就没有必要再创建一个受管bean作为在JSF页面和服务对象的中间人。相反,服务对象可以直接对UI中的一个动作做出响应。起初,你可能认为这不是个好注意,因为它好像会使UI和应用逻辑之间紧耦合。Seam通过扮演中间者角色防止了这种耦合。因此,action组件不必一定要包含对JSF资源的单个引用。实际上,在第三章你会发现方法的返回值不必作为导航规则的逻辑结果——这是JSF受管bean的典型要求——因为Seam可以计算出任意的EL值表达式。 在高尔夫秘诀应用中,图1.2中的TipAction类使用@Name注解将其声明为Seam组件,并且能够将其方法绑定到UI控件。在高尔夫秘诀接口中它处理了添加和删除操作。
像GolfTip实体类,@Name注解①将TipAction类标记为一个Seam组件,这次将其划分到event context(对于JavaBean组件是默认范围)。将@In注解放到类②的某个字段上可以注入其他组件到GolftTip类,所以可以使其与其他组件相分离,这种机制被称为双向注入。在这个例子中,有两个依赖组件JPA EntityManager和Seam的内建JSF消息管理器。这个组件也准备了一个GolfTip对象集合用于JSF视图中③;捕获用户在集合中选择的GolfTip,这样在处理事件的两个方法中以及后续视图④中都可以获取该对象;在JSF状态消息⑤中插入当前激活的GolfTip。 TipAction组件在一个有限的空间塞进了许多功能。我想让你了解的就是除了注解,在这个类中几乎没有基础结构代码的痕迹。除了创建状态消息,你唯一需要写的代码仅是读取、持久化以及使用JPA EntityManager实例从数据库中删除tips。可能是最好将这段代码放在一个也可以是Seam组件的数据访问对象(DAO)中,但是Sam不强制要求你使用这个结构。Seam的关注点是节约,就像这个例子中所示,没有任何用来获取请求参数或者设置请求或会话属性的Servlet API调用。取而代之的是,组件完全由业务逻辑组成。 seam in action 第一部分 1.4后半部分发到博客频道了,没发在java论坛。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 2260 次