??xml version="1.0" encoding="utf-8" standalone="yes"?>第一福利在线,久久久成人av,日韩香蕉视频 http://www.aygfsteel.com/bingle/category/14552.html最大的喜?zhn)Q莫q于技术的q步 Q?
坚定梦想Q毕生追? zh-cn Wed, 11 Apr 2007 14:14:18 GMT Wed, 11 Apr 2007 14:14:18 GMT 60 [转]Ibatis开发Demo http://www.aygfsteel.com/bingle/archive/2007/04/11/109931.html冰浪 冰浪 Wed, 11 Apr 2007 08:08:00 GMT http://www.aygfsteel.com/bingle/archive/2007/04/11/109931.html http://www.aygfsteel.com/bingle/comments/109931.html http://www.aygfsteel.com/bingle/archive/2007/04/11/109931.html#Feedback 0 http://www.aygfsteel.com/bingle/comments/commentRss/109931.html http://www.aygfsteel.com/bingle/services/trackbacks/109931.html 阅读全文 ]]> [转]Z不用spring、struts2、easyjweb{开源框?/title> http://www.aygfsteel.com/bingle/archive/2007/04/11/109876.html冰浪 冰浪 Wed, 11 Apr 2007 05:25:00 GMT http://www.aygfsteel.com/bingle/archive/2007/04/11/109876.html http://www.aygfsteel.com/bingle/comments/109876.html http://www.aygfsteel.com/bingle/archive/2007/04/11/109876.html#Feedback 1 http://www.aygfsteel.com/bingle/comments/commentRss/109876.html http://www.aygfsteel.com/bingle/services/trackbacks/109876.html 阅读全文 ]]> [转]Java EE 5.0能取代StrutsQSpring和Hibernate吗? http://www.aygfsteel.com/bingle/archive/2007/03/28/107059.html冰浪 冰浪 Wed, 28 Mar 2007 12:32:00 GMT http://www.aygfsteel.com/bingle/archive/2007/03/28/107059.html http://www.aygfsteel.com/bingle/comments/107059.html http://www.aygfsteel.com/bingle/archive/2007/03/28/107059.html#Feedback 0 http://www.aygfsteel.com/bingle/comments/commentRss/107059.html http://www.aygfsteel.com/bingle/services/trackbacks/107059.html 阅读全文 ]]> [转]Struts2与Struts1的对? http://www.aygfsteel.com/bingle/archive/2007/01/15/93966.html冰浪 冰浪 Mon, 15 Jan 2007 07:33:00 GMT http://www.aygfsteel.com/bingle/archive/2007/01/15/93966.html http://www.aygfsteel.com/bingle/comments/93966.html http://www.aygfsteel.com/bingle/archive/2007/01/15/93966.html#Feedback 0 http://www.aygfsteel.com/bingle/comments/commentRss/93966.html http://www.aygfsteel.com/bingle/services/trackbacks/93966.html Action c? ?Struts1要求Actioncȝ(h)承一个抽象基cRStruts1的一个普遍问题是使用抽象cȝE而不是接口? ?Struts 2 Actioncd以实C个Action接口Q也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类d?常用的接口。Action接口不是必须的,M有execute标识的POJO对象都可以用作Struts2的Action对象? U程模式: ?Struts1 Action是单例模式ƈ且必LU程安全的,因ؓ(f)仅有Action的一个实例来处理所有的h。单例策略限制了(jin)Struts1 Action能作的事Qƈ且要在开发时特别心(j)。Action资源必须是线E安全的或同步的? ?Struts2 Action对象为每一个请求生一个实例,因此没有U程安全问题。(实际上,servlet容器l每个请求生许多可丢弃的对象,q且不会(x)D性能和垃圑֛攉题)(j)
Servlet 依赖: ?Struts1 Action 依赖于Servlet API ,因ؓ(f)当一个Action被调用时HttpServletRequest ?HttpServletResponse 被传递给executeҎ(gu)? ?Struts 2 Action不依赖于容器Q允许Actionq容器单独被测试。如果需要,Struts2 Action仍然可以讉K初始的request和response。但是,其他的元素减或者消除了(jin)直接讉KHttpServetRequest ?HttpServletResponse的必要性?
可测? ?试Struts1 Action的一个主要问题是executeҎ(gu)暴露?jin)servlet APIQ这使得试要依赖于容器Q。一个第三方扩展Q-Struts TestCaseQ-提供?jin)一套Struts1的模拟对象(来进行测试)(j)? ?Struts 2 Action可以通过初始化、设|属性、调用方法来试Q“依赖注入”支持也使测试更Ҏ(gu)?
捕获输入: ?Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须l承一个基cR因为其他JavaBean不能用作ActionFormQ开发者经常创建多余的cL莯入。动态BeanQDynaBeansQ可以作为创ZlActionForm的选择Q但是,开发者可能是在重新描q?创徏)已经存在的JavaBeanQ仍然会(x)D有冗余的javabeanQ? ?Struts 2直接使用Action属性作入属性,消除?jin)对W二个输入对象的需求。输入属性可能是有自??属性的rich对象cd。Action属性能够通过web面上的taglibs讉K。Struts2也支持ActionForm模式。rich对象cdQ包括业务对象,能够用作输入/输出对象。这UModelDriven Ҏ(gu)简化了(jin)taglib对POJO输入对象的引用?
表达式语aQ? ?Struts1 整合?jin)JSTLQ因此用JSTL EL。这UEL有基本对象图遍历Q但是对集合和烦(ch)引属性的支持很弱? ?Struts2可以使用JSTLQ但是也支持一个更强大和灵zȝ表达式语aQ-"Object Graph Notation Language" (OGNL).
l定值到面QviewQ? ?Struts 1使用标准JSP机制把对象绑定到面中来讉K? ?Struts 2 使用 "ValueStack"技术,使taglib能够讉KD不需要把你的面QviewQ和对象l定h。ValueStack{略允许通过一pd名称相同但类型不同的属性重用页面(viewQ? cd转换Q? ?Struts 1 ActionForm 属性通常都是Stringcd。Struts1使用Commons-Beanutilsq行cd转换。每个类一个{换器Q对每一个实例来说是不可配置的? ?Struts2 使用OGNLq行cd转换。提供基本和常用对象的{换器?
校验Q? ?Struts 1支持在ActionForm的validateҎ(gu)中手动校验,或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容Q但不能校验子对象? ?Struts2支持通过validateҎ(gu)和XWork校验框架来进行校验。XWork校验框架使用为属性类cd定义的校验和内容校验Q来支持chain校验子属?
Action执行的控Ӟ(x) ?Struts1支持每一个模块有单独的Request ProcessorsQ生命周期)(j)Q但是模块中的所有Action必须׃n相同的生命周期? ?Struts2支持通过拦截器堆栈(Interceptor StacksQؓ(f)每一个Action创徏不同的生命周期。堆栈能够根据需要和不同的Action一起用?br />
]]>[转]刚刚出炉?Q-QJSF1.2新特?/title> http://www.aygfsteel.com/bingle/archive/2006/12/21/89205.html冰浪 冰浪 Thu, 21 Dec 2006 02:11:00 GMT http://www.aygfsteel.com/bingle/archive/2006/12/21/89205.html http://www.aygfsteel.com/bingle/comments/89205.html http://www.aygfsteel.com/bingle/archive/2006/12/21/89205.html#Feedback 0 http://www.aygfsteel.com/bingle/comments/commentRss/89205.html http://www.aygfsteel.com/bingle/services/trackbacks/89205.html 注:(x)此文{载自dev2devQ?a >http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=35942 最新翻译的Q?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) JSF1.2技术的新特性ȝ 本文的主要内容:(x) (tng) (tng) (tng) (tng) “Web Tier to Go With Java EE 5”系列文章中Q“JSF1.2新特性”是W一。就像在文中表述的一PJSP技术的优势随着JSF技术的发展得到?jin)进一步的扩大Q这U优势是通过l一EL表达式徏立v来的。统一JSP的框架也是JSF1.2技术中众多重要成W之一Qƈ在JSR252规范下进行开发。除?jin)这些变化?f)QJSF技术还贡献?jin)大量的重要的容易用的?gu)。这文章简要的描述一些重要的基本Ҏ(gu),大概有如下几点:(x) * l一JSP技?br /> (tng) * 改进自定义信息的支持 * 提供状态保存特?br />* 能够关闭自动生成lg客户端ID * 新的setPropertyActionListener标签 《JavaServer Faces规范》的前言部分提供?jin)一l完成的Ҏ(gu)描q?br /> l一JSP技术:(x) (tng) (tng) (tng) (tng) (tng) JSP和JSF技术相对立的核?j)是它们之间的页面生命周期的不同。在以前的文章中已经介绍?jin)JSP规范QJSP规范指出Q页面的元素被执行显C时QJSP支持单一的“渲染-响应”生命周期, 然后立即渲染面。JSF的生命周期分成了(jin)多个阶段Q当一个组件树(wi)被创建完毕,lg的数据就?x)被处理Q然后组件被渲染q显C在面上。然而,一个JSF面q不需要在执行后立x(chng)染。因此,在JSP面上用的JSFlg被渲染时Q有时候ƈ不是按照正常的顺序完成,而且?x)丢q件的一些状态或者其他的问题?sh)生?br />q么文章涉及(qing)到JSP2.1的新Ҏ(gu)。这里会(x)从一?个方面详l的介绍JSF技术的改进的地方:(x) * 首先JSFlg支持JSTL的forEach标签 * 改进treelg创徏Ҏ(gu)和内容组l?br />* 反对只用JSF技术的ELQ赞成用统一的EL (tng) (tng) (tng) (tng) (tng) (tng) 首先JSFlg支持JSTL的ForEach标签像在描qJSP技术新Ҏ(gu)的文章中表q的一PJava EE web层中的统一EL的一个新Ҏ(gu)就是:(x)q代标签Q例如JSTL的forEach能够在JSFlg中直接用。例如,使用输入lg构徏一个简单的表格Q可以通过下列代码来实玎ͼ(x) <table> <tr> <th>Item Name</th> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <th>Item Price</th> <th>Item Quantity</th> </tr> <c:forEach var="item" items="#{shoppingCart.items}"> <tr> (tng) (tng) (tng) (tng) (tng) (tng) (tng) <td><h:outputText value="#{item.name}" /></td> (tng) (tng) (tng) (tng) (tng) (tng) (tng) <td><h:outputText value="#{item.price}" /></td> (tng) (tng) (tng) (tng) (tng) (tng) (tng) <td><h:inputText value="#{item.quantity}" /></td> </tr> </c:forEach> <h:commandButton value="update quantities" action="update" /> </table> 没有l一使用ELQ?q几乎是不可能实现的?br /> 改进treelg创徏Ҏ(gu)和内容组l?br /> (tng) (tng) (tng) (tng) (tng) (tng) 在Hans Bergsten的《article about the use of JavaServer Faces technology with JSP pages》文中写到的Q合用JSP代码和JSF标签有时候会(x)产生预期不到的结果。例如,在下面的代码中,JSF lgoutputText输出的文本内容“Hi”本来应该在文本内容“what’s your name?”前面显C:(x) <h:panelGroup> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <h:outputText value="Hi. "/> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) What's your name? (tng) (tng) (tng) (tng) (tng) </h:panelGroup> 然而,q两行代码的输出是顺序是相反的。是什么导致了(jin)问题的发生?JSF的实现是以JSP的渲染引擎来渲染lg?wi)的。因为JSP?x)立x(chng)行ƈ把静(rn)态文本内Ҏ(gu)在response中,?lt;panelGroup>的子节点标签直到相应的结束标{?lt;/panelGroup>匚w后才?x)被渲染Q所以“what’s your name?”就?x)在“Hi”之前显CZ(jin)?br />像这L(fng)问题在Hans Bergsten的文中已l提到ƈ在JSF1.2版本中得C(jin)修改。解x(chng)案包括:(x)怎样改变lg?wi)的创徏、各U内容的处理和渲染等{。最重要的改变如下几点:(x) * 创徏和渲染组件树(wi)被分?步,Z(jin)防止JSP引擎q早的渲染页面内宏V?br />* 所有的渲染器的rendersChildren属性值现在已l设计ؓ(f)“true”,目的旉止联合组件的内容在各自的lg内部分别渲染?br />* 标签内部的静(rn)态内容对应的渲染器的rendersChildren属性D|ؓ(f)trueQ目的是获取q保存(sh)个短暂的UIOutputlgq把该组件添加到lg?wi)中?br />* 状态管理器从ViewTag中移C(jin)ViewHandler中,Z(jin)防止write State在实际保存过E中被调用?br /> (tng) (tng) (tng) (tng) (tng) (tng) 在接下来的“Web Tier to Go With Java EE 5”系列文章中?x)提供更多的关于描述lg?wi)的创徏和内容组l的l节Q这pJSF标签lg中用JSP代码成ؓ(f)?jin)可能?br /> 反对只用JSF的ELQ赞成用统一的EL (tng) (tng) (tng) (tng) (tng) (tng) 如本文前面的内容介绍QJSP和JSF的EL表达式会(x)整合成统一的EL。这意味着现在的JSF的EL是不推荐使用的。在介绍l一的EL前已l用了(jin)JSF开发的应用Q请务必做好h向后兼容的工作?br /> (tng) (tng) (tng) (tng) (tng) (tng) 然而,Z(jin)利用l一EL的特性,你可能需要改变原来自定应的组件和自定义的标签。要UL到统一ELQ首先要把ValueBinding换成ValueExpressionQ把MethodBinding换成MethodException。这些改变都相对的容易,而且q有更好的办法可以完成这些改变。例如,因ؓ(f)所有标准的标记属性都可以讉KD辑ּQ你的标记处理程序不需要检属性是可以接收、访问一个D辑ּ?br /> (tng) (tng) (tng) (tng) (tng) 要了(jin)解更多关于如何移植到l一EL的内容,请参见文章“Unified Expression Language?http://java.sun.com/products/jsp/reference/techart/unifiedEL.html) 改进易用性来支持自定义信?br /> (tng) (tng) (tng) (tng) (tng) JSF1.2技术的一个重要改q就是在JSF应用中增加自定义信息的能力。这个改q包括如下几个方面:(x) * 一l新的标准{换信?br />* 对输入组件提供了(jin)新的属性:(x)requiredMessage、converterMessage、validatorMessage * 入组件提供了(jin)新的label属性,允许lg的名字中包含错误信息 * 提供新的资源l定元素在应用中l定资源?br /> 一l标准的转换器信?br /> (tng) (tng) (tng) (tng) (tng) 以前的JSFl标准验证器提供?jin)一l标准的错误信息。版?.2增加?jin)标注{换器提供?jin)一l错误信息。要查看q些信息Q请参考JSF1.2规范(http://jcp.org/en/jsr/detail?id=252)的第2.5.2.4节?br /> 新属性:(x)requiredMessage,converterMessage,validatorMessage (tng) (tng) (tng) (tng) (tng) 很多情况下,标准的错误提CZ息很适合为我们的需要。如果不合适,我们可以使用自定义的信息来覆盖这些标准的信息Q要完成个目的,是通过输入lg的新属性requiredMessage、converterMessage、validatorMessage来完成?br /> (tng) (tng) (tng) (tng) (tng) 当你需要修改信息时Q新的特性允怽覆盖原有的信息。例如,假设你在userid和password2个域中用了(jin)验证长度的验证器。你希望一个错误信息提C“Userid必须?个字W”,另一个“Password必须?个字W”,但是你希望对q?个输入域使用同一个验证器。通过validatorMessage属性,你可以在适当的组件上讄Ҏ(gu)的信息,׃用ؓ(f)每个验证器实例提供单独的提示信息?br /> (tng) (tng) (tng) (tng) (tng) q些属性接收字W型的g?qing)D辑ּQ和JSF的标记属性一L(fng)工作原理。因此,你可以用D辑ּ来引用绑定资源中的信息,如下面的例子Q?br /><h:inputText value="#{customer.userID}" (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) validatorMessage="#{customMessages.userIdMessage}" > (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <f:validateLongRange minimum="9" maximum="9"/> (tng) (tng) (tng) (tng) </h:inputText> (tng) (tng) (tng) (tng) (tng) 像你猜想的一P输入lg的属性requiredMessageD盖了(jin)默认的信息提C。输入组件的属性converterMessageD盖了(jin)默认的{换信息提C。同L(fng)Q输入组件的属性validatorMessageg覆盖?jin)默认的验证信息提示?br /> (tng) (tng) (tng) (tng) (tng) 因ؓ(f)q种Ҏ(gu),面开发h员现在可以更为合适的提供错误的提CZ息。这P用户能够更准的直到错误的根源?br /> 输入lg的新属性:(x)label (tng) (tng) (tng) (tng) (tng) 输入lg的label新属性是另外一个帮助用L(fng)认错误信息的重要Ҏ(gu)。许多由lg产生的标准错误信息包括根据参数得到的信息。输入组件的label属性值是用来适当取代相关的默认信息的。例如,下面的信息是与DateTimeConverter相关的信息,用DATE_ID标识Q?br /> (tng) (tng) (tng) (tng) (tng) {2}: "{0}" could not be understood as a date. q就是说Q你有一个DateTimeConverter实例Qƈ与一个文本输入框l定。设|输入组件的label属性ؓ(f)BirthDate。如果用户在文本输入框中输入“older than the hills”,转换器就p|?jin)。当面再次被渲染的时候,用户p看到如下的信息提C:(x) (tng) (tng) (tng) (tng) (tng) Birth Date: "older than the hills" could not be understood as a date. (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) Labellg接受文本内容Q也接受D辑ּ。所以,在用其他的JSF标签属性时Q你可以使用表达式来引用l定的资源文件内宏V?br /> 新的资源配置元素 (tng) (tng) (tng) (tng) (tng) JSF1.2版本以前的规范,面开发h员(sh)用loadBundle标签来引用资源文Ӟ从而达到本地化的目的。在新的1.2版本中,面开发h员(sh)样可以在面中用资源绑定?br />更高效率的装载绑定好的资源,包括在应用系l的配置文g中用资源绑定元素进行注册资源的l定Q新的规范提供了(jin)一个很好的入口方式。下面的资源l定元素注册一个叫做“CustomMessages的ResourceBundlec,q个cd在应用系l的资源包里Q?br /><resource-bundle> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <var>customMessages</var> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <base-name>resources.CustomMessages</base-name> (tng) (tng) (tng) (tng) </resource-bundle> var子元素定义了(jin)资源引用名称Q页面开发h员在开发页面时可以采用如下的方式进行调用:(x) <h:outputText value="#{customMessages.myText}" /> (tng) (tng) (tng) (tng) (tng) 在这个例子中QmyText是定义在资源文件中Q我们要引用的信息的键(keyQ?br />通过q个新的资源l定元素Q我们可以在应用pȝ中绑定更多的资源文g。这样做Q新的元素的使用Q不仅消除了(jin)在多个页面用“loadBundle”绑定资源的方式Q而且大大提高?sh)(jin)性能Q因载资源是很“昂贵”的操作?br /> 提供状态保存特?br /> (tng) (tng) (tng) (tng) (tng) (tng) JSF1.2版本在状态管理方面主要有2个变化。一个变化是Q当应用pȝ使用多个框架QframeQ或者窗?window)Ӟ整合pȝ状态的不稳定问题;另一个变化是提供?jin)客L(fng)安全状态操作?br /> (tng) (tng) (tng) (tng) (tng) 在多框架或者多H口的应用中pȝ状态不E_的原因是q些复杂逻辑试图?x)把根视囄ID重复复制Q因此状态管理就变得混ؕ?jin)。在1.2版本中做?jin)一些修改,提供?jin)一些状态管理的API来解册个问题?br /> (tng) (tng) (tng) (tng) (tng) 首先Q在视图中的每一个窗口(WindowQ或者框ӞF(tun)rameQ都有唯一的ID标识Q这个ID标识是视图根ID和一个随x(chng)据联合组成,q保存在一个隐藏域中,用来q接H口QWindowQ或者框ӞF(tun)rameQ。ViewHandler中的writeStateҎ(gu)已经被修改,q用来生成唯一的IDQƈ且在JSF的“渲染-回应”阶D输出到客户端。另外,encodeEndҎ(gu)中,UIForm也被修改Q让它在输出“闭合标{䏀到客户端的q个q程之前调用writeStateҎ(gu)Q以便多表单QformQ的状态被保存?sh)来?br /> (tng) (tng) (tng) (tng) (tng) 同时Q在物理“渲染-回应“阶D,StateManager提供?jin)最新的saveSerializedViewҎ(gu)?x)用这个唯一的ID把对应的视图序列化到Session中。例如:(x)如果服务器崩溃了(jin)Q这些被保存的状态就能在另一个服务器中再ơ用。所以,“状态-保存”机制在JSF1.2版本在中被高度有效的支持。最后,ViewHandlercM的restoreViewҎ(gu)可以使用唯一的ID来标识恢复视图,即是在“恢复视䏀阶Dc(din)?br /> (tng) (tng) (tng) (tng) 另一个重要的规定Q就是允许对客户端进行加密,包括在发送一个关闭标{ֈ客户端之前。你可以选择声明的方式对客户端进行加?使用ClientStateSavingPasswordq个cM为加密方式的入口Q如下所C:(x) <env-entry> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <env-entry-name> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) com.sun.faces.ClientStateSavingPassword (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) </env-entry-name> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <env-entry-value>somePassword</env-entry-value> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <env-entry-type>java.lang.String</env-entry-type> (tng) (tng) (tng) (tng) </env-entry> (tng) (tng) (tng) (tng) (tng) (tng) 你提供的密码通常是生??对的方式q行加密。如果这个环境入口没有在配置文g中定义,q个加密Ҏ(gu)׃?x)被执行?br /> 关闭自动生成客户端组件ID的功?br /> (tng) (tng) (tng) (tng) (tng) JSF采用一U算法来生成客户端组Ӟ包含在Form中)(j)的表C号QIDQ,客户端组件的ID如下面的形式Q?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) [form ID]:[clientID] (tng) (tng) (tng) (tng) (tng) 面开发h员可以对指定ID的formlg或者包含在该form中的其他lgq行操作。如果页面开发h员没有指定form的IDh者组件的IDP那么pȝ?x)自动生成?br /> (tng) (tng) (tng) (tng) (tng) 早期版本的JSF规范没有规定q个法Q只要开发h员理解其工作原理够?jin)。此外,对于自定义的lg或者一个渲染类来说Q页面开发h员没办法定是否已经讄?jin)组件的客户端IDh者是否系lؓ(f)它们自动生成。最后,因ؓ(f)某种原因Q渲染器的开发h员可能无法改变它的名Uͼ但是仍然要在JavaScript中引用它?br /> (tng) (tng) (tng) (tng) (tng) 最后的JSF规范明确的说明了(jin)生成客户端组件ID的算法。我们可以在UIComponent的API文档中找到相关信息。由于UIFormlg增加?jin)prependId属性,相应的算法也做了(jin)变化。页面开发h员现在可以改变该属性的默认|默认gؓ(f)falseQ可以改为trueQ,q样p明可以不需要用Form的ID作ؓ(f)lgID的前~?jin)。下表格昄?jin)正常情况下生成客户端组件ID的不同点Q?br /> Table 1:客户端组件ID生成情况 场景 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) prependId=rue prependID=alse 开发h员没有设|ID (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) _id0:_id1 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) _id1 开发h员(sh)仅设|了(jin)form的ID myForm:_id0 _id0 开发h员只讄lgID (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) _id0:myComponent myComponent 开发h员对form和组仉讄?jin)ID myForm:myComponent myComponent 新标{setPropertyActionListener (tng) (tng) (tng) (tng) (tng) 除了(jin)actionListener标签之外Q允许我们给自定义的lg注册一个Action ListenerQ核?j)的标记库现在已l包括在setPropertyActionListener标记中。用q个标记注册一个特定的action listener到ActionSource实例中,q与具体的组件关联v来。当lg被激z,listener׃(x)把对象的引用存储到标记的属性中?br /> (tng) (tng) (tng) (tng) (tng) Z(jin)展示标记的用处,假设我们有一个forEach标记Qƈ且在其中使用?jin)commandButtonQ以?qing)用iterator来显CZl书的信息,代码如下Q?br /><c:forEach items="#{bookDBAO.books}" var="book" varStatus="stat"> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <c:set var="book" scope="request" value="${book}"/> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) ... (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <h:commandButton id="add" action="#{catalog.add}" (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) value="#{bundle.CartAdd}"> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <f:setPropertyActionListener (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) target="#{requestScope.book}" (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) value="#{book}"/> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) </h:commandButton> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <c:remove var="book" scope="request"/> (tng) (tng) (tng) (tng) </c:forEach> 当用L(fng)击buttonQ选择的book׃(x)增加到购物R中,q且昄下一c(din)?br />如果你熟(zhn)JSTLQ那你就直到forEach的var属性是在本面那有效的。然而,book的数据需要在request范围内有效,q样昄面Q点d转到的下一面Q才能范问到book的数据。因此,setPropertyActionListener标签通常用来把当前(bookQ对象设|ؓ(f)request讉K范围内?br /> (tng) (tng) (tng) (tng) (tng) (tng) 在这个例子中QsetPropertyActionListener标签的value属性指的是“book”对象;target属性是表达式“requestScope.book”的引用Qƈ且和commandButtonlg建立?jin)关联?br /> ȝ (tng) (tng) (tng) (tng) (tng) q篇文章只是JSF1.2规范的简要说明,介绍一些新的特性和常见问题的解x(chng)法。我们徏议大家用一下JSF1.2。如果你有一些问题或者看法,请发邮gQusersQjavaserverfaces.dev.java.netQ给我们或者加入我们的C(http://java.sun.com/j2ee/javaserverfaces)。同Ӟ期待下一文章在我们的网站上出现?br />
]]> 受控bean与实体bean的数据传?/title> http://www.aygfsteel.com/bingle/archive/2006/09/25/71721.html冰浪 冰浪 Mon, 25 Sep 2006 05:51:00 GMT http://www.aygfsteel.com/bingle/archive/2006/09/25/71721.html http://www.aygfsteel.com/bingle/comments/71721.html http://www.aygfsteel.com/bingle/archive/2006/09/25/71721.html#Feedback 4 http://www.aygfsteel.com/bingle/comments/commentRss/71721.html http://www.aygfsteel.com/bingle/services/trackbacks/71721.html
q些日子在用JSFQHibernatel合来实C单应用——留a本?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 思\如下Q?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 用JSF作ؓ(f)View层,Hibernate实现 Model层即数据持久化,而Control层则采用POJOQ即JavaBean?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 在model层,用hibernate生成持久化对象,作ؓ(f)与数据库间数据交互的“介质对象”(自己命名的,呵呵Q。如留言信息cMessage.classQ这也是POJOQ即实体beanQ所含方法只是setter/getter。但其却与DB表中数据cd相对应的?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 在view层JSF中,与页面显C组件进行值绑定的受控bean承担?jin)数据显CZ操作的Q务。在此应用中Q如MessageBean.classQ这是与hibernate中的Message.classq一实体bean相对应的?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) Z么不直接使用实体bean作ؓ(f)view层的数据昄对象呢?q是因ؓ(f)在MVC模式中,M两层间都应该是“松藕合”状态,而不产生怺依赖的情形?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 既然如此Q受控bean与实体bean之间又如何实现数据的传递呢Q?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 在control层中Q徏立一个MessageBuilder.classc,来实Cbean间的交互Q这个类中主要利用了(jin)org.apache.commons.beanutils.BeanUtilscȝcopyPropertiesҎ(gu)来实现。MessageBuilder.java的具体实C码如下:(x) //**********MessageBuilder.java的具体实C码begin************** package efan5.myguestbook.control;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.beanutils.BeanUtils;
import efan5.myguestbook.model.Message; import efan5.myguestbook.view.MessageBean;
public class MessageBuilder { (tng) (tng)public MessageBuilder(){} (tng) (tng)public static Message createMessage(MessageBean messageBean){ (tng) (tng)Message message = new Message(); (tng) (tng)try { (tng) (tng) (tng)BeanUtils.copyProperties(message, messageBean); (tng) (tng)} catch (IllegalAccessException e) { (tng) (tng) (tng) (tng) (tng) (tng)e.printStackTrace(); (tng) (tng)} catch (InvocationTargetException e) { (tng) (tng) (tng) (tng) (tng) (tng)e.printStackTrace(); (tng) (tng)} (tng) (tng)return message; (tng)} (tng) (tng)public static MessageBean createMessageBean(Message message){ (tng) (tng)MessageBean messageBean = new MessageBean(); (tng) (tng)try { (tng) (tng) (tng)BeanUtils.copyProperties(messageBean,message); (tng) (tng)} catch (IllegalAccessException e) { (tng) (tng) (tng) (tng) (tng) (tng)e.printStackTrace(); (tng) (tng)} catch (InvocationTargetException e) { (tng) (tng) (tng) (tng) (tng) (tng)e.printStackTrace(); (tng) (tng)} (tng) (tng)return (tng) messageBean; (tng)}
} //**********MessageBuilder.java的具体实C码end************** (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) q就实现?jin)受控bean与实体bean的数据交互?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) PSQBeanUtils.copyProperties(obj1,obj2) Ҏ(gu)要对象obj1,obj2中的相对应的属性的名字和数据类型一_(d)否则?x)生数据类型不匚w的异常。但q不是要求属性数目一致?/font>
]]>
վ֩ģ壺
Ӳ |
|
ͳ |
ʹ |
|
|
|
|
|
|
|
|
|
|
|
֣ |
|
|
ͨ |
|
|
|
° |
|
|
¦ |
|
ѽ |
ƶ |
|
ŷ |
|
Ĭ |
|
|
|
|
|
|
Ƶ |
ǭ |