【问题标题】:How validate number fields with validateRegex in a JSF-Page?如何在 JSF 页面中使用 validateRegex 验证数字字段?
【发布时间】:2012-03-19 02:23:37
【问题描述】:

在托管 bean 中,我有一个 int 类型的属性。

@ManagedBean
@SessionScoped
public class Nacharbeit implements Serializable {

private int number;

在 JSF 页面中,我尝试验证此属性仅用于 6 位数字输入

               <h:inputText id="number"
                         label="Auftragsnummer"
                         value="#{myController.nacharbeit.number}"
                         required="true">
                <f:validateRegex pattern="(^[1-9]{6}$)" />
            </h:inputText>

在运行时我得到一个异常:

javax.servlet.ServletException: java.lang.Integer cannot be cast to java.lang.String

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

正则表达式错了吗?还是 ValidateRegex 仅适用于字符串?

【问题讨论】:

    标签: regex validation jsf


    【解决方案1】:

    你也可以在没有正则表达式的情况下实现这一点

    验证 int 值:

    <h:form id="user-form">  
        <h:outputLabel for="name">Provide Amount to Withdraw  </h:outputLabel><br/>  
        <h:inputText id="age" value="#{user.amount}" validatorMessage="You can Withdraw only between $100 and $5000">  
        <f:validateLongRange minimum="100" maximum="5000" />  
        </h:inputText><br/>  
        <h:commandButton value="OK" action="response.xhtml"></h:commandButton>  
    </h:form> 
    

    验证浮点值:

    <h:form id="user-form">  
        <h:outputLabel for="amount">Enter Amount </h:outputLabel>  
        <h:inputText id="name-id" value="#{user.amount}" validatorMessage="Please enter amount between 1000.50 and 5000.99">  
        <f:validateDoubleRange minimum="1000.50" maximum="5000.99"/>  
        </h:inputText><br/><br/>  
        <h:commandButton value="Submit" action="response.xhtml"></h:commandButton>
    </h:form>  
    

    【讨论】:

      【解决方案2】:

      &lt;f:validateRegex&gt; 仅用于String 属性。但是您有一个int 属性,JSF 已经在验证之前将提交的String 值转换为Integer。这解释了您看到的异常。

      但由于您已经在使用int 属性,因此当您输入非数字时,您已经收到了转换错误。通过converterMessage 属性可以配置转换错误消息。所以你根本不需要使用正则表达式。

      至于具体的功能要求,您似乎想要验证最小/最大长度。为此,您应该改用&lt;f:validateLength&gt;。将此与 maxlength 属性结合使用,这样最终用户无论如何都无法输入超过 6 个字符。

      <h:inputText value="#{bean.number}" maxlength="6">
          <f:validateLength minimum="6" maximum="6" />
      </h:inputText>
      

      顺便可以通过validatorMessage配置验证错误信息。所以,总而言之,它可能看起来像这样:

      <h:inputText value="#{bean.number}" maxlength="6"
          converterMessage="Please enter digits only."
          validatorMessage="Please enter 6 digits.">
          <f:validateLength minimum="6" maximum="6" />
      </h:inputText>
      

      【讨论】:

        猜你喜欢
        • 2019-02-08
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-18
        相关资源
        最近更新 更多