使用JSF 2.0可以更轻松地进行多字段验证

开发应用程序表单时最常见的需求之一是多字段验证(或跨字段验证,但我没有使用此术语,因为当我将其放在Google上时,实际上得到了一些战后图片)。 我正在谈论的情况是,我们需要比较初始日期是早于结束日期还是值小于另一个日期。 这不是在每个面向业务的框架中都有明显的功能吗? 并不是的。
不幸的是,JSF规范默认情况下不支持它。 因此,直到最新的生产版本( JSR 245 – JSF 2.1),JSF才提供现成的多字段验证功能。 由于JSR 344提到了“多字段验证”,我们可能希望在JSF 2.2中有所收获 。 同时,开发人员利用了他们卓有成效的创造力来实施他们的解决方案。 您可以在Stackoverflow.com上找到许多可行的替代方案; 人们创建自己的组件 ; 在Java EE之上构建的框架试图覆盖此功能; 还有很多其他情况。

我不喜欢找到的任何解决方案。 有些很复杂,有些则不太优雅。 因此,我决定也要有创造力,并尝试一个更简单的解决方案,当重构时间到来时,易于理解和更改。 这并不意味着我提出的建议比其他建议要好。 我只是提出一些更简单的建议。

在以下示例中,我检查分配的预算是否小于预算限制。 如果不是,则向用户显示一条消息。 该示例仅考虑两个字段,但是可以根据需要扩展到任意多个字段。

步骤1:在托管bean中为每个要验证的字段创建一个属性:

以下属性专用于多字段验证。

private BigDecimal allocatedBudget;
private BigDecimal budgetLimit;

在此示例中,我在名为MBean的类中进行编码,并用@ManagedBean和@RequestScoped进行了注释。

步骤2:在相同的托管Bean中为每个字段创建一个验证方法

此解决方案考虑在托管bean中实现的验证方法,而不是接口javax.faces.validator.Validator的实现。 只要定义三个标准参数,即FacesContext,UIComponent和代表字段输入值的Object,就可以为验证方法命名。 只有该值对我们的验证有用。 请参阅验证方法:

public void validateAllocatedBudget(FacesContext context,
                       UIComponent component, Object value) {
   this.validationAllocatedBudget = (BigDecimal) value;
}

public void validateBudgetLimit(FacesContext context,
                        UIComponent component, Object value) {
   this.validationBudgetLimit = (BigDecimal) value;
   if(this.validationBudgetLimit
          .compareTo(this.validationAllocatedBudget) < 0) {
       throw new ValidatorException(
                 new FacesMessage("Invalid allocated budget!");
   }
}

validateAllocatedBudget方法不会验证分配的预算。 它只是将属性validationAllocatedBudget设置为允许其值在以后使用。 有可能因为验证方法的调用顺序与在JSF代码中声明的顺序相同。 因此,您可以为验证所涉及的每个字段创建一个简单的方法。 有效的验证发生在方法validateBudgetLimit中,该方法是JSF文件中最新调用的验证方法,因此也是最后一个要执行的方法。

最好以表单中字段的相同顺序声明属性和验证方法。 顺序不会影响算法的功能,但是有助于理解逻辑。 另一方面,JSF文件中的调用顺序很重要。

步骤3:使用参数验证器来引用验证方法

从下面的字段中调用上述方法。 请记住,属性和方法是在类MBean中实现的。

<h:outputLabel for="allocBudget" value="Allocated Budget"/>
<h:inputText id="allocBudget" label="Allocated Budget"
    value="#{mBean.operation.allocatedBudget}"
    validator="#{mBean.validateAllocatedBudget}"/>

<h:outputLabel for="budgetLimit" value="Budget Limit"/>
<h:inputText id="budgetLimit" label="Budget Limit"
    value="#{mBean.operation.budgetLimit}"
    validator="#{mBean.validateBudgetLimit}"/>

参考: Hildeberto博客博客中的JCG合作伙伴 Hildeberto Mendonca提供的使用JSF 2.0的更轻松多字段验证

翻译自: https://www.javacodegeeks.com/2012/12/easier-multi-field-validation-with-jsf-2-0.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值