当前位置:51VIP源码软件音乐小游戏下载联盟网络学院程序开发java教程 → JSF1.2技术的新特性总结

JSF1.2技术的新特性总结

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2008-7-3 2:37:20 我要发布文章
erterMessage、validatorMessage来完成。
4
当你需要修改信息时,新的特性允许你覆盖原有的信息。例如,假设你在userid和password2个域中使用了验证长度的验证器。你希望一个错误信息提示“Userid必须时9个字符”,另一个“Password必须是9个字符”,但是你希望对这2个输入域使用同一个
验证器。通过validatorMessage属性,你可以在适当的组件上设置特殊的信息,就不用为每个验证器实例提供单独的提示信息。
这些属性接收字符型的值以及值表达式,和JSF的标记属性一样的工作原理。因此,你可以使用值表达式来引用绑定资源中的信息,如下面的例子:
<h:inputText value="#{customer.userID}" validatorMessage="#{customMessages.userIdMessage}" > <f:validateLongRange minimum="9" maximum="9"/> </h:inputText>
就像你猜想的一样,输入组件的属性requiredMessage值覆盖了默认的信息提示。输入组件的属性converterMessage值覆盖了默认的转换信息提示。同样的,输入组件的属性validatorMessage值也覆盖了默认的验证信息提示。
因为这种特性,页面开发人员现在可以更为合适的提供错误的提示信息。这样,用户能够更准确的直到错误的根源。
输入组件的新属性:label
输入组件的label新属性是另外一个帮助用户确认错误信息的重要特性。许多由组件产生的标准错误信息包括根据参数得到的信息。输入组件的label属性值是用来适当取代相关的默认信息的。例如,下面的信息是与DateTimeConverter相关的信息,用DATE_ID标识:
{2}: "{0}" could not be understood as a date.
这就是说,你有一个DateTimeConverter实例,并与一个文本输入框绑定。设置输入组件的label属性为BirthDate。如果用户在文本输入框中输入“older than the hills”,转换器就失败了。当页面再次被渲染的时候,用户就能看到如下的信息提示:
Birth Date: "older than the hills" could not be understood as a date. 5
Label组件接受文本内容,也接受值表达式。所以,在使用其他的JSF标签属性时,你可以使用表达式来引用绑定的资源文件内容。
新的资源配置元素
JSF1.2版本以前的规范,页面开发人员使用loadBundle标签来引用资源文件,从而达到本地化的目的。在新的1.2版本中,页面开发人员一样可以在页面中使用资源绑定。
更高效率的装载绑定好的资源,包括在应用系统的配置文件中使用资源绑定元素进行注册资源的绑定,新的规范提供了一个很好的入口方式。下面的资源绑定元素注册一个叫做“CustomMessages的ResourceBundle类,这个类存在应用系统的资源包里:
<resource-bundle> <var>customMessages</var> <base-name>resources.CustomMessages</base-name> </resource-bundle>
var子元素定义了资源引用名称,页面开发人员在开发页面时可以采用如下的方式进行调用:
<h:outputText value="#{customMessages.myText}" />
在这个例子中,myText就是定义在资源文件中,我们要引用的信息的键(key)。
通过这个新的资源绑定元素,我们可以在应用系统中绑定更多的资源文件。这样做,新的元素的使用,不仅消除了在多个页面使用“loadBundle”绑定资源的方式,而且大大提高了性能,因为装载资源是很“昂贵”的操作。
提供状态保存特性
JSF1.2版本在状态管理方面主要有2个变化。一个变化是,当应用系统使用多个框架(frame)或者窗口(window)时,整合系统状态的不稳定问题;另一个变化是提供了客户端安全状态操作。
6
在多框架或者多窗口的应用中系统状态不稳定的原因是这些复杂逻辑试图会把根视图的ID重复复制,因此状态管理就变得混乱了。在1.2版本中做了一些修改,提供了一些状态管理的API来解决这个问题。
首先,在视图中的每一个窗口(Window)或者框架(Frame)都有唯一的ID标识,这个ID标识是视图根ID和一个随即数据联合组成,并保存在一个隐藏域中,用来连接窗口(Window)或者框架(Frame)。ViewHandler中的writeState方法已经被修改,并用来生成唯一的ID,并且在JSF的“渲染-回应”阶段输出到客户端。另外,encodeEnd方法中,UIForm也被修改,让它在输出“闭合标签”到客户端的这个过程之前调用writeState方法,以便多表单(form)的状态被保存下来。
同时,在物理“渲染-回应“阶段,StateManager提供了最新的saveSerializedView方法会使用这个唯一的ID把对应的视图序列化到Session中。例如:如果服务器崩溃了,这些被保存的状态就能在另一个服务器中再次使用。所以,“状态-保存”机制在JSF1.2版本在中被高度有效的支持。最后,ViewHandler类中的restoreView方法可以使用唯一的ID来标识恢复视图,即使是在“恢复视图”阶段。
另一个重要的规定,就是允许对客户端进行加密,包括在发送一个关闭标签到客户端之前。你可以选择声明的方式对客户端进行加密:使用ClientStateSavingPassword这个类作为加密方式的入口,如下所示:
<env-entry> <env-entry-name> com.sun.faces.ClientStateSavingPassword </env-entry-name> <env-entry-value>somePassword</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry>
你提供的密码通常是生成 值/对的方式进行加密。如果这个环境入口没有在配置文件中定义,这个加密方法就不会被执行。
关闭自动生成客户端组件ID的功能
JSF采用一种算法来生成客户端组件(包含在Form中)的表示号(ID),客户端组件的ID如下面的形式:
7
[form ID]:[clientID]
页面开发人员可以对指定ID的form组件或者包含在该form中的其他组件进行操作。如果页面开发人员没有指定form的ID号或者组件的ID号,那么系统会自动生成。
早期版本的JSF规范没有规定这个算法,只要开发人员理解其工作原理就够了。此外,对于自定义的组件或者一个渲染类来说,页面开发人员没办法确定是否已经设置了组件的客户端ID号或者是否系统为它们自动生成。最后,因为某种原因,渲染器的开发人员可能无法改变它的名称,但是仍然要在JavaScript中引用它。
最后的JSF规范明确的说明了生成客户端组件ID的算法。我们可以在UIComponent的API文档中找到相关信息。由于UIForm组件增加了prependId属性,相应的算法也做了变化。页面开发人员现在可以改变该属性的默认值(默认值为false

上一页  [1] [2] [3]  下一页