公司动态
当前位置:首页 > 公司动态 > 学术交流 > JavaServer Faces——转换与验证

       之前的文章中,我们介绍了基础的JSF框架基础构造和PrimeFaces的基础构造,这次我们详细讨论JSF框架中的一个重要的功能,转换与验证。

       在这个模块中,我们着重讨论表单数据如何转换为JAVA对象,以及如何检查转换结果的正确性。JSF容器在更新模型之前执行的这些步骤,因此,我们不必担心无效的输入会进入我们的业务逻辑中。

转换器的转换过程是,用户先在WEB表单字段中填写内容,用户点击提交按钮之后,浏览器使用HTTP请求将值发送到服务器中,我们将该值称为“请求值”。

       在“应用请求值”期间,JSF实现将请求值存储在组件对象中,存储在组件中的值被称为“提交值”进行转换。

转换后的值并非立即传给构成业务逻辑的BEAN,而是先进行验证如果验证成功就作为本地值存储在组件对象中。应用程序设计人员可以指定验证条件,例如某些字段应有最大或最小长度。在转换和验证完所有已提交的值之后,将进入“更新模型值”的阶段,并且本地值会被存储到BEAN中。为了保证模型一致,确保用户输入的为正确值,必须先转换和验证所有用户输入的值,然后才会进入“更新模型值”的阶段。

       在JSF的几个生命周期阶段,分别会在以下几个阶段调用组件的Converter:
1,对于UIInput组件:如果按钮事件的immediate属性为true(<h:commandButton immediate="true" .../>),JSF会在 [Apply Request Values Phase:应用请求值阶段],反之,JSF会在[Process Validations Phase:数据检查阶段] 检验用户输入的有效性,有效的情况下会调用绑定到该UIInput组件的Converter对用户输入进行转换。同时,跟UIOutput组件一样,JSF会在[Render Response:重画画面阶段]调用Converter对UIInput进行显示前的变换处理
2,对于UIOutput组件:JSF会在[Render Response:重画画面阶段]调用绑定到该UIOutput组件的Converter对将要显示的值进行变换。

JSF跟Converter有关的标签:

<h:inputHidden converter=""></h:inputHidden>
<h:inputSecret converter=""></h:inputSecret>
<h:inputText converter=""></h:inputText>
<h:inputTextarea converter=""></h:inputTextarea>
<h:outputFormat converter=""></h:outputFormat>
<h:outputLabel converter=""></h:outputLabel>
<h:outputLink converter=""></h:outputLink>
<h:outputText converter=""></h:outputText>
<h:selectBooleanCheckbox converter=""></h:selectBooleanCheckbox>
<h:selectManyCheckbox converter=""></h:selectManyCheckbox>
<h:selectManyListbox converter=""></h:selectManyListbox>
<h:selectManyMenu converter=""></h:selectManyMenu>
<h:selectOneListbox converter=""></h:selectOneListbox>
<h:selectOneMenu converter=""></h:selectOneMenu>
<h:selectOneRadio converter=""></h:selectOneRadio>
<f:converter converterId=""></f:converter>
<f:convertDateTime></f:convertDateTime>
<f:convertNumber></f:convertNumber>

   其中h:inputHidden等标签的converter属性以及f:converter标签的converterId属性为被定义的converter-id,或指定为javax.faces.convert.Converter的实例。该调用方法不能向Converter传递参数。
f:converter,f:convertDateTime或其他自定义Converter标签可以对h:inputHidden,h:inputText,h:selectOneRadio等父标签的value值进行变换。

在JSF框架中,我们可以使用:f:validateDoubleRange,f:validateLongRange,f:validateLength,f:validateRequired,f:validateRegex,f:validateBean这几种提供的标准验证器标签进行验证操作。

例如:<h:inputText id="amount" label="#{msgs.amount}"

                         value="#{payment.amount}" required="true">

               <f:convertNumber minFractionDigits="2"/>

               <f:validateDoubleRange minimum="10" maximum="10000"/>

            </h:inputText>

            <h:message for="amount" styleClass="errorMessage"/>

       在这段代码中,使用了f:validateDoubleRange验证器来进行验证,一旦不符合验证器的规定范围,那么就会提示报错。

在上例中看到的,验证错误迫使当前页面重新显示,该行为对于很多导航动作会有很大的影响。假设在页面上添加了一个Cancel按钮,该页面包含必须的字段,如果用户单击Cancel,将必须的字段保留为空,那么验证机制开始运行,并且迫使当前页面重新显示。

强制用户填写必需字段之后才能取消输入是毫无道理的,因此,我们可以使用JSF提供的另外一个功能:跳过机制。

如果一个命令具有immediate特性集,那么将在“应用请求值”阶段执行该命令,可以向这样实现Cancel按钮:

<h:commandButton value="cancel" action="cancel"immediate="true" >

        至此,我们大体介绍了JSF框架中转换器以及验证器的原理以及基础使用方法,在项目中,对于用户输入的值需要严格把控,熟练使用该类标签可以更好地保证数据的正确性与格式化。

 

参考资料:

《JavaServer Faces核心编程(第三版)》——“转换和验证”

CSDN:https://blog.csdn.net/iamiwangbo/article/details/54288636

版权归威海众成信息科技股份公司所有,转载请注明出处