苏格兰风笛

一个人是穷人还是富人,主要取决于"出身、运气和努力",这些因素中最不重要的因素就是努力!

xia ID:xymyeah
132500次访问,排名587好友0人,关注者1
xymyeah的文章
原创 49 篇
翻译 0 篇
转载 273 篇
评论 25 篇
xymyeah的公告
xymyeah@163.com
技术之家圈子http://blog.csdn.net/group/xymyeah欢迎加盟
最近评论
RickeyShao:不错,整好需要
jack803:假设a = 10000001, a>>>2,a>>2 结果都是32?
jack803:你好,为什么我用计算机运行出来的 >>>2 和 >>2 结果完全一样?谢谢
AndyJee:没有内容就是最大的内容?我什么也看不见啊……
qpzkzp:Wow gold
文章分类
收藏
相册
神话空间
AJAX
ajax特效
icefaces
Java开源 AJAX开发组件
jQuery中文社区
jsf ajax
blog收藏
baggio785的专栏
blueroc收藏
firebody
gembin
Java对Xml进行解析
jdom详解
JFreeChart
langhua opencms
opencms
opencms
干煸四季豆
滴水的能量
电信网管
CORBA
Brief Tutorial on CORBA
CORBA Technology and the Java Platform
EJB3.0
EJB3.0开发指南
EJB3Trail
Enterprise JavaBeans 3.0, 5th Edition
IBM
MyEclipse EJB Project 快速开始
hibernate
hibernate中文网站
hibernate官方网站
xdoclet Hibernate Tags
j2ee
cms4j
cms4j blog
ComponentReference
freemarker
ireport
javaeye tapestry
javatang(ajax等)
Jmesa(分页工具)
open source cms mmbase
quartz
Struts-menu
struts标记库
subersion eclipse
Tapestry中文文档
Tapestry中文文档
老高
J2ME
java application
Java swing tutorial
JViews Telecom Graphic Objects
JavaScript
google个性主页的拖拽效果的js
JavaScript高级教程
Java基础
java jar包下载
java在线API
java线程并发包util.concurrent的研究
NetBeans IDE官方教程
Thinking in Patterns with Java(中文版)
中文版jdk API
文件对比工具
JBOSS
JBoss Web Services
JOSS工具箱
JSF、Groovy、Drools
Drools
JSF in javaeye
JSF中文论坛
Liferay
Liferay Portal 系列文章
Liferay个人收集
Liferay英文站点
liferay论坛
Seam
3-ways-to-easy-ajax-in-seam-jsf-facelets-prelude
JavaEye Jboss Seam
Jboss Seam
JBoss Seam中文站
jboss seam开发
Seam - 无缝集成 JSF
Seam 2.0 Reference中文翻译
SEAM 安装和版本说明
seam-next-gen-web-framework/
Spring
Acegi 扩展开发
acegi官方网站
Acegi文档翻译与笔记
AppFuse
Security Acegi
springside 中文
Spring中文网站
Spring官方网站
Spring开发参考手册
Spring聚集
UML
jude
RUP 学堂
WebServices
AppFuseXFire
Java Technology and Web Services
Java Technology and Web Services - Documentation
Learn technology
SOA
SOA and Web services IBM
SOA专家群
SOA专题
Web Services Code Samples
电信
ctiforum
Essential SNMP, 2nd Edition
openvoip
中国网管联盟
通信专业门户
通信技术
工作流
Jboss JBPM
JBoss jBPM 3.1
JBPM
JBPM Group
jBPM开发入门指南
osworkflow
开源社区
cas
Cindy
数据库
Oracle® Database PL/SQL User's Guide and Reference
PL/SQL User's Guide and Reference
xsb Oracle Blog
甲骨文学(oracle)
网络
Getting Started with JCR
JCR示例项目
JSR 170
NetBios, NetBEUI, NBF, SMB, CIFS Networking
perforce
Slide
项目管理
CMMI ON LINE
IT项目管理 企业级项目管理
IT项目管理专题
JAVAEYE软件开发和项目管理版
Sunspl技术管理
thoughtworks
如何快速学习CMMI?
开发文档网
项目管理资源网
杂记
opengroup
月光博客
存档
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

转载 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中文站
[ http://www.jbossseam.com/ ]
本文链接地址:http://www.jbossseam.com/2007/11/03/introduction-to-jboss-seam-part2/

 

发表于 @ 2007年12月17日 11:26:00|评论(loading...)|编辑

新一篇: JBoss Seam:一个深度集成框架(三) | 旧一篇: 纯做技术是自娱自乐 抛开技术做技术才是出路

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © xymyeah