﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-冰浪-随笔分类-Frameworks</title><link>http://www.blogjava.net/bingle/category/14552.html</link><description>最大的喜悦，莫过于技术的进步 － 
坚定梦想，毕生追求!</description><language>zh-cn</language><lastBuildDate>Wed, 11 Apr 2007 14:14:18 GMT</lastBuildDate><pubDate>Wed, 11 Apr 2007 14:14:18 GMT</pubDate><ttl>60</ttl><item><title>[转]Ibatis开发Demo</title><link>http://www.blogjava.net/bingle/archive/2007/04/11/109931.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Wed, 11 Apr 2007 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2007/04/11/109931.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/109931.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2007/04/11/109931.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/109931.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/109931.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: iBatis是又一个O/R Mapping解决方案，j2ee的O/R方案真是多，和Hibernate相比，iBatis最大的特点就是小巧，上手很快。如果你不需要太多复杂的功能，iBatis是能满足你的要求又足够灵活的最简单的解决方案。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2007/04/11/109931.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/109931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2007-04-11 16:08 <a href="http://www.blogjava.net/bingle/archive/2007/04/11/109931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]为何不使用spring、struts2、easyjweb等开源框架</title><link>http://www.blogjava.net/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.blogjava.net/bingle/archive/2007/04/11/109876.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/109876.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2007/04/11/109876.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/109876.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/109876.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 该不该使用各种各样的开源框架,我想这是很多程序员自己也困惑的问题。有的由于对框架的不熟悉，有的是为了程序的优化，还有一些就是觉得开源框架用起来不顺&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2007/04/11/109876.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/109876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2007-04-11 13:25 <a href="http://www.blogjava.net/bingle/archive/2007/04/11/109876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Java EE 5.0能取代Struts，Spring和Hibernate吗？</title><link>http://www.blogjava.net/bingle/archive/2007/03/28/107059.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Wed, 28 Mar 2007 12:32:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2007/03/28/107059.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/107059.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2007/03/28/107059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/107059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/107059.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 2006年5月，Java EE 5规范正式发布。Java EE 5的出现，可能是J2EE诞生以来比较重量级的一次震撼，规范发布至今已有半年之多，业界对Java EE 5的关注也变得越来越热烈，google一下“java ee”关键字，可以得到500多万条相关纪录，而从Sun网站上进行检索（http://java.sun.com/javaee/overview/compatibility.jsp），也可以看到专业厂商已经迅速跟进，除Sun公司本身外，包括全球闻名的SAP、金蝶Apusic等另三家，已经推出全面支持Java EE 5规范的应用服务器产品。&nbsp;&nbsp;<a href='http://www.blogjava.net/bingle/archive/2007/03/28/107059.html'>阅读全文</a><img src ="http://www.blogjava.net/bingle/aggbug/107059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2007-03-28 20:32 <a href="http://www.blogjava.net/bingle/archive/2007/03/28/107059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Struts2与Struts1的对比 </title><link>http://www.blogjava.net/bingle/archive/2007/01/15/93966.html</link><dc:creator>冰浪</dc:creator><author>冰浪</author><pubDate>Mon, 15 Jan 2007 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/bingle/archive/2007/01/15/93966.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/93966.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2007/01/15/93966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/93966.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/93966.html</trackback:ping><description><![CDATA[
		<p>Action 类: <br />• Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。 <br />• Struts 2 Action类可以实现一个Action接口，也可实现其他接口，使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用的接口。Action接口不是必须的，任何有execute标识的POJO对象都可以用作Struts2的Action对象。 <br />线程模式: <br />• Struts1 Action是单例模式并且必须是线程安全的，因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事，并且要在开发时特别小心。Action资源必须是线程安全的或同步的。 <br />• Struts2 Action对象为每一个请求产生一个实例，因此没有线程安全问题。（实际上，servlet容器给每个请求产生许多可丢弃的对象，并且不会导致性能和垃圾回收问题） </p>
		<p>Servlet 依赖: <br />• Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。 <br />• Struts 2 Action不依赖于容器，允许Action脱离容器单独被测试。如果需要，Struts2 Action仍然可以访问初始的request和response。但是，其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。 </p>
		<p>可测性: <br />• 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API（这使得测试要依赖于容器）。一个第三方扩展－－Struts TestCase－－提供了一套Struts1的模拟对象（来进行测试）。 <br />• Struts 2 Action可以通过初始化、设置属性、调用方法来测试，“依赖注入”支持也使测试更容易。 </p>
		<p>捕获输入: <br />• Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm，开发者经常创建多余的类捕获输入。动态Bean（DynaBeans）可以作为创建传统ActionForm的选择，但是，开发者可能是在重新描述(创建)已经存在的JavaBean（仍然会导致有冗余的javabean）。 <br />• Struts 2直接使用Action属性作为输入属性，消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型，包括业务对象，能够用作输入/输出对象。这种ModelDriven 特性简化了taglib对POJO输入对象的引用。 </p>
		<p>表达式语言： <br />• Struts1 整合了JSTL，因此使用JSTL EL。这种EL有基本对象图遍历，但是对集合和索引属性的支持很弱。 <br />• Struts2可以使用JSTL，但是也支持一个更强大和灵活的表达式语言－－"Object Graph Notation Language" (OGNL). </p>
		<p>绑定值到页面（view）: <br />• Struts 1使用标准JSP机制把对象绑定到页面中来访问。 <br />• Struts 2 使用 "ValueStack"技术，使taglib能够访问值而不需要把你的页面（view）和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面（view）。 <br />　 <br />类型转换： <br />• Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器，对每一个实例来说是不可配置的。 <br />• Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。 </p>
		<p>校验： <br />• Struts 1支持在ActionForm的validate方法中手动校验，或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容，但不能校验子对象。 <br />• Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验，来支持chain校验子属性 </p>
		<p>Action执行的控制： <br />• Struts1支持每一个模块有单独的Request Processors（生命周期），但是模块中的所有Action必须共享相同的生命周期。 <br />• Struts2支持通过拦截器堆栈（Interceptor Stacks）为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。<br /></p>
