javascript
jsf 传参数_在JSF 2中对定制验证器进行参数化
jsf 傳參數(shù)
在JSF 2中編寫自定義驗(yàn)證器并不是一項(xiàng)復(fù)雜的任務(wù)。 您實(shí)現(xiàn)Validator接口,添加@FacesValidator批注,并在faces-config.xml中插入validator聲明, 僅此而已 。 一塊蛋糕。 但是,讓我們考慮以下情形:您需要自定義日期驗(yàn)證器,比方說(shuō)檢查rich:calendar中的日期是否不是過(guò)去的日期。 因此,我們?cè)谌諝v組件中放置了驗(yàn)證器。
<rich:calendar value="#{fieldValue}" id="dateField" datePattern="yyyy/MM/dd"><f:validator validatorId="dateNotInThePast"/></rich:calendar>我們的驗(yàn)證器可能如下所示:
@FacesValidator("dateNotInThePast") public class DateNotInThePastValidator implements Validator {@Overridepublic void validate(FacesContext facesContext, UIComponent uiComponent, Object value)throws ValidatorException {if (ObjectUtil.isNotEmpty(value)) {checkDate((Date)value, uiComponent, facesContext.getViewRoot().getLocale());}}private void checkDate(Date date, UIComponent uiComponent, Locale locale) {if(isDateInRange(date) == false) {ResourceBundle rb = ResourceBundle.getBundle("messages", locale);String messageText = rb.getString("date.not.in.the.past");throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,messageText, messageText));}}private boolean isDateInRange(Date date) {Date today = new DateTime().withTime(0, 0, 0, 0).toDate();return date.after(today) || date.equals(today);} }如果我們?cè)趯傩晕募刑峁╂I值,我們將看到類似以下內(nèi)容:
因此,看來(lái)我們已經(jīng)可以使用生產(chǎn)就緒的自定義驗(yàn)證器。
問(wèn)題
但是,當(dāng)我們的表格變得越來(lái)越復(fù)雜時(shí),我們可能會(huì)遇到以下屏幕上描述的問(wèn)題:
因此,問(wèn)題在于用戶如何確定哪個(gè)日期有效和哪個(gè)日期無(wú)效? 我們的驗(yàn)證器使用相同的屬性鍵來(lái)顯示兩個(gè)錯(cuò)誤消息。
解決方案
我們需要以某種方式向我們的自定義驗(yàn)證器提供已驗(yàn)證字段的標(biāo)簽。 而且,對(duì)于JSF而言,令人驚訝的是,它可以很容易地實(shí)現(xiàn)。 唯一的問(wèn)題是您必須知道如何做
因此,在Java Server Faces中,我們可以對(duì)具有屬性( f:attribute標(biāo)簽)的組件進(jìn)行參數(shù)化。 因此,我們將屬性添加到rich:calendar,然后在分配給此日歷字段的驗(yàn)證器中讀取此傳遞的值。 因此,現(xiàn)在我們的日歷組件應(yīng)如下所示:
<rich:calendar value="#{fieldValue}" id="dateField" datePattern="yyyy/MM/dd"><f:validator validatorId="dateNotInThePast"/><f:attribute name="fieldLabel" value="Date field 2" /></rich:calendar>在我們的驗(yàn)證器Java類中,我們可以使用uiComponent.getAttributes()。get(“ fieldLabel”);獲得此值。
private void checkDate(Date date, UIComponent uiComponent, Locale locale) {if(isDateInRange(date) == false) {ResourceBundle rb = ResourceBundle.getBundle("messages", locale);String messageText = getFieldLabel(uiComponent) +" " + rb.getString(getErrorKey());throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,messageText, messageText));}}protected String getFieldLabel(UIComponent uiComponent) {String fieldLabel = (String) uiComponent.getAttributes().get("fieldLabel");if(fieldLabel == null) {fieldLabel = "Date" ;}return fieldLabel;}錯(cuò)誤的屬性值應(yīng)為過(guò)去的值,因?yàn)殄e(cuò)誤消息的開(kāi)頭將添加日期或字段標(biāo)簽。
工作示例應(yīng)顯示與此屏幕類似的內(nèi)容:
參考:來(lái)自Code Hard Go Pro博客的JCG合作伙伴 Tomasz Dziurko 在JSF 2中參數(shù)化定制驗(yàn)證器
相關(guān)文章 :
- Java EE過(guò)去,現(xiàn)在和云7
- JBoss AS 7.0.2“ Arc”發(fā)布–使用綁定選項(xiàng)
- 那些邪惡的框架及其復(fù)雜性
- 真正的模塊化Web應(yīng)用程序:為什么沒(méi)有開(kāi)發(fā)標(biāo)準(zhǔn)?
- 編程反模式
- Java教程和Android教程列表
翻譯自: https://www.javacodegeeks.com/2011/10/parametrizing-custom-validator-in-jsf-2.html
jsf 傳參數(shù)
總結(jié)
以上是生活随笔為你收集整理的jsf 传参数_在JSF 2中对定制验证器进行参数化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LongAccumulator和Doub
- 下一篇: 使用JAXB和Jackson从XSD生成