作者: 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中文站
[ http://www.jbossseam.com/ ]
本文链接地址:http://www.jbossseam.com/2007/11/03/introduction-to-jboss-seam-part2/
分享到:
相关推荐
### 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是JBoss公司推出的一个开源框架,它构建在JSF和EJB3之上,为开发者提供了一个情境化应用开发的环境。Seam框架简化了企业级应用的开发过程,通过引入情境、事件和转换等概念,使得复杂业务逻辑的处理变得...
JBoss Seam是一款开源的企业级应用框架,它以其深度集成的能力而闻名。这个框架的设计目标是简化Java EE(现在称为Jakarta EE)开发,通过提供一个统一的环境来整合各种技术和组件,如JavaServer Faces (JSF)、Java ...
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)的基础上提供...
Seam不仅仅是一个集成框架,它还提供了自己的状态管理机制,通过注解和EL表达式实现与其他框架的深度整合。Seam对ORM(对象关系映射)的支持尤为突出,尤其是在处理持久化上下文的生命周期中,避免了ORM常见的问题,...
JBoss Seam 2 是一个全面的、集成的开发框架,主要用于构建企业级Java应用程序。它在Java EE 5平台上运行,旨在简化开发过程,提高开发效率。Seam的核心理念是将各种技术如JavaServer Faces (JSF)、Enterprise ...
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)等技术,为开发者提供了一个统一的...