作者: Michael Yuan 翻译: Richard 来源: TSS
作者简介: Michael Yuan,技术专家,《JBoss Seam: Simplicity and Power Beyond Java EE》、《Lightweight Java Web Application Development》等书的作者,软件顾问,目前就职于JBoss。
摘要: 本文介绍了JBoss Seam的产生背景以及集成框架的概念,并且演示了在JBoss Seam中如何使用POJOs处理JSF事件以及实现双向依赖注入。
本文是《JBoss Seam:一个深度集成框架》一文的第一部分,JBoss Seam中文站将陆续发布该文的其他部分。
JBoss Seam的产生背景
软件框架对于企业级Java开发者来说,是非常有用的工具。它们被广泛地用来组装可重用的软件组件和服务。
每个框架都提供了一系列的设计模式、APIs和组件模型——用于构建在框架之上的应用程序。许多受欢迎的Java EE框架的实例,既包括Hibernate、Spring和Struts这样的开源项目,又包括基于Servlet/JSP、JSF、EJB、 JMS、Web Services等标准实现的产品。
一个典型的企业级Java应用程序,可以同时使用多个框架。所以,Java EE开发者们的主要竞争能力之一,就体现在使用这些框架的能力上。
然而,存在太多框架的缺点在于,每一种框架都提供了不同的编程模型(或组件模型)。而要在一个Web应用中使用不同的组件模型,开发人员一般需要写很多”胶水”代码(例如数据传输对象、组件管理等)以及”胶水”配置文件,这样将会大大地降低开发效率。
在这种背景下,作为”集成框架”的Seam应运而生。Seam的目标就是减少这些”胶水”代码,整合现有的各种框架,为企业级应用提供一个一致的编程模型。
什么是集成框架?
Java EE本身就可以被认为是一个集成框架。它定义了不同的框架,如Servlet/JSP、JSF、EJB、JMS、JTA,、JCA等,并使它们在企业级应用中携手合作。
但是作为标准规范的Java EE由于自身的设计问题,导致发展非常缓慢。新的理念和前沿技术在成为Java EE标准之前,通常都已经作为开源项目出现了。
Spring框架是另一个被广泛应用的集成框架。Spring对许多现有的框架提供了轻量级的封装,开发人员可以通过配置XML文件来管理应用程序 中的组件。但是开发人员仍需要自己混合和匹配多个不同的组件编程模型;另外,Spring “大量XML配置”的方式也因为包含太多的”XML代码”而变得繁琐。
Seam是一个开源的”深度集成”框架,它试图吸收Java EE和Spring世界中的精华为己所用。
Seam牢牢地扎根于Java EE标准:JSF和EJB3。
Seam的最初目标是为了解决JSF和EJB3中的一些设计缺陷。随后,Seam的许多核心特性被采纳为将来的官方Java EE标准,例如JSF 2.0和WebBeans。随着越来越多的用户开始采用Seam,它已经远远超过Java EE的范畴。
Seam走了一条与早期的Spring框架不同的路。Seam为被它集成的所有框架提供了一个统一的组件模型,开发人员可以使用统一的Seam组件,而不需要学习每个独立框架的组件管理APIs。
对于开发人员来说,Seam API与被Seam集成的框架相比,有非常大的改进。Seam的注释(annotation)/API设计和Java EE5非常相似。
Seam集成的框架可能成为”幕后工作者”。在某些情况下,你在使用Seam的同时,却要”奔波”在其它相互竞争的框架之中–与Java EE允许相同的API有多种实现是同样的方式。
现在,所有关于集成方面的论述都显示乏味和抽象。下面,我们将通过一些简单的例子让你深刻地体会到Seam是如何使开发变得轻松容易的。
运用EJB3 Beans或POJOs处理JSF事件
Seam最初引人注目的特性就是直接使用EJB3作为JSF的Backing Beans。
JSF和EJB3都是Java EE的关键技术,然而,Java EE却没有很好地整合这两个框架。它们具有不同的组件模型:JSF使用基于POJOs的”Backing Beans”处理UI事件,并且需要进行大量的XML配置;EJB3使用注释型POJOs表示持久层和业务逻辑,只需要简单的XML配置。
一般情况下,如果要在JSF页面中进行数据库操作,需要写JSF Backing Beans去处理UI事件,然后调用EJB3会话Bean中的方法。
因此,如果开发人员需要在Backing Beans和EJB3 Beans之间传递复杂的数据,通常需要在这些框架中创建DTOs(数据传输对象)。这样,整合JSF和EJB3框架将成为繁琐的事情。
在Seam中,你可以直接使用EJB3 Beans作为JSF的Backing Beans。举个例子,下面的JSF页面引用一个名为”echo”的Seam组件。当用户点击Echo按钮时,页面将会把输入变成大写形式,并显示在页面上。
My name is: <h:inputText value=”#{echo.name}”/><br/>
Hello #{echo.name} <br/>
<h:commandButton type=”submit” value=”Echo”
action=”#{echo.toUpperCase}”/>
如果你还不是很熟悉JSF,下面将介绍一下页面代码是如何工作的:
当服务器生成页面的时候,#{echo.name}被替换成echo对象中getName()方法的返回值。当你点击Echo按钮时,服务器首先调用setName()方法将输入框的值填入#{echo.name},然后调用toUpperCase()方法。
#{…}格式的表达式语言( EL)是Seam编程模型中的关键组件,因为它不仅可以在网页中使用,也可以在任何的文本环境中使用,比如XML配置文件、流程/规则定义、测试脚本等,我们将在后面介绍这些。
在单纯的JSF中,echo组件将被作为JSF的Backing Beans。而在Seam中,我们可以直接使用EJB3 bean(或简单的POJO)来实现该组件。你只需要通过@Name将组件注释成相应的名字。当存在Web请求时,Seam用”echo”名字创建一个 EchoBean实例,并将所有输入数据传递给它,调用相应的方法;最后当响应返回时销毁这个组件。在这个过程中,你不需要写XML代码或有关对象生命周 期管理的代码。
@Stateful
@Name(”echo”)
public class EchoBean implements EchoInt {
private String name;
public String getName () { return name; }
public void setName (String name) { this.name = name; }
public void toUpperCase () { name = name.toUpperCase (); }
@Remove destroy () {}
}
当然,对于这个简单的应用,EJB显得有些太臃肿。EJB需要接口、方法和注释。最简单的方法是写一个POJO类,然后在这个类上面加上@Name注释就可以了。
@Name(”echo”)
public class EchoPojo {
private String name;
public String getName () { return name; }
public void setName (String name) { this.name = name; }
public void toUpperCase () { name = name.toUpperCase (); }
}
在Seam中,注释POJOs可以完全取代EJB3中的会话Beans,我们将在后面的内容中使用Seam POJOs。
双向依赖注入
我们将通过一个多组件交互的例子,来领略一下Seam的组件管理能力。
页面由与实体Bean相联的输入框、与POJO相联的按钮和由List对象构成的数据表格组成:
Your name: <h:inputText value=”#{person.name}”/><br/>
<h:commandButton type=”submit” value=”Say Hello”
action=”#{manager.sayHello}”/>
<h:dataTable value=”#{fans}” var=”fan”>
<h:column>
<h:outputText value=”#{fan.name}”/>
</h:column>
</h:dataTable>
下面是Person实体Bean和管理类POJO:
@Entity
@Name(”person”)
public class Person implements Serializable {
private long id;
private String name;
@Id @GeneratedValue
public long getId() { return id;}
public void setId(long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
@Name(”manager”)
public class Manager {
@In @Out
private Person person;
@Out
private List <Person> fans;
@In
private EntityManager em;
public String sayHello () {
em.persist (person);
person = new Person ();
fans = em.createQuery(”select p from Person p”)
.getResultList();
return null;
}
}
在管理类POJO中,当sayHello()方法运行时,person组件被注入(inject);当方法退出时,fans组件被注出(outject)。
同样地,JPA实体管理类也可以被注入,提供对数据库的支持。注入和注出(双向依赖注入)可以在当前页面请求范围内同时发生。所以在sayHello()方法使用用户输入的#{person.name}值的同时,fans的值也将在结果页面中显示。
双向依赖注入让我们可以利用简单的注释来管理组件间的复杂关系。
从集成的角度来看,这个例子过于简单。Person实体Bean直接联系UI元素。实际上,实体Bean仅仅是一个Seam组件,你也可以用它来连接UI行为(例如点击按钮)。
这样,不同框架的组件之间的”独裁统治”将被打破;更远点说,如果在实体Bean中加入对业务逻辑的支持,就能够建立包括数据和行为的富领域模型。
富领域模型在OOP中已经被实现,但是在Seam之前,还没有被Web框架使用。
审校:骆驼
原创文章如转载,请注明:转载自JBoss Seam中文站
[ http://www.jbossseam.com/ ]
本文链接地址:http://www.jbossseam.com/2007/11/01/introduction-to-jboss-seam-part1/
分享到:
相关推荐
### JBoss Seam:一个深度集成框架 #### 一、JBoss Seam 的产生背景及意义 JBoss Seam 是一款由 JBoss 提供的开源框架,它致力于解决 JavaEE 应用程序开发过程中面临的诸多挑战,尤其是当涉及到多个不同框架时所...
本书聚焦于JBoss Seam框架,旨在为读者提供一个全面、深入的理解,以掌握其在企业级应用开发中的应用与优势。 ### JBoss Seam框架概览 JBoss Seam是一个开源的应用框架,它基于Java EE标准,但通过引入一系列创新...
Seam不仅仅是一个集成框架,它拥有自己的状态管理机制,允许框架之间通过注解和EL表达式实现深度整合。Seam的开发者对第三方框架有着深刻的理解,因此能够更好地将它们融合在一起,而不仅仅是简单的拼接。例如,Seam...
JBoss Seam 是一个开源的企业级开发框架,它旨在简化Java EE应用的开发过程,特别是在Web和富互联网应用程序(Rich Internet Applications, RIA)领域。Seam 2.0是其重要的版本,提供了许多增强的功能和改进,为...
【JBoss教程及深入浅出JBoss+Seam】是一个针对企业级Java应用服务器JBoss的深度学习资源,其中包含了两个主要部分:JBoss教程和对JBoss与Seam框架结合使用的详细介绍。这两个主题都是Java开发人员在部署和管理企业...
JBoss Seam是一款开源的企业级应用框架,它以其深度集成的能力而闻名。这个框架的设计目标是简化Java EE(现在称为Jakarta EE)开发,通过提供一个统一的环境来整合各种技术和组件,如JavaServer Faces (JSF)、Java ...
JBoss Seam是JBoss公司推出的一个开源框架,它构建在JSF和EJB3之上,为开发者提供了一个情境化应用开发的环境。Seam框架简化了企业级应用的开发过程,通过引入情境、事件和转换等概念,使得复杂业务逻辑的处理变得...
JBoss Seam 2.0 是一个全面的企业级Java开发框架,旨在简化Java EE(现在称为Java EE)应用程序的构建过程,尤其是在集成各种技术和处理业务逻辑方面。Seam 提供了一个统一的模型,允许开发者用一种更直观的方式来...
JBoss Seam 是一个开源的Java框架,它旨在简化企业级Java应用程序的开发。Seam 提供了一种整合的开发环境,融合了JavaServer Faces (JSF)、Java Persistence API (JPA)、Enterprise JavaBeans (EJB) 3.1、Contexts ...
SEAM还深度集成了JSF,通过Facelets提供了更强大的模板引擎和页面构建机制。 #### 基于Facelets的JSF Facelets作为JSF的视图层技术,极大地简化了页面的构建和布局。以下是一个使用Facelets创建JSF应用的基本步骤...
Seam框架是一个全面的Java企业级开发框架,它在2005年由JBoss公司推出,主要用于简化Java EE应用的复杂性,特别是整合了JSF(JavaServer Faces)、EJB、CDI(Contexts and Dependency Injection)等技术。Seam框架的...
在Java开发领域,JBoss Seam是一个极具影响力的技术框架,它为开发者提供了简化企业级应用开发的强大工具。"Seam 简洁与力量超越Java EE"这个主题,揭示了Seam如何在Java Enterprise Edition(Java EE)的基础上提供...
JBoss Seam 2 是一个全面的、集成的开发框架,主要用于构建企业级Java应用程序。它在Java EE 5平台上运行,旨在简化开发过程,提高开发效率。Seam的核心理念是将各种技术如JavaServer Faces (JSF)、Enterprise ...
Seam不仅仅是一个集成框架,它还提供了自己的状态管理机制,通过注解和EL表达式实现与其他框架的深度整合。Seam对ORM(对象关系映射)的支持尤为突出,尤其是在处理持久化上下文的生命周期中,避免了ORM常见的问题,...
Seam是由JBoss公司开发的一个集成框架,旨在简化Java EE(Java Platform, Enterprise Edition)应用的开发,尤其是在处理会话管理和组件集成方面。这本书的翻译版为中国开发者提供了一种深入理解和掌握Seam技术的...
而Seam则是一个轻量级、集成的Java EE框架,它简化了开发过程,特别是在处理富互联网应用程序(Rich Internet Applications, RIA)时。 首先,我们要理解JBoss的核心特性。JBoss支持EJB(Enterprise JavaBeans)、...
Seam框架在Java EE平台的基础上构建,它通过集成JSF(JavaServer Faces)、EJB(Enterprise JavaBeans)、JPA(Java Persistence API)和CDI(Contexts and Dependency Injection)等技术,为开发者提供了一个统一的...