??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-cnWed, 11 Apr 2007 14:14:18 GMTWed, 11 Apr 2007 14:14:18 GMT60[转]Ibatis开发Demohttp://www.aygfsteel.com/bingle/archive/2007/04/11/109931.html冰浪冰浪Wed, 11 Apr 2007 08:08:00 GMThttp://www.aygfsteel.com/bingle/archive/2007/04/11/109931.htmlhttp://www.aygfsteel.com/bingle/comments/109931.htmlhttp://www.aygfsteel.com/bingle/archive/2007/04/11/109931.html#Feedback0http://www.aygfsteel.com/bingle/comments/commentRss/109931.htmlhttp://www.aygfsteel.com/bingle/services/trackbacks/109931.html  阅读全文

冰浪 2007-04-11 16:08 发表评论
]]>
[转]Z不用spring、struts2、easyjweb{开源框?/title><link>http://www.aygfsteel.com/bingle/archive/2007/04/11/109876.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Wed, 11 Apr 2007 05:25:00 GMT</pubDate><guid>http://www.aygfsteel.com/bingle/archive/2007/04/11/109876.html</guid><wfw:comment>http://www.aygfsteel.com/bingle/comments/109876.html</wfw:comment><comments>http://www.aygfsteel.com/bingle/archive/2007/04/11/109876.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/bingle/comments/commentRss/109876.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/bingle/services/trackbacks/109876.html</trackback:ping><description><![CDATA[     摘要: 该不该用各U各L(fng)开源框?我想q是很多E序员自׃困惑的问题。有的由于对框架的不熟?zhn)Q有的是Z(jin)E序的优化,q有一些就是觉得开源框架用h不顺  <a href='http://www.aygfsteel.com/bingle/archive/2007/04/11/109876.html'>阅读全文</a><img src ="http://www.aygfsteel.com/bingle/aggbug/109876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/bingle/" target="_blank">冰浪</a> 2007-04-11 13:25 <a href="http://www.aygfsteel.com/bingle/archive/2007/04/11/109876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Java EE 5.0能取代StrutsQSpring和Hibernate吗?http://www.aygfsteel.com/bingle/archive/2007/03/28/107059.html冰浪冰浪Wed, 28 Mar 2007 12:32:00 GMThttp://www.aygfsteel.com/bingle/archive/2007/03/28/107059.htmlhttp://www.aygfsteel.com/bingle/comments/107059.htmlhttp://www.aygfsteel.com/bingle/archive/2007/03/28/107059.html#Feedback0http://www.aygfsteel.com/bingle/comments/commentRss/107059.htmlhttp://www.aygfsteel.com/bingle/services/trackbacks/107059.html阅读全文

冰浪 2007-03-28 20:32 发表评论
]]>
[转]Struts2与Struts1的对?http://www.aygfsteel.com/bingle/archive/2007/01/15/93966.html冰浪冰浪Mon, 15 Jan 2007 07:33:00 GMThttp://www.aygfsteel.com/bingle/archive/2007/01/15/93966.htmlhttp://www.aygfsteel.com/bingle/comments/93966.htmlhttp://www.aygfsteel.com/bingle/archive/2007/01/15/93966.html#Feedback0http://www.aygfsteel.com/bingle/comments/commentRss/93966.htmlhttp://www.aygfsteel.com/bingle/services/trackbacks/93966.htmlAction 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 />



冰浪 2007-01-15 15:33 发表评论
]]>
[转]刚刚出炉?Q-QJSF1.2新特?/title><link>http://www.aygfsteel.com/bingle/archive/2006/12/21/89205.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Thu, 21 Dec 2006 02:11:00 GMT</pubDate><guid>http://www.aygfsteel.com/bingle/archive/2006/12/21/89205.html</guid><wfw:comment>http://www.aygfsteel.com/bingle/comments/89205.html</wfw:comment><comments>http://www.aygfsteel.com/bingle/archive/2006/12/21/89205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/bingle/comments/commentRss/89205.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/bingle/services/trackbacks/89205.html</trackback:ping><description><![CDATA[ <font size="2">注:(x)此文{载自dev2devQ?a >http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=35942</a><br /><br /><br />最新翻译的Q?br /><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) JSF1.2技术的新特性ȝ<br /><br />本文的主要内容:(x)<br /> (tng) <br /> (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)<br />* l一JSP技?br /> (tng) * 改进自定义信息的支持<br />* 提供状态保存特?br />* 能够关闭自动生成lg客户端ID<br />* 新的setPropertyActionListener标签<br />《JavaServer Faces规范》的前言部分提供?jin)一l完成的Ҏ(gu)描q?br /><br />l一JSP技术:(x)<br /> (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)<br />* 首先JSFlg支持JSTL的forEach标签<br />* 改进treelg创徏Ҏ(gu)和内容组l?br />* 反对只用JSF技术的ELQ赞成用统一的EL<br /> (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)<br /><table><br /><tr><br /><th>Item Name</th><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <th>Item Price</th> <br /><th>Item Quantity</th><br /></tr><br /><c:forEach var="item" items="#{shoppingCart.items}"><br /><tr><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) <td><h:outputText value="#{item.name}" /></td><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) <td><h:outputText value="#{item.price}" /></td><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) <td><h:inputText value="#{item.quantity}" /></td><br /></tr><br /></c:forEach><br /><h:commandButton value="update quantities" action="update" /><br /></table><br />没有l一使用ELQ?q几乎是不可能实现的?br /><br />改进treelg创徏Ҏ(gu)和内容组l?br /><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)<br /><h:panelGroup><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <h:outputText value="Hi. "/><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) What's your name?<br /> (tng) (tng) (tng) (tng) (tng) </h:panelGroup><br />然而,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)<br />* 创徏和渲染组件树(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 /><br />反对只用JSF的ELQ赞成用统一的EL<br /><br /> (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 /><br />改进易用性来支持自定义信?br /><br /> (tng) (tng) (tng) (tng) (tng) JSF1.2技术的一个重要改q就是在JSF应用中增加自定义信息的能力。这个改q包括如下几个方面:(x)<br />* 一l新的标准{换信?br />* 对输入组件提供了(jin)新的属性:(x)requiredMessage、converterMessage、validatorMessage<br />* 入组件提供了(jin)新的label属性,允许lg的名字中包含错误信息<br />* 提供新的资源l定元素在应用中l定资源?br /><br />一l标准的转换器信?br /><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 /><br />新属性:(x)requiredMessage,converterMessage,validatorMessage<br /><br /> (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}" <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) validatorMessage="#{customMessages.userIdMessage}" ><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <f:validateLongRange minimum="9" maximum="9"/><br /> (tng) (tng) (tng) (tng) </h:inputText><br /> (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 /><br />输入lg的新属性:(x)label<br /><br /> (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.<br />q就是说Q你有一个DateTimeConverter实例Qƈ与一个文本输入框l定。设|输入组件的label属性ؓ(f)BirthDate。如果用户在文本输入框中输入“older than the hills”,转换器就p|?jin)。当面再次被渲染的时候,用户p看到如下的信息提C:(x)<br /> (tng) (tng) (tng) (tng) (tng) Birth Date: "older than the hills" could not be understood as a date.<br /> (tng) (tng) (tng) (tng) (tng) <br /> (tng) (tng) (tng) (tng) Labellg接受文本内容Q也接受D辑ּ。所以,在用其他的JSF标签属性时Q你可以使用表达式来引用l定的资源文件内宏V?br /><br />新的资源配置元素<br /><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><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <var>customMessages</var><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <base-name>resources.CustomMessages</base-name><br /> (tng) (tng) (tng) (tng) </resource-bundle><br />var子元素定义了(jin)资源引用名称Q页面开发h员在开发页面时可以采用如下的方式进行调用:(x)<br /><h:outputText value="#{customMessages.myText}" /><br /> (tng) (tng) (tng) (tng) (tng) 在这个例子中QmyText是定义在资源文件中Q我们要引用的信息的键(keyQ?br />通过q个新的资源l定元素Q我们可以在应用pȝ中绑定更多的资源文g。这样做Q新的元素的使用Q不仅消除了(jin)在多个页面用“loadBundle”绑定资源的方式Q而且大大提高?sh)(jin)性能Q因载资源是很“昂贵”的操作?br /><br />提供状态保存特?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)<br /><env-entry><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <env-entry-name><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) com.sun.faces.ClientStateSavingPassword<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) </env-entry-name><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <env-entry-value>somePassword</env-entry-value><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <env-entry-type>java.lang.String</env-entry-type><br /> (tng) (tng) (tng) (tng) </env-entry><br /> (tng) (tng) (tng) (tng) (tng) (tng) 你提供的密码通常是生??对的方式q行加密。如果这个环境入口没有在配置文g中定义,q个加密Ҏ(gu)׃?x)被执行?br /><br />关闭自动生成客户端组件ID的功?br /><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]<br /> (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 /><br />Table 1:客户端组件ID生成情况<br /><br />场景  (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 <br />开发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 <br />开发h员(sh)仅设|了(jin)form的ID myForm:_id0 _id0 <br />开发h员只讄lgID  (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) _id0:myComponent myComponent <br />开发h员对form和组仉讄?jin)ID myForm:myComponent myComponent <br /><br />新标{setPropertyActionListener<br /><br /> (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"><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <c:set var="book" scope="request" value="${book}"/><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) ...<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <h:commandButton id="add" action="#{catalog.add}"<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) value="#{bundle.CartAdd}"> (tng) (tng) (tng) <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <f:setPropertyActionListener <br /> (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}"<br /> (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}"/><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) </h:commandButton><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) <c:remove var="book" scope="request"/><br /> (tng) (tng) (tng) (tng) </c:forEach><br />当用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 /><br /><br />ȝ<br /><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 /></font> <img src ="http://www.aygfsteel.com/bingle/aggbug/89205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/bingle/" target="_blank">冰浪</a> 2006-12-21 10:11 <a href="http://www.aygfsteel.com/bingle/archive/2006/12/21/89205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>受控bean与实体bean的数据传?/title><link>http://www.aygfsteel.com/bingle/archive/2006/09/25/71721.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Mon, 25 Sep 2006 05:51:00 GMT</pubDate><guid>http://www.aygfsteel.com/bingle/archive/2006/09/25/71721.html</guid><wfw:comment>http://www.aygfsteel.com/bingle/comments/71721.html</wfw:comment><comments>http://www.aygfsteel.com/bingle/archive/2006/09/25/71721.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.aygfsteel.com/bingle/comments/commentRss/71721.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/bingle/services/trackbacks/71721.html</trackback:ping><description><![CDATA[ <p> <font size="2">q些日子在用JSFQHibernatel合来实C单应用——留a本?br /><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 /><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 在model层,用hibernate生成持久化对象,作ؓ(f)与数据库间数据交互的“介质对象”(自己命名的,呵呵Q。如留言信息cMessage.classQ这也是POJOQ即实体beanQ所含方法只是setter/getter。但其却与DB表中数据cd相对应的?br /><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 在view层JSF中,与页面显C组件进行值绑定的受控bean承担?jin)数据显CZ操作的Q务。在此应用中Q如MessageBean.classQ这是与hibernate中的Message.classq一实体bean相对应的?br /><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) Z么不直接使用实体bean作ؓ(f)view层的数据昄对象呢?q是因ؓ(f)在MVC模式中,M两层间都应该是“松藕合”状态,而不产生怺依赖的情形?br /><br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 既然如此Q受控bean与实体bean之间又如何实现数据的传递呢Q?br /><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)<br /><br />//**********MessageBuilder.java的具体实C码begin**************<br />package efan5.myguestbook.control;</font> </p> <p> <font size="2">import java.lang.reflect.InvocationTargetException;<br /></font> <font size="2">import org.apache.commons.beanutils.BeanUtils;</font> </p> <p> <font size="2">import efan5.myguestbook.model.Message;<br />import efan5.myguestbook.view.MessageBean;</font> </p> <p> <font size="2">public class MessageBuilder {<br /> (tng)<br /> (tng)public MessageBuilder(){}<br /> (tng)<br /> (tng)public static Message createMessage(MessageBean messageBean){<br /> (tng) (tng)Message message = new Message();<br /> (tng) (tng)try {<br /> (tng) (tng) (tng)BeanUtils.copyProperties(message, messageBean);<br /> (tng) (tng)} catch (IllegalAccessException e) {<br /> (tng) (tng) (tng)<br /> (tng) (tng) (tng)e.printStackTrace();<br /> (tng) (tng)} catch (InvocationTargetException e) {<br /> (tng) (tng) (tng) (tng) (tng) (tng)e.printStackTrace();<br /> (tng) (tng)}<br /> (tng) (tng)return message;<br /> (tng)}<br /> (tng)<br /> (tng)public static MessageBean createMessageBean(Message message){<br /> (tng) (tng)MessageBean messageBean = new MessageBean();<br /> (tng) (tng)try {<br /> (tng) (tng) (tng)BeanUtils.copyProperties(messageBean,message);<br /> (tng) (tng)} catch (IllegalAccessException e) {<br /> (tng) (tng) (tng)<br /> (tng) (tng) (tng)e.printStackTrace();<br /> (tng) (tng)} catch (InvocationTargetException e) {<br /> (tng) (tng) (tng) (tng) (tng) (tng)e.printStackTrace();<br /> (tng) (tng)}<br /> (tng) (tng)return (tng) messageBean;<br /> (tng)}</font> </p> <p> <font size="2">}<br />//**********MessageBuilder.java的具体实C码end**************<br /><br /> (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> </p> <img src ="http://www.aygfsteel.com/bingle/aggbug/71721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/bingle/" target="_blank">冰浪</a> 2006-09-25 13:51 <a href="http://www.aygfsteel.com/bingle/archive/2006/09/25/71721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">Ӳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͳ</a>| <a href="http://" target="_blank">ʹ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">֣</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">°</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¦</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ѽ</a>| <a href="http://" target="_blank">ƶ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ŷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ĭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ƶ</a>| <a href="http://" target="_blank">ǭ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>