精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-11-14
作者: Michael Yuan 翻译: Richard 来源: TSS 摘要: 本文介绍了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中文站 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 2836 次