论坛首页 Java企业应用论坛

JBoss Seam:一个深度集成框架(二)

浏览 2836 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-11-14  

作者: 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/

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics