javascript
使用JSF 2.0可以更轻松地进行多字段验证
開(kāi)發(fā)應(yīng)用程序表單時(shí)最常見(jiàn)的需求之一是多字段驗(yàn)證(或跨字段驗(yàn)證,但我沒(méi)有使用此術(shù)語(yǔ),因?yàn)楫?dāng)我將其放在Google上時(shí),實(shí)際上得到了一些戰(zhàn)后圖片)。 我正在談?wù)摰那闆r是,我們需要比較初始日期是早于結(jié)束日期還是值小于另一個(gè)日期。 這不是在每個(gè)面向業(yè)務(wù)的框架中都有明顯的功能嗎? 并不是的。
不幸的是,JSF規(guī)范默認(rèn)情況下不支持它。 因此,直到最新的生產(chǎn)版本( JSR 245 – JSF 2.1),JSF才提供現(xiàn)成的多字段驗(yàn)證功能。 由于JSR 344提到了“多字段驗(yàn)證”,我們可能希望在JSF 2.2中有所收獲 。 同時(shí),開(kāi)發(fā)人員利用了他們卓有成效的創(chuàng)造力來(lái)實(shí)施他們的解決方案。 您可以在Stackoverflow.com上找到許多可行的替代方案; 人們創(chuàng)建自己的組件 ; 在Java EE之上構(gòu)建的框架試圖覆蓋此功能; 還有很多其他情況。
我不喜歡找到的任何解決方案。 有些很復(fù)雜,有些則不太優(yōu)雅。 因此,我決定也要有創(chuàng)造力,并嘗試一個(gè)更簡(jiǎn)單的解決方案,當(dāng)重構(gòu)時(shí)間到來(lái)時(shí),易于理解和更改。 這并不意味著我提出的建議比其他建議要好。 我只是提出一些更簡(jiǎn)單的建議。
在以下示例中,我檢查分配的預(yù)算是否小于預(yù)算限制。 如果不是,則向用戶顯示一條消息。 該示例僅考慮兩個(gè)字段,但是可以根據(jù)需要擴(kuò)展到任意多個(gè)字段。
步驟1:在托管bean中為每個(gè)要驗(yàn)證的字段創(chuàng)建一個(gè)屬性:
以下屬性專用于多字段驗(yàn)證。
private BigDecimal allocatedBudget; private BigDecimal budgetLimit;在此示例中,我在名為MBean的類中進(jìn)行編碼,并用@ManagedBean和@RequestScoped進(jìn)行了注釋。
步驟2:在相同的托管Bean中為每個(gè)字段創(chuàng)建一個(gè)驗(yàn)證方法
此解決方案考慮在托管bean中實(shí)現(xiàn)的驗(yàn)證方法,而不是接口javax.faces.validator.Validator的實(shí)現(xiàn)。 只要定義三個(gè)標(biāo)準(zhǔn)參數(shù),即FacesContext,UIComponent和代表字段輸入值的Object,就可以為驗(yàn)證方法命名。 只有該值對(duì)我們的驗(yàn)證有用。 請(qǐng)參閱驗(yàn)證方法:
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方法不會(huì)驗(yàn)證分配的預(yù)算。 它只是將屬性validationAllocatedBudget設(shè)置為允許其值在以后使用。 有可能因?yàn)轵?yàn)證方法的調(diào)用順序與在JSF代碼中聲明的順序相同。 因此,您可以為驗(yàn)證所涉及的每個(gè)字段創(chuàng)建一個(gè)簡(jiǎn)單的方法。 有效的驗(yàn)證發(fā)生在方法validateBudgetLimit中,該方法是JSF文件中最新調(diào)用的驗(yàn)證方法,因此也是最后一個(gè)要執(zhí)行的方法。
最好以表單中字段的相同順序聲明屬性和驗(yàn)證方法。 順序不會(huì)影響算法的功能,但是有助于理解邏輯。 另一方面,JSF文件中的調(diào)用順序很重要。
步驟3:使用參數(shù)驗(yàn)證器來(lái)引用驗(yàn)證方法
從下面的字段中調(diào)用上述方法。 請(qǐng)記住,屬性和方法是在類MBean中實(shí)現(xiàn)的。
<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的更輕松多字段驗(yàn)證 。
翻譯自: https://www.javacodegeeks.com/2012/12/easier-multi-field-validation-with-jsf-2-0.html
總結(jié)
以上是生活随笔為你收集整理的使用JSF 2.0可以更轻松地进行多字段验证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Devoxx 2012:Java 8 L
- 下一篇: 振作起来– Spring Framewo