`
lyx_2709
  • 浏览: 314622 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

寻找seam爱好者,一起探索seam

阅读更多
可能你有所耳闻,可能你一无所知。
这些都不重要,重要的是你想用它,探索它。最近接了一个小项目,没有什么太大的风险,想试用一下
,希望感兴趣的朋友,我们一起学习,一起进步。
我会把我所用到的,所查到的,全部转载到这个贴子上。也希望各位朋友,各位高手指点。让我们在短时间内,收获到更多。
分享到:
评论
8 楼 670884538 2009-03-04  
太好了 !! 我也是初学者希望共同研究!!
670884538@qq.com  [size=medium][/size][color=green][/color]
7 楼 gaoyide 2008-01-29  
http://www.iteye.com/topic/139250
6 楼 lyx_2709 2008-01-24  
以上的这些东东,都是转载自JBoss Seam中文站
一些需要去了解的内容,相关的技术文章就等待我们的探索了。
5 楼 lyx_2709 2008-01-24  
Seam能否取代Struts?
作者: Shashank Tiwari 翻译: Thomas 来源: O’Reilly

作者简介: Shashank Tiwari(又名Shanky),Saven Technologies的首席架构师。有多年从事高性能应用程序设计和开发的经验。近年来,主要关注面向服务架构。他定期地在许多科技期刊上发表文章,并且常以开发者导师和架构师的身份出席研讨会。他同时也是开源软件的热心支持者。现和他的妻子以及两个儿子居住在美国纽约。

摘要: 本文分析了JBoss Seam有望取代Struts成为Java Web应用框架”下一个王者”的原因,并且指出了Spring和Google Web工具包的不足。

时至今日,Apache Struts仍旧是最受欢迎的Java Web应用框架。然而,对于新的应用开发,它显得有些过时,并且存在很多不足。

目前已经出现了几个有望取代Struts的框架,但是还没有最终的胜利者。你认为谁会当之无愧地成为领导者呢?如果你是一个Java Web应用程序的开发者,你会选择哪种框架呢?

目前已经有了很多受欢迎的Web UI技术,包括富界面、AJAX、RIA和其他一些相似的技术。

然而,在服务器端仍然只有Java——Java中有许多基于JSP和Servlets的、流行的服务器端技术。许多时候,这些服务器端技术需要和客户端的富界面技术一起使用。

举例来说,许多开发人员将AJAX与新生代的Java Web框架JSF合并起来一起使用;还有些开发人员通过Java远程调用库、开源或者商业代码来调用JavaScript和ActionScript,用于远程访问服务器端。

这是否意味着,我们需要应用一个像Apache Shale那样,可以很好地和JSF工作的框架呢?这是否意味着,我们只需要根据Web应用中的Java部分,只使用远程访问包和Servlets呢?或者意味着,我们应该使用一个包含两者的框架,例如,JBoss Seam?

在回答这些问题之前,让我们先关注一下另外一个问题:了解Sun究竟在说什么。

不幸的是,在这点上,Sun没有明确的信息。它有三种战略,并且在同一时间,它说出了全部这三种。它们是:

1. JSF——基于规范的服务器端组件,用于加强早期的Servlets和JSF模型。

2. Swing——用于Web的、以虚拟机为基础的解决方案。在”富界面时代”,应该有这样一个领导者,毕竟它诞生于10年前。但是,不幸的是,它落伍了。Swing应用框架被誉为能使Swing复活的”救世主”。但是,我不认为这能”破冰”。

3. JavaFX——目前主要是在新闻上会提到它,而实际应用还是很少。富Web应用框架包含手机、网站和任何其他接口,这就是答案所在。而只有时间才能告诉什么会变成它。我的观点是,在做更多事情之前,Sun已经使开发者们兴奋起来。所以,在开发者们感到失望并且离开这个阵营之前,它实际上可能是一个奇妙的选择。

现在,我们有了这些信息,但是我对Sun的方向却产生了困惑,我们应该选择哪种作为Web应用技术呢?

我的观点是,Swing会败下阵来(或许Swing技术是伟大的,但是要改变这一印象,还有大量的工作需要做);JavaFX在当前阶段只是一个承诺,在很长时间内,它的真正特性不会变得明朗起来;

因此,唯一可行的选择是JSF。当然,JSF自身有一系列的问题。但是,像Seam这样的框架和包含ICEfaces这样的AJAX组件,将会是一个好的选择。

此外,使用Seam这样的框架,你不需要依赖于JSF,并且你甚至可以使用它来远程访问Java服务器端的纯JavaScript(例如,Dojo工具包)或者Adobe Flex应用。JSF 2.0和JavaServlets 3.0也即将推出,两者的推出将会对之前的版本有大大的改进。

在我们结束讨论,并且有点倾向于使用Seam作为选择的框架之前,还有两个选择值得考虑——Spring和Google Web工具包。

如果你已经在服务器端使用了Spring,将会发现Spring是一个伟大的选择,项目组里的每个人都知道Spring很棒!

然而,Spring在很多方面,偏离了Java EE标准,但是我建议紧跟标准。

有趣的是,Seam可以和Spring工作在一起,并且Spring beans可以被用作Seam组件。

Google Web工具包是一个充满想象力的工具,它通过把Java代码转换成JavaScript来抚慰Java开发者们。我认为它像”技术摇滚明星”一样吸引了许多开发人员的关注。目前,它也在被大量采用。

然而,它不是一个完整的Web框架。

有趣的是,它也可以和Seam工作在一起。所以,我不认为今天还有什么能够好过Seam?!

JBoss Seam或许不是100%的答案,也或许还没有达到Apache Struts所达到的级别。但是,它已经在领跑了,并且毫无疑问的是,它将继续领跑,除非有新的选择出现。

审校:Richard
转载自JBoss Seam中文站
4 楼 lyx_2709 2008-01-24  
选择Seam的十大理由
翻译: 双鱼瓶 来源: JBoss

摘要: 本文从多角度、较全面地总结了Seam的优势。

一、增加AJAX特征的最快捷方式
在功能上,Ajax改变了Web的交互模型。传统Web客户端所使用的同步、粗粒度的请求,引发了很多服务器端应用吃掉少量的缓存,并且没有带来缓存级别的并发操作。

许多情况下,”无状态”的架构只是基本的解决方案,却远远不够!Ajax客户端通过很多异步、并行、细粒度的请求和服务器连接,使开发人员可以轻易地连接和获取远端”数据库”信息。

可是如果状态在交互时被保存到内存,并行相关的bugs将会非常危险,因为Java EE平台并不处理会话级别的并发。

最初设计的时候,Seam被构想成在Ajax基础上,整合并行模型和状态管理模型。

Seam1.1整合了许多基于JSF的开源Ajax解决方案,像ICEfaces和Ajax4JSF,同时加入了Seam的状态和并行管理引擎。开发人员可以轻松地在程序中应用Ajax,甚至不需要学习JavaScript;并且将远离单独使用Ajax时潜在的bugs和性能问题。

二、开始使用EJB 3.0的最简单方式
EJB 3.0是成熟的事务组件模型,也是最新JPA(Java持久层API)关注的技术,但支持EJB 3.0的Java Web应用框架却很少。这样,你需要去写自己的整合代码。但在大多数情况下,开发人员整合的方式并不能充分利用EJB 3.0的优势。

EJB 3.0是Seam使用的核心技术,你可以无处不在地使用整合的EJB 3.0组件模型。因为在Seam应用中,每个类都是一个EJB组件。你甚至不用写任何整合代码,即可”美化”你的框架。

当然,你也可以选择不使用EJB 3.0,JBoss Seam使你”鱼与熊掌可兼得”。

三、充分挖掘JSF特性的最佳方式
JSF已经有许多组件库和插件以供使用,也当之无愧地成为Java界最有吸引力的Web开发框架。但是JSF过度地依赖于XML配置,并且创建丰富网页界面的特性并不多。

Seam将使用注解的方式代替繁琐的XML配置,减少代码量的同时也提高了开发效率。

Seam在很多方面扩展了JSF的功能:包括多窗口操作、工作空间管理、基于模型的验证、基于jBPM的页面流、国际化和页面分段缓存等等。

Seam甚至还加入了控制标签化页面的机制。

JSF没有涉及访问事务资源,Seam考虑到了这一点,将JTA、JPA和EJB 3.0与JSF无缝地整合起来。

四、实现业务流程管理(BPM)的最简单方式
jBPM是用于解决存在复杂人员协作或者复杂用户交互的Web应用程序的解决方案。

BPM技术不仅方便开发人员和分析人员建模、应用以及优化业务过程,而且可以在整个操作和管理过程中评估业务流程的效率和发掘业务流程中会出现的问题。

Seam深度整合了jBPM,使用jBPM进行任务管理和页面流管理将变得异常简单。

Seam和jBPM的结合将使一些项目的开发时间减少一个月左右。

五、使得CRUD同样简单
Seam也同样处理复杂企业应用中的棘手问题:增删改查。但这并不意味着解决的方式会很难上手。

在创建数据驱动的应用中,Seam将整合现有易用的数据层框架,包括JPA、Hibernate等,使开发人员可以通过一些数据库反向工程工具和命令行工具高效地开发数据库应用。

六、持久层工作将是”小菜一碟”
Seam来源于Hibernate社区,由Hibernate创始者Gavin King设计和开发。

Seam会话模型解决了传统无状态的Web应用架构导致的持久层相关问题。无论你是使用Hibernate还是JPA,Seam使用扩展的持久化上下文都将使开发变成简单,同时也可以使开发人员避免在集成环境下使用持久化上下文时不必要的状态重复。

七、注解功能
Seam是第一个从始至终、从持久层到表示层,都使用Java 5注解功能的程序模型。

你将不会再因为繁琐的XML配置而感到迷失方向。同时在Seam中,开发人员也可以使用XML,Seam为此提供了成熟的基于XML的组件配置机制。

八、为自动化集成测试而喝彩
任何项目都需要自动单元测试,但是仅仅依靠单元测试是十分危险的。许多的bugs出现在组件之间或者组件和容器的交互过程中。单元测试无法捕捉容器的行为,也无法捕捉组件间的交互。

Seam引入了一种新方式:”自动化集成测试”。你可以模拟每个请求或者会话的全部业务流,来测试应用中从持久层到表示层的所有Java代码。

九、开放性标准与开源的结合
Seam建立在实现开放标准的、像JSF和 EJB 3.0这样的开源项目基础上,并且整合了其他优秀的开源项目,如Hibernate、jBPM、Facelets、Drools等等。

Seam的缔造者们都是EJB、JPA、Bean验证和JSF等领域的专家组成员,并且领导过制定Web Beans规范(JSR-299)的专家组–用于将Seam里的一些想法带入Java EE标准中。

Seam项目是完全建立在”致力于Java平台的创新和提高”的开源项目理念上的开源框架。

十、快速上手
只要你试用它,就会爱上它!

转载自JBoss Seam中文站

3 楼 lyx_2709 2008-01-24  
JBoss Seam:一个深度集成框架(三)
作者: Michael Yuan 翻译: Richard 来源: TSS

作者简介: Michael Yuan,技术专家,《JBoss Seam: Simplicity and Power Beyond Java EE》、《Lightweight Java Web Application Development》等书的作者,软件顾问,目前就职于JBoss。

摘要: 本文介绍了JBoss Seam如何集成业务流程、使用iText和任务调度,并且总结了Seam编程模型中的关键要素。

本文是《JBoss Seam:一个深度集成框架》一文的最后一部分。

在Web应用中集成业务流程
大部分企业级应用存在许多业务流程和规则。例如,在一个简单的电子商务网站(以”在线购物”为例)中,客户登录后进行购物流程,商店管理人员登录后进行审批流程,仓库职员登录后进行发货流程。不同的人员站在不同的角度,去执行不同的任务,然而,他们又同时合作完成同一个业务场景。

在企业级应用中,业务分析人员通常定义业务流程和规则。他们使用专业的业务流程软件绘制这些流程和规则,然后应用开发人员实现这些设计。

然而,由于大部分Web应用框架没有集成流行的业务流程和规则引擎,开发人员只能通过自己的方式进行业务流程的整合。这样势必会造成开发人员和业务分析人员工作的脱节,使得业务分析人员很难去审核和验证。

Seam通过jBPM和JBoss Rules(以前的Drools)对业务流程和规则的整合提供了极好的支持。

在Seam应用中,你可以指定UI动作(例如按钮点击)来触发业务流程。你只需要通过@CreateProcess注解来标记UI事件处理方法。业务流程是不同的用户以相应顺序来完成的一系列任务。你可以用@BeginTask和@EndTask标注任务的开始和结束。当前任务结束时,jBPM引擎将自动把进程前移,进行下一个任务。

@Name(”ticketSystem”)

public class TicketSystemAction {

@CreateProcess(definition=”TicketProcess”)

public String newTicket() {

return “home”;

}

@BeginTask

public String reply() {

return “reply”;

}

@EndTask

public String sendAnswer() {

System.out.println(”Answered”);

return “home”;

}

}

Seam让每个用户可以查看他/她的当前任务列表以及完成任务的下一个动作。这些任务列表是基于当前登录的用户角色生成的,并且通过用户认证和授权的方式紧密地整合到Seam安全框架中。

<h1>Assigned Tickets - #{login.user.username}</h1>

<h:dataTable value=”#{taskInstanceList}” var=”task”>

<h:column>#{task.description}</h:column>

<h:column>Title: #{ticket.title}</h:column>

<h:column>

<h:commandLink action=”#{ticketSystem.reply}”>

<h:commandButton value=”Reply”/>

<f:param name=”taskId” value=”#{task.id}”/>

</h:commandLink>

</h:column>

</h:dataTable>

在整合jBPM/JBoss Rules的Seam应用中,开发人员可以直接使用Seam注解和组件驱动业务流程和规则引擎,而不需要单独掌握特定的jBPM和JBoss Rules的Java APIs。

使用iText生成不同的视图
iText库是一套被广泛用于生成PDF文档的开源Java库。然而,使用iText API创建PDF文档是十分耗时的(想想用DOM创建XML文档或者用Swing写UI的经历)。

Seam整洁地整合了iText、JSF和Facelets,开发人员可以通过和生成JSF页面一样简单的方式,将动态的内容生成PDF页面,你甚至可以在PDF页面中使用模板。

Seam为PDF元素创建了特殊的XHTML标记库,然后在生成页面的时候透明地调用iText。下面的示例显示了如何在Seam应用中,生成有数字签名支持的PDF页面。

<p:document … title=”Why Seam” keywords=”mykeyword”

subject=”seam” author=”Seam Team” creator=”Seam PDF example app”>

<p:image alignment=”right” wrap=”true” value=”/jboss.jpg” />

<p:font size=”24″><p:paragraph spacingBefore=”16″ spacingAfter=”40″>

Order #{currentOrder.orderId}

</p:paragraph></p:font>

<p:paragraph>Dear #{currentOrder.customerName},</p:paragraph>

<p:paragraph>… </p:paragraph>

<p:barCode type=”code128″ code=”My BarCode” />

<p:signature field=”My Signature” size=”200 200 400 400″ />

</p:document>

通过代码,我们可以看到整合是无缝的,页面不依赖于iText。实际上,将iText替换成其他的商业PDF库,页面仍然可以工作,这就是Seam整合的魅力。

高级任务调度程序
在许多企业级应用中,对自动重复任务的支持是相当重要的。在标准的EJB中,你可以使用EJB Timer API在固定的时间间隔内调度重复的事件。然而,在实际的应用中,我们需要比固定的时间间隔触发更高级的调度服务。

目前流行的开源Java调度库是Quartz库。但是如果要使用Quartz的话,开发人员仍需要自己写”胶水”代码来整合Quartz特定的APIs和对象模型。

Seam整合了Quartz,用于调度异步重复任务。你只需要在重复工作的方法上添加@Asynchronous注解。你可以传入任务的开始/结束时间、间隔或者克龙表达式(cron string)的字符串作为参数,也可以在方法定义中注解这些特定目的的参数。指定的方法将返回QuartzTriggerHandler对象,你可以稍后使用这个QuartzTriggerHandler对象暂停或取消任务,你也可以将这个QuartzTriggerHandler对象保存到数据库,以供稍后使用。

@Asynchronous

public QuartzTriggerHandle schedulePayment(

@Expiration Date when,

@IntervalCron String cron,

@FinalExpiration Date stoptime

… any other call parameters …) {

// do the repeating or long running task

}

下面的例子中,schedulePayment()方法设定在下午2点10分和三月每个星期三的下午2点44分运行。你可以在Web UI事件处理方法中加入这段调用的代码,这样当按钮按下时,重复事件将被安排到调度程序中。

QuartzTriggerHandle handle =

processor.schedulePayment(payment.getPaymentDate(),

“0 10,44 14 ? 3 WED”,

payment.getPaymentEndDate(),

payment);

payment.setQuartzTriggerHandle( handle );

// Save payment to DB

// later …

// Retrieve payment from DB

// Cancel the remaining scheduled tasks

payment.getQuartzTriggerHandle().cancel();

从例子可以看出,开发人员不需要手动启动Quartz调度程序、创建Quartz触发器和任务,而只需要使用Seam注解POJOs就可以了。

统一的编程模型
目前为止,我们已经介绍了很多Seam通过一致的编程模型整合不同框架的例子。除了上面介绍的这些,还有许多其他的框架。但是限于篇幅,我们不可能介绍所有的框架。下面我们将总结一下Seam整合这些框架的方法。Seam编程模型中关键的三要素是:

注解POJOs:Seam应用中所有的Java组件都是注解的POJO类。Seam通过双向依赖注入管理它们之间的交互。除此之外,Seam中没有其他的组件模型。

XHTML显示页面:所有视图(UI)页面都是通过XHTML文件显示出来,除去标准JSF标签,Seam还定义了许多自己的UI标签,包括PDF UI标签等。Seam同时也加入了Ajax JSF库,比如Ajax4jsf、RichFaces和IceFaces。

表达式语言:XHTML页面通过JSF表达式语言(EL)引用Seam中的Java组件。Seam增强了标准的EL语法,使它支持方法参数等,并且使EL可以用于所有的XML配置文件和测试脚本。

有了这些Cool的特性,Seam的编程模型将变成异常简便。只要有一些JSF基础,你的学习曲线将非常平坦。

下载Seam,看看实例,快乐地编写Seam代码,一切就这样简单!

审校:骆驼

转载自JBoss Seam中文站

2 楼 lyx_2709 2008-01-24  
JBoss Seam:一个深度集成框架(一)
作者: 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中文站

1 楼 lyx_2709 2008-01-24  
« JBoss Seam:一个深度集成框架(一)JBoss Seam:一个深度集成框架(三) »
JBoss Seam:一个深度集成框架(二)
作者: Michael Yuan 翻译: Richard 来源: TSS

作者简介: Michael Yuan,技术专家,《JBoss Seam: Simplicity and Power Beyond Java EE》、《Lightweight Java Web Application Development》等书的作者,软件顾问,目前就职于JBoss。

摘要: 本文介绍了JBoss Seam如何在JSF中进行JPA延迟加载和Hibernate验证以及JBoss Seam对Ajax的支持。

本文是《JBoss Seam:一个深度集成框架》一文的第二部分,JBoss Seam中文站将在近期发布该文的第三部分。

支持在JSF中进行JPA延迟加载
ORM框架重要特征之一就是支持相关对象的”延迟加载”。没有延迟加载,即使简单的对象查询也有可能顺带出大量数据到结果集中,因为在映射对象图中,可能所有的表都是潜在关联的。

例如,在显示订单列表的Web应用程序中,你可能需要在控制器中查询订单对象。然后,当页面被加载后,你可能需要显示列表中相应的条目。

在页面加载的时候,我们将”延迟加载”订单条目到订单对象中,而不会在控制器中查询订单对象时,就将所有与订单关联的对象都加载到订单对象中。

然而,在传统的MVC框架中应用”延迟加载”可不是一件容易的事情。在Seam之前的MVC框架中,控制器会在持久化环境中通过会话在事务中运行查询,然后在事务提交时关闭会话。所以,当控制器退出、网页显示完成后,持久化环境将变成不可用状态。

这样,在以前的MVC框架中,如果想在显示页面中试图”延迟加载”数据,持久化引擎将抛出”lazy initialization exception”异常。

你可以通过”Open Session In View”模式实现”延迟加载”--在页面生成阶段保持持久会话。但是应用这种模式,需要在Web框架和持久层框架之间编写大量的整合代码。

Seam默认支持”Open Session In View”。所有的Seam组件,除了EJB3中的无状态会话Beans以外,都是有状态的。在开始从UI事件调用数据库操作一直到响应页面生成期间, Seam将维持一个打开的持久会话。在Seam应用中,开发人员不需要编写额外的代码来实现”延迟加载”。

在JSF输入页面中支持Hibernate验证
在多层企业级应用中,Web框架和ORM持久层框架通常会有不同的数据验证机制。Web框架在Web表单被提交时验证用户输入,而持久层框架在保存数据进数据库之前验证数据。在大多数情况下,它们显得多余。

Seam允许你在实体Beans中直接注解数据验证约束,这样使用与实体Beans相联系的JSF输入框时,同样的验证约束将应用于输入数据。

下面的例子中,Person对象的名字必须由两个单词组成,并且年龄必须在3到100岁之间。

@Entity

@Name(”person”)

@Table(name=”extperson”)

public class Person implements Serializable {

private long id;

private String name;

private int age;

@Id @GeneratedValue

public long getId() { return id;}

public void setId(long id) { this.id = id; }

@NotNull

@Pattern(regex=”^[a-zA-Z.-]+ [a-zA-Z.-]+”,

message=”Need a firstname and a lastname”)

public String getName() { return name; }

public void setName(String name) {this.name = name;}

@NotNull

@Range(min=3, max=100,

message=”Age must be between 3 and 100″)

public int getAge() { return age; }

public void setAge(int age) { this.age = age; }

}

下面的JSF页面将自动”包装”一些验证逻辑。如果用户提交无效值,将重新显示页面,同时高亮显示无效的字段。

<s:validateAll>

Your name:<br/>

<s:decorate>

<h:inputText value=”#{person.name}”/>

</s:decorate>

Your age:<br/>

<s:decorate>

<h:inputText value=”#{person.age}”/>

</s:decorate>

</s:validateAll>

你可以通过简单的JSF facets和CSS样式配置这些高亮显示的错误信息。也可以在无效字段前加入有CSS样式修饰的错误提示图片。如下所示,当验证失败时,<s:message/>将显示验证注解中的信息属性。

<f:facet name=”beforeInvalidField”>

<h:graphicImage styleClass=”errorImg” value=”error.png”/>

</f:facet>

<f:facet name=”afterInvalidField”>

<s:message styleClass=”errorMsg” />

</f:facet>

<f:facet name=”aroundInvalidField”>

<s:div styleClass=”error”/>

</f:facet>

使用基于Ajax的JSF控件,你无需提交任何表单,就可以进行输入字段的验证。

多种方式使用Ajax
作为一个现代的应用程序框架,Seam为Ajax应用提供了最好的支持。

在Seam中,你可以通过很多方式使用Ajax。初学者可以使用Seam集成的Ajax JSF组件包,比如Ajax4jsf、RichFaces和IceFaces。它们提供了一系列Ajax功能的JSF控件,包括输入框、数据表格、交互面 板、拖放面板等,你可以直接将它们用在你的页面上。这些Ajax控件允许你开发Ajax Web应用程序,而无需写一行JavaScript代码。Seam已经帮你做好了所有和Ajax整合的工作,使得建立Ajax应用比在单纯的JSF环境中 更容易。下面的例子显示了如何使用Ajax数据输入框,当你离开输入框时,数据将被验证,同时无效的字段将高亮显示。

<s:validateAll>

Your name:<br/>

<a4j:outputPanel id=”nameInput”>

<s:decorate>

<h:inputText value=”#{person.name}”>

<a4j:support event=”onblur” reRender=”nameInput”/>

</h:inputText>

</s:decorate>

</a4j:outputPanel>

Your age:<br/>

<a4j:outputPanel id=”ageInput”>

<s:decorate>

<h:inputText value=”#{person.age}”>

<a4j:support event=”onblur” reRender=”ageInput”/>

</h:inputText>

</s:decorate>

</a4j:outputPanel>

</s:validateAll>

考虑到开发人员想直接使用JavaScript取代JSF控件,Seam同样也整合了JavaScript和服务器端组件。你可以像调用本地 JavaScript方法一样调用Seam组件的方法并且在本地使用返回值。开发人员也可以通过Seam服务整合其他流行的JavaScript库。例 如,下面的代码显示了如何通过Seam组件整合Dojo的”内嵌文本编辑器”,当你双击”Hello World”文本时,将出现内嵌的文本编辑器;编辑完成后,输入值将被传回服务器处理。

<script language=”javascript”>

// Seam.Remoting.setDebug(true);

// don’t display the loading indicator

Seam.Remoting.displayLoadingMessage = function() {};

Seam.Remoting.hideLoadingMessage = function() {};

// Get the “manager” Seam component

var manager = Seam.Component.getInstance(”manager”);

function init () {

var commentEditor = dojo.widget.byId(”comment”);

commentEditor.onSave = submitComment;

}

function submitComment (newValue, oldValue) {

manager.setComment (newValue);

}

dojo.addOnLoad(init);

</script>

<div id=”comment” dojoType=”inlineEditBox”>Hello Seam</div>

下面代码显示了通过JavaScript远程调用访问Manager组件。

@Name(”manager”)

public class Manager {

@In @Out

private Person person;

public void setComment (String comment) {

person.setComment (comment);

}

… …

}

转载自JBoss Seam中文站

相关推荐

    seam_carving 代码实现 seam

    2. **寻找最佳路径**: 在确定能量函数后,算法会在图像中寻找一条能量最低的“拉链”(即 seam),这条拉链将沿着图像的垂直或水平方向穿过。在垂直方向上,拉链的每一像素与上一行的像素相对应,而在水平方向上,...

    JBOSS SEAM组件中文手册

    “Seam_2.0_Reference_zh_CN”中文参考手册是学习Seam的重要资料,涵盖了Seam的各个方面,包括安装、配置、组件使用、事件处理、安全控制等,对于初学者和进阶开发者都极具价值。结合实际项目实践,将理论知识与实践...

    jboss seam 2.0 中文手册

    整理自jboss seam 中文站,压缩为chm格式,便于广大jboss seam爱好者阅读,所有版权归jboss seam中文站所有。

    为Seam做好准备

    "为Seam做好准备"这个标题暗示我们即将探讨的是关于Seam框架的入门与准备工作。Seam是一个Java EE集成框架,它将JavaServer Faces(JSF)、Java Persistence API(JPA)、Enterprise JavaBeans(EJB)3.0以及其他...

    seam in action 中文 english

    《Seam in Action》是一本专门探讨Seam框架的书籍,该书分为中文和英文两个版本,对于初学者和有经验的开发者来说都是一个宝贵的资源。Seam是一个强大的Java EE框架,它集成了多种技术,如JavaServer Faces (JSF)、...

    MATLAB_Seam_Carving_seamcarving_

    MATLAB_Seam_Carving_seamcarving_ 是一个与图像处理相关的项目,主要涉及到一种称为“seam carving”的技术,这是一种动态图像调整大小的方法,它可以在不改变图像整体视觉效果的情况下,增加或减少图像的宽度和...

    seam的注解和标签

    Seam是一个Java EE框架,它将JavaServer Faces(JSF)、Java Persistence API(JPA)、Inversion of Control(IoC)和Enterprise JavaBeans(EJB)等技术融合在一起,为开发复杂的Web应用程序提供了便利。在Seam框架...

    seam需要的jar包

    Seam框架是一个全面的Java企业级应用开发框架,它整合了JSF(JavaServer Faces)、EJB、CDI(Contexts and Dependency Injection)以及许多其他Java EE技术,为开发者提供了强大的组件模型和丰富的功能,旨在简化...

    jboss-seam2.0文档

    它将EJB、JSF、CDI(Contexts and Dependency Injection)、JPA(Java Persistence API)等多个技术融合在一起,使得开发者可以更加专注于业务逻辑,而不是底层技术的实现。 1.2 功能亮点 - 组件模型:Seam组件是可...

    Seam - 语境相关的组件

    Seam的核心理念是将不同的技术,如JavaServer Faces (JSF)、Java Persistence API (JPA)、Enterprise JavaBeans (EJB)以及Java Message Service (JMS),无缝融合在一起,创建一个统一的开发环境。 在"Seam - 语境...

    Seam Carving的C++实现代码

    Seam Carving是一种图像内容感知的尺寸调整方法,它能够在保持图像主要结构不变的情况下,智能地减少或增加图像的宽度和高度。这种方法是由Amit Agarwal和Matthieu Salzmann于2007年提出的,其核心思想是通过找到...

    seam_seamcarving_

    MATLAB是一种广泛用于科学计算、图像处理和数据分析的编程环境,因此这个代码可能包含了一系列的函数和方法,用于读取图像、计算能量图、寻找最优路径以及执行像素的增删操作。 首先,Seam Carving的实现通常包括...

    seam级联菜单例子

    Seam是一个开源的Java EE框架,它将JavaServer Faces(JSF)与EJB3、Hibernate等技术结合在一起,提供了一种更为简化的企业级开发方式。在这个“seam级联菜单例子”中,我们将深入探讨如何在Seam应用中实现级联选择...

    Seam 资源

    **Seam资源详解** 在Java开发领域,JBoss Seam是一个极具影响力的技术框架,它为开发者提供了简化企业级应用开发的强大工具。...如果你正在寻找提高Java EE开发效率的方法,那么深入研究Seam将是一个值得考虑的选择。

    Jboss Seam 三本最受欢迎的教材

    这本书是面向初学者的,从基础开始介绍Seam,包括安装配置、基本架构、页面导航、安全机制、事务管理等多个方面。书中提供了丰富的实例,帮助读者快速上手并掌握Seam开发的基本技巧。 还有一份《seam_reference...

    seam+hibernate注册例子

    Seam和Hibernate是两个在Java开发中非常重要的框架。Seam是一个全面的、集成的Java EE框架,主要用于简化企业级应用的开发,而Hibernate则是一个强大的对象关系映射(ORM)框架,它允许开发者用Java对象来操作数据库...

    seam 框架整合hibernate+jsf

    通过这些特性,Seam成功地将复杂的业务逻辑、持久化和用户界面融合在一起,为开发者提供了高效、灵活且易于维护的开发环境。在实际项目中,利用Seam整合Hibernate和JSF,可以大大提高开发效率,同时保持代码的清晰和...

    jboss-seam2.1

    Seam 是一种业级 企 Java 的应规用程序框架。它的灵感源自下列原 : 只有一种“工具” Seam为 应 业务业业 义 种统 组 你的 用程序中所有的 定 了一 一的 件模型。 Seam组件可能是 态义 关关 态 有状 的,包含与几...

    Seam in Action

    《Seam in Action》这本书深度探讨了JBoss Seam这一轻量级Java EE 5.0框架,它旨在简化企业级应用程序的开发,提供了一种整合各种技术的强大方式。Seam的核心理念是消除Java EE组件之间的摩擦,使得开发过程更为流畅...

    seam_in_action

    seam in action seam in action seam in action seam in action seam in action seam in action seam in action

Global site tag (gtag.js) - Google Analytics