<img src ="http://www.blogjava.net/bingle/aggbug/93966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2007-01-15 15:33 <a href="http://www.blogjava.net/bingle/archive/2007/01/15/93966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]刚刚出炉的 －－－JSF1.2新特性</title><link>http://www.blogjava.net/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.blogjava.net/bingle/archive/2006/12/21/89205.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/89205.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2006/12/21/89205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/89205.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/89205.html</trackback:ping><description><![CDATA[
		<font size="2">注：此文为转载自dev2dev：<a href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&amp;threadID=35942">http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&amp;threadID=35942</a><br /><br /><br />最新翻译的：<br /><br />               JSF1.2技术的新特性总结<br /><br />本文的主要内容：<br />  <br />    “Web Tier to Go With Java EE 5”系列文章中，“JSF1.2新特性”是第一篇。就像在文中表述的一样，JSP技术的优势随着JSF技术的发展得到了进一步的扩大，这种优势是通过统一EL表达式建立起来的。统一JSP的框架也是JSF1.2技术中众多重要成绩之一，并在JSR252规范下进行开发。除了这些变化为，JSF技术还贡献了大量的重要的容易使用的特性。这篇文章简要的描述一些重要的基本特性，大概有如下几点：<br />* 统一JSP技术<br />  * 改进自定义信息的支持<br />* 提供状态保存特性<br />* 能够关闭自动生成组件客户端ID<br />* 新的setPropertyActionListener标签<br />《JavaServer Faces规范》的前言部分提供了一组完成的特性描述。<br /><br />统一JSP技术：<br />      JSP和JSF技术相对立的核心是它们之间的页面生命周期的不同。在以前的文章中已经介绍了JSP规范，JSP规范指出：页面的元素被执行显示时，JSP支持单一的“渲染－响应”生命周期， 然后立即渲染页面。JSF的生命周期分成了多个阶段，当一个组件树被创建完毕，组件的数据就会被处理，然后组件被渲染并显示在页面上。然而，一个JSF页面并不需要在执行后立即渲染。因此，在JSP页面上使用的JSF组件被渲染时，有时候并不是按照正常的顺序完成，而且会丢失组件的一些状态或者其他的问题产生。<br />这么文章涉及到JSP2.1的新特性。这里会从一下3个方面详细的介绍JSF技术的改进的地方：<br />* 首先JSF组件支持JSTL的forEach标签<br />* 改进tree组件创建方法和内容组织<br />* 反对只使用JSF技术的EL，赞成使用统一的EL<br />       首先JSF组件支持JSTL的ForEach标签就像在描述JSP技术新特性的文章中表述的一样，Java EE web层中的统一EL的一个新特性就是：迭代标签，例如JSTL的forEach能够在JSF组件中直接使用。例如，使用输入组件构建一个简单的表格，可以通过下列代码来实现：<br />&lt;table&gt;<br />&lt;tr&gt;<br />&lt;th&gt;Item Name&lt;/th&gt;<br />         &lt;th&gt;Item Price&lt;/th&gt; <br />&lt;th&gt;Item Quantity&lt;/th&gt;<br />&lt;/tr&gt;<br />&lt;c:forEach var="item" items="#{shoppingCart.items}"&gt;<br />&lt;tr&gt;<br />        &lt;td&gt;&lt;h:outputText value="#{item.name}" /&gt;&lt;/td&gt;<br />        &lt;td&gt;&lt;h:outputText value="#{item.price}" /&gt;&lt;/td&gt;<br />        &lt;td&gt;&lt;h:inputText value="#{item.quantity}" /&gt;&lt;/td&gt;<br />&lt;/tr&gt;<br />&lt;/c:forEach&gt;<br />&lt;h:commandButton value="update quantities" action="update" /&gt;<br />&lt;/table&gt;<br />没有统一使用EL， 这几乎是不可能实现的。<br /><br />改进tree组件创建方法和内容组织<br /><br />       在Hans Bergsten的《article about the use of JavaServer Faces technology with JSP pages》文中写到的，混合使用JSP代码和JSF标签有时候会产生预期不到的结果。例如，在下面的代码中，JSF 组件outputText输出的文本内容“Hi”本来应该在文本内容“what’s your name?”前面显示：<br />&lt;h:panelGroup&gt;<br />          &lt;h:outputText value="Hi. "/&gt;<br />             What's your name?<br />      &lt;/h:panelGroup&gt;<br />然而，这两行代码的输出是顺序是相反的。是什么导致了问题的发生？JSF的实现是以JSP的渲染引擎来渲染组件树的。因为JSP会立即执行并把静态文本内容放在response中，而&lt;panelGroup&gt;的子节点标签直到相应的结束标签&lt;/panelGroup&gt;匹配后才会被渲染，所以“what’s your name?”就会在“Hi”之前显示了。<br />像这样的问题在Hans Bergsten的文中已经提到并在JSF1.2版本中得到了修改。解决方案包括：怎样改变组件树的创建、各种内容的处理和渲染等等。最重要的改变如下几点：<br />* 创建和渲染组件树被分成2步，为了防止JSP引擎过早的渲染页面内容。<br />* 所有的渲染器的rendersChildren属性值现在已经设计为“true”，目的时防止联合组件的内容在各自的组件内部分别渲染。<br />* 标签内部的静态内容对应的渲染器的rendersChildren属性值设置为true，目的是获取并保存一个短暂的UIOutput组件并把该组件添加到组件树中。<br />* 状态管理器从ViewTag中移到了ViewHandler中，为了防止write State在实际保存过程中被调用。<br />       在接下来的“Web Tier to Go With Java EE 5”系列文章中会提供更多的关于描述组件树的创建和内容组织的细节，这就让JSF标签组件中使用JSP代码成为了可能。<br /><br />反对只使用JSF的EL，赞成使用统一的EL<br /><br />       如本文前面的内容介绍，JSP和JSF的EL表达式会整合成统一的EL。这就意味着现在的JSF的EL是不推荐使用的。在介绍统一的EL前已经使用了JSF开发的应用，请务必做好具有向后兼容的工作。<br />       然而，为了利用统一EL的特性，你可能需要改变原来自定应的组件和自定义的标签。要移植到统一EL，首先要把ValueBinding换成ValueExpression，把MethodBinding换成MethodException。这些改变都相对的容易，而且还有更好的办法可以完成这些改变。例如，因为所有标准的标记属性都可以访问值表达式，你的标记处理程序不需要检测属性是可以接收、访问一个值表达式。<br />      要了解更多关于如何移植到统一EL的内容，请参见文章“Unified Expression Language”(http://java.sun.com/products/jsp/reference/techart/unifiedEL.html)<br /><br />改进易用性来支持自定义信息<br /><br />      JSF1.2技术的一个重要改进就是在JSF应用中增加自定义信息的能力。这个改进包括如下几个方面：<br />* 一组新的标准转换信息<br />* 对输入组件提供了新的属性：requiredMessage、converterMessage、validatorMessage<br />* 为输入组件提供了新的label属性，允许组件的名字中包含错误信息<br />* 提供新的资源绑定元素在应用中绑定资源。<br /><br />一组标准的转换器信息<br /><br />      以前的JSF给标准验证器提供了一组标准的错误信息。版本1.2增加了标注转换器提供了一组错误信息。要查看这些信息，请参考JSF1.2规范(http://jcp.org/en/jsr/detail?id=252)的第2.5.2.4节。<br /><br />新属性：requiredMessage,converterMessage,validatorMessage<br /><br />      很多情况下，标准的错误提示信息很适合为我们的需要。如果不合适，我们可以使用自定义的信息来覆盖这些标准的信息，要完成个目的，就是通过输入组件的新属性requiredMessage、converterMessage、validatorMessage来完成。<br />      当你需要修改信息时，新的特性允许你覆盖原有的信息。例如，假设你在userid和password2个域中使用了验证长度的验证器。你希望一个错误信息提示“Userid必须时9个字符”，另一个“Password必须是9个字符”，但是你希望对这2个输入域使用同一个验证器。通过validatorMessage属性，你可以在适当的组件上设置特殊的信息，就不用为每个验证器实例提供单独的提示信息。<br />      这些属性接收字符型的值以及值表达式，和JSF的标记属性一样的工作原理。因此，你可以使用值表达式来引用绑定资源中的信息，如下面的例子：<br />&lt;h:inputText value="#{customer.userID}" <br />              validatorMessage="#{customMessages.userIdMessage}" &gt;<br />             &lt;f:validateLongRange minimum="9" maximum="9"/&gt;<br />     &lt;/h:inputText&gt;<br />      就像你猜想的一样，输入组件的属性requiredMessage值覆盖了默认的信息提示。输入组件的属性converterMessage值覆盖了默认的转换信息提示。同样的，输入组件的属性validatorMessage值也覆盖了默认的验证信息提示。<br />      因为这种特性，页面开发人员现在可以更为合适的提供错误的提示信息。这样，用户能够更准确的直到错误的根源。<br /><br />输入组件的新属性：label<br /><br />      输入组件的label新属性是另外一个帮助用户确认错误信息的重要特性。许多由组件产生的标准错误信息包括根据参数得到的信息。输入组件的label属性值是用来适当取代相关的默认信息的。例如，下面的信息是与DateTimeConverter相关的信息，用DATE_ID标识：<br />      {2}: "{0}" could not be understood as a date.<br />这就是说，你有一个DateTimeConverter实例，并与一个文本输入框绑定。设置输入组件的label属性为BirthDate。如果用户在文本输入框中输入“older than the hills”，转换器就失败了。当页面再次被渲染的时候，用户就能看到如下的信息提示：<br />      Birth Date: "older than the hills" could not be understood as a date.<br />      <br />     Label组件接受文本内容，也接受值表达式。所以，在使用其他的JSF标签属性时，你可以使用表达式来引用绑定的资源文件内容。<br /><br />新的资源配置元素<br /><br />      JSF1.2版本以前的规范，页面开发人员使用loadBundle标签来引用资源文件，从而达到本地化的目的。在新的1.2版本中，页面开发人员一样可以在页面中使用资源绑定。<br />更高效率的装载绑定好的资源，包括在应用系统的配置文件中使用资源绑定元素进行注册资源的绑定，新的规范提供了一个很好的入口方式。下面的资源绑定元素注册一个叫做“CustomMessages的ResourceBundle类，这个类存在应用系统的资源包里：<br />&lt;resource-bundle&gt;<br />         &lt;var&gt;customMessages&lt;/var&gt;<br />         &lt;base-name&gt;resources.CustomMessages&lt;/base-name&gt;<br />     &lt;/resource-bundle&gt;<br />var子元素定义了资源引用名称，页面开发人员在开发页面时可以采用如下的方式进行调用：<br />&lt;h:outputText value="#{customMessages.myText}" /&gt;<br />      在这个例子中，myText就是定义在资源文件中，我们要引用的信息的键（key）。<br />通过这个新的资源绑定元素，我们可以在应用系统中绑定更多的资源文件。这样做，新的元素的使用，不仅消除了在多个页面使用“loadBundle”绑定资源的方式，而且大大提高了性能，因为装载资源是很“昂贵”的操作。<br /><br />提供状态保存特性<br /><br />       JSF1.2版本在状态管理方面主要有2个变化。一个变化是，当应用系统使用多个框架（frame）或者窗口(window)时，整合系统状态的不稳定问题；另一个变化是提供了客户端安全状态操作。<br />      在多框架或者多窗口的应用中系统状态不稳定的原因是这些复杂逻辑试图会把根视图的ID重复复制，因此状态管理就变得混乱了。在1.2版本中做了一些修改，提供了一些状态管理的API来解决这个问题。<br />      首先，在视图中的每一个窗口（Window）或者框架（Frame）都有唯一的ID标识，这个ID标识是视图根ID和一个随即数据联合组成，并保存在一个隐藏域中，用来连接窗口（Window）或者框架（Frame）。ViewHandler中的writeState方法已经被修改，并用来生成唯一的ID，并且在JSF的“渲染－回应”阶段输出到客户端。另外，encodeEnd方法中，UIForm也被修改，让它在输出“闭合标签”到客户端的这个过程之前调用writeState方法，以便多表单（form）的状态被保存下来。<br />      同时，在物理“渲染－回应“阶段，StateManager提供了最新的saveSerializedView方法会使用这个唯一的ID把对应的视图序列化到Session中。例如：如果服务器崩溃了，这些被保存的状态就能在另一个服务器中再次使用。所以，“状态－保存”机制在JSF1.2版本在中被高度有效的支持。最后，ViewHandler类中的restoreView方法可以使用唯一的ID来标识恢复视图，即使是在“恢复视图”阶段。<br />     另一个重要的规定，就是允许对客户端进行加密，包括在发送一个关闭标签到客户端之前。你可以选择声明的方式对客户端进行加密:使用ClientStateSavingPassword这个类作为加密方式的入口，如下所示：<br />&lt;env-entry&gt;<br />             &lt;env-entry-name&gt;<br />                     com.sun.faces.ClientStateSavingPassword<br />             &lt;/env-entry-name&gt;<br />             &lt;env-entry-value&gt;somePassword&lt;/env-entry-value&gt;<br />             &lt;env-entry-type&gt;java.lang.String&lt;/env-entry-type&gt;<br />     &lt;/env-entry&gt;<br />       你提供的密码通常是生成 值/对的方式进行加密。如果这个环境入口没有在配置文件中定义，这个加密方法就不会被执行。<br /><br />关闭自动生成客户端组件ID的功能<br /><br />      JSF采用一种算法来生成客户端组件（包含在Form中）的表示号（ID），客户端组件的ID如下面的形式：<br />           [form ID]:[clientID]<br />      页面开发人员可以对指定ID的form组件或者包含在该form中的其他组件进行操作。如果页面开发人员没有指定form的ID号或者组件的ID号，那么系统会自动生成。<br />      早期版本的JSF规范没有规定这个算法，只要开发人员理解其工作原理就够了。此外，对于自定义的组件或者一个渲染类来说，页面开发人员没办法确定是否已经设置了组件的客户端ID号或者是否系统为它们自动生成。最后，因为某种原因，渲染器的开发人员可能无法改变它的名称，但是仍然要在JavaScript中引用它。<br />      最后的JSF规范明确的说明了生成客户端组件ID的算法。我们可以在UIComponent的API文档中找到相关信息。由于UIForm组件增加了prependId属性，相应的算法也做了变化。页面开发人员现在可以改变该属性的默认值（默认值为false，可以改为true），这样就表明可以不需要使用Form的ID作为组件ID的前缀了。下表格显示了正常情况下生成客户端组件ID的不同点：<br /><br />Table 1:客户端组件ID生成情况<br /><br />场景                                     prependId=rue prependID=alse <br />开发人员没有设置ID                     _id0:_id1          _id1 <br />开发人员仅仅设置了form的ID myForm:_id0 _id0 <br />开发人员只设置组件ID          _id0:myComponent myComponent <br />开发人员对form和组件都设置了ID myForm:myComponent myComponent <br /><br />新标签setPropertyActionListener<br /><br />      除了actionListener标签之外，允许我们给自定义的组件注册一个Action Listener，核心的标记库现在已经包括在setPropertyActionListener标记中。用这个标记注册一个特定的action listener到ActionSource实例中，并与具体的组件关联起来。当组件被激活，listener就会把对象的引用存储到标记的属性中。<br />      为了展示标记的用处，假设我们有一个forEach标记，并且在其中使用了commandButton，以及使用iterator来显示一组书的信息，代码如下：<br />&lt;c:forEach items="#{bookDBAO.books}" var="book" varStatus="stat"&gt;<br />          &lt;c:set var="book" scope="request" value="${book}"/&gt;<br />          ...<br />          &lt;h:commandButton id="add" action="#{catalog.add}"<br />                 value="#{bundle.CartAdd}"&gt;    <br />                 &lt;f:setPropertyActionListener <br />                        target="#{requestScope.book}"<br />                        value="#{book}"/&gt;<br />          &lt;/h:commandButton&gt;<br />          &lt;c:remove var="book" scope="request"/&gt;<br />     &lt;/c:forEach&gt;<br />当用户点击button，选择的book就会增加到购物车中，并且显示下一页。<br />如果你熟悉JSTL，那你就直到forEach的var属性是在本页面那有效的。然而，book的数据需要在request范围内有效，这样显示页面（点击后转到的下一页面）才能范问到book的数据。因此，setPropertyActionListener标签通常用来把当前（book）对象设置为request访问范围内。<br />       在这个例子中，setPropertyActionListener标签的value属性指的是“book”对象；target属性是表达式“requestScope.book”的引用，并且和commandButton组件建立了关联。<br /><br /><br />总结<br /><br />      这篇文章只是JSF1.2规范的简要说明，介绍一些新的特性和常见问题的解决方法。我们建议大家使用一下JSF1.2。如果你有一些问题或者看法，请发邮件（users＠javaserverfaces.dev.java.net）给我们或者加入我们的社区(http://java.sun.com/j2ee/javaserverfaces)。同时，期待下一篇文章在我们的网站上出现。<br /></font>
<img src ="http://www.blogjava.net/bingle/aggbug/89205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2006-12-21 10:11 <a href="http://www.blogjava.net/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.blogjava.net/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.blogjava.net/bingle/archive/2006/09/25/71721.html</guid><wfw:comment>http://www.blogjava.net/bingle/comments/71721.html</wfw:comment><comments>http://www.blogjava.net/bingle/archive/2006/09/25/71721.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/bingle/comments/commentRss/71721.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/bingle/services/trackbacks/71721.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">这些日子在用JSF＋Hibernate组合来实现一简单应用——留言本。<br /><br />         思路如下：<br />         用JSF作为View层，Hibernate实现 Model层即数据持久化，而Control层则采用POJO，即JavaBean。<br /><br />         在model层，用hibernate生成持久化对象，作为与数据库间数据交互的“介质对象”（自己命名的，呵呵）。如留言信息类Message.class，这也是POJO，即实体bean，所含方法只是setter/getter。但其却与DB表中数据类型相对应的。<br /><br />         在view层JSF中，与页面显示组件进行值绑定的受控bean承担了数据显示与操作的任务。在此应用中，如MessageBean.class，这是与hibernate中的Message.class这一实体bean相对应的。<br /><br />         为什么不直接使用实体bean作为view层的数据显示对象呢？这是因为在MVC模式中，任何两层间都应该是“松藕合”状态，而不产生相互依赖的情形。<br /><br />         既然如此，受控bean与实体bean之间又如何实现数据的传递呢？<br /><br />         在control层中，建立一个MessageBuilder.class类，来实现两bean间的交互，这个类中主要利用了org.apache.commons.beanutils.BeanUtils类的copyProperties方法来实现。MessageBuilder.java的具体实现代码如下：<br /><br />//**********MessageBuilder.java的具体实现代码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 /> <br /> public MessageBuilder(){}<br /> <br /> public static Message createMessage(MessageBean messageBean){<br />  Message message = new Message();<br />  try {<br />   BeanUtils.copyProperties(message, messageBean);<br />  } catch (IllegalAccessException e) {<br />   <br />   e.printStackTrace();<br />  } catch (InvocationTargetException e) {<br />      e.printStackTrace();<br />  }<br />  return message;<br /> }<br /> <br /> public static MessageBean createMessageBean(Message message){<br />  MessageBean messageBean = new MessageBean();<br />  try {<br />   BeanUtils.copyProperties(messageBean,message);<br />  } catch (IllegalAccessException e) {<br />   <br />   e.printStackTrace();<br />  } catch (InvocationTargetException e) {<br />      e.printStackTrace();<br />  }<br />  return  messageBean;<br /> }</font>
		</p>
		<p>
				<font size="2">}<br />//**********MessageBuilder.java的具体实现代码end**************<br /><br />         这就实现了受控bean与实体bean的数据交互。<br />         PS：BeanUtils.copyProperties(obj1,obj2) 方法要对象obj1,obj2中的相对应的属性的名字和数据类型一致，否则会产生数据类型不匹配的异常。但并不是要求属性数目一致。</font>
		</p>
<img src ="http://www.blogjava.net/bingle/aggbug/71721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/bingle/" target="_blank">冰浪</a> 2006-09-25 13:51 <a href="http://www.blogjava.net/bingle/archive/2006/09/25/71721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>