必填字段的自定義JSF驗證器

實現EditableValueHolder接口的JSF組件具有兩個屬性“ required”和“ requiredMessage” –一個標志,指示用戶需要輸入/選擇非空值,以及一個用于驗證消息的文本。 我們可以使用它,但是它不夠靈活,我們不能直接在視圖中(facelets或jsp)對消息進行參數化,我們必須做一些適當的消息定制。 附加到任何必填字段的自定義驗證器如何處理? 我們將寫一個。 首先,我們需要在標簽庫中注冊這樣的驗證器。
<?xml version='1.0'?>
<facelet-taglib version='2.0' ... ><namespace>http://ip.client/ip-jsftoolkit/validator</namespace><tag><tag-name>requiredFieldValidator</tag-name><validator><validator-id>ip.client.jsftoolkit.RequiredFieldValidator</validator-id></validator><attribute><description>Resource bundle name for the required message</description><name>bundle</name><required>false</required><type>java.lang.String</type></attribute><attribute><description>Key of the required message in the resource bundle</description><name>key</name><required>false</required><type>java.lang.String</type></attribute><attribute><description>Label string for the required message</description><name>label</name><required>false</required><type>java.lang.String</type></attribute></tag>
</facelet-taglib>

為了獲得高度的靈活性,我們定義了三個屬性。 一個簡單的用法是

<h:outputLabel for='myInput' value='#{text['myinput']}'/>
<h:inputText id='myInput' value='...'><jtv:requiredFieldValidator label='#{text['myinput']}'/>
</h:inputText>

驗證器類本身并不困難。 根據'key'參數(所需消息的密鑰)和'label'參數(對應標簽的文本),有四種情況下如何獲取消息。

/*** Validator for required fields.*/
@FacesValidator(value = RequiredFieldValidator.VALIDATOR_ID)
public class RequiredFieldValidator implements Validator
{/** validator id */public static final String VALIDATOR_ID = 'ip.client.jsftoolkit.RequiredFieldValidator';/** default bundle name */public static final String DEFAULT_BUNDLE_NAME = 'ip.client.jsftoolkit.validator.message';private String bundle;private String key;private String label;@Overridepublic void validate(FacesContext facesContext,UIComponent component, Object value) throws ValidatorException{if (!UIInput.isEmpty(value)) {return;}String message;String bundleName;if (bundle == null) {bundleName = DEFAULT_BUNDLE_NAME;} else {bundleName = bundle;}if (key == null && label == null) {message = MessageUtils.getMessageText(MessageUtils.getResourceBundle(facesContext, bundleName),'jsftoolkit.validator.emptyMandatoryField.1');} else if (key == null && label != null) {message = MessageUtils.getMessageText(MessageUtils.getResourceBundle(facesContext, bundleName),'jsftoolkit.validator.emptyMandatoryField.2', label);} else if (key != null && label == null) {message = MessageUtils.getMessageText(MessageUtils.getResourceBundle(facesContext, bundleName), key);} else {message = MessageUtils.getMessageText(MessageUtils.getResourceBundle(facesContext, bundleName), key, label);}throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_WARN, message, StringUtils.EMPTY));// getter / setter... }
}

MessageUtils是一個實用程序類,用于獲取ResourceBundle和消息文本。 我們在資源包(屬性文件)中還需要兩個文本

jsftoolkit.validator.emptyMandatoryField.1=Some required field is not filled in.
jsftoolkit.validator.emptyMandatoryField.2=The required field '{0}' is not filled in.

以及web.xml中的以下上下文參數

<context-param><param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name><param-value>true</param-value>
</context-param>

這種解決方案并不理想,因為我們需要兩次定義標簽文本(如#{text ['myinput']}),并將驗證器附加到要驗證的每個字段。 下一篇文章中將提供一個針對多個字段的更好的通用驗證器。 敬請關注!

參考:來自JCG合作伙伴 Oleg Varaksin的必填字段的自定義JSF驗證器,位于“ 軟件開發思想”博客上。


翻譯自: https://www.javacodegeeks.com/2012/05/custom-jsf-validator-for-required.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372422.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372422.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372422.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 轉碼%2f%_JS和JAVA中常用的編碼轉碼函數

js中escape,encodeURI,encodeURIComponent函數和unescape,decodeURI和decodeURIComponent函數的功能1.escape方法對String對象編碼,escape方法返回一個包含了"轉義序列"的字符串值。除了ASCII字母和數字&#xff0c;以及這幾個符號 *-/._外(共有1052769個字符不會被編…

mybatis 下劃線轉駝峰配置

一直以來&#xff0c;在sqlmap文件中&#xff0c;對于數據庫中的下劃線字段轉駝峰&#xff0c;我們都是通過resultmap來做的&#xff0c;如下&#xff1a; <resultMap id"ISTableStatistics" type"com.medsoft.perfstat.pojo.ISTableStatistics" > &…

Python練習-迭代器-模擬cat|grep文件

代碼如下: 1 # 編輯者&#xff1a;閆龍2 def grep(FindWhat):3 fopen("a.txt","r",encoding"utf8")#以只讀的方式打開a.txt文件4 while True:5 try:6 fline next(f).strip()#由于File類型本身就是一個迭代器,所以直…

Spring和JSF集成:轉換器

使用任何Web框架時&#xff0c;都不可避免地需要將用戶輸入的數據從String為其他類型。 盡管Spring和JSF在設計和功能上確實有很大的不同&#xff0c;但它們都具有轉換器策略來處理此問題。 讓我們從春天開始。 Spring 3引入了一個全新的轉換框架&#xff0c;該框架允許將任何類…

nacos配置ap_Nacos 1.0.0 功能預覽

本文來自于我的個人主頁&#xff1a;Nacos 1.0.0 功能預覽&#xff0c;轉載請保留鏈接 ;)Nacos 1.0.0 是正式 GA 的版本&#xff0c;在架構、功能和API設計上進行了全方位的重構和升級&#xff0c;1.0.0版本標志著Nacos的架構已經穩定&#xff0c;API列表最終確定。升級到1.0.0…

poj 2229 Sumsets

題目大意&#xff1a; 一個數由2的冪次數的和構成&#xff0c;問有幾種構成方式&#xff1f; 主要是找規律 代碼如下 1 #include <cstdio>2 #include <cstring>3 int n;4 #define M 10000000005 int dp[1000002];6 7 int main(int argc, char const *argv[])8 {9 …

html 甘特圖_Rplotly|交互式甘特圖(Gantt chart)項目管理/學習計劃

甘特圖(Gantt chart)&#xff0c;又常被稱為橫道圖或者條狀圖&#xff0c;是現代企業項目管理領域運用最為廣泛的一種圖示。就是通過條形來顯示項目的進度、時間安排等相關情況的。項目管理外&#xff0c;也可以用來管理學習計劃。繪制甘特圖的工具有很多&#xff0c;本文介紹使…

使您的Spring Security @Secured注釋更干燥

最近&#xff0c;Grails用戶郵件列表中的一個用戶想知道在定義Secured批注時如何減少重復 。 在Java批注中指定屬性的規則非常嚴格&#xff0c;因此我看不到直接執行他所要求的方法的方法。 使用Groovy并沒有真正的幫助&#xff0c;因為Groovy類中的注釋大部分與Java中的注釋幾…

閱讀《大型網站技術架構》 第三章心得

今天閱讀了《大型網站技術架構》 的第三章&#xff0c;這一章主要講解了大型網站核心架構要素&#xff0c;并且概括的講解了相應的實現方法。 軟件架構除了系統功能需求外&#xff0c;還需要關注性能、可用性、伸縮性、擴展性、安全性。 其中性能是網站的重要指標。優化網站性能…

easyui數據表格重置_數據庫三種刪除方式

第一種 使用delete 語句特點&#xff1a;delete 屬于數據庫操縱語言DML&#xff0c;表示刪除表中的數據&#xff0c;刪除過程是每次從表中刪除一行&#xff0c;并把該行刪除操作作為事務記錄在日志中保存可以配合事件&#xff08;transaction&#xff09;和 回滾&#xff08;ro…

main函數之間的代碼操作

全局對象的構造函數會在main函數之前執行。轉載于:https://www.cnblogs.com/yingl/p/5817123.html

Windows 自啟動總結《轉》

開機啟動項  【啟動項目就是開機的時候系統會在前臺或者后臺運行的程序】  當Windows&#xff08;操作系統&#xff09;完成登錄過程&#xff0c;進程表中出現了很多的進程&#xff01;Windows在啟動的時候&#xff0c;自動加載了很多程序。  許多程序的自啟動&#xff0…

win10多合一原版系統_微軟Win10專業版制作多合一系統安裝盤教程

微軟Win10怎么制作多合一系統安裝盤?和Win10家庭版、win10企業版&#xff0c;win10教育版相比&#xff0c;微軟Win10專業版是最受大家喜歡的操作系統&#xff0c;那么在安裝Win10操作系統的時候&#xff0c;我們就不得不準備多個不同版本的系統安裝盤。可是你知道微軟Win10專業…

Oracle Coherence:分布式數據管理

本文介紹如何使用Oracle Coherence提供分布式&#xff08;分區&#xff09;數據管理。 在下面的示例應用程序中&#xff0c;創建了一個名為OTV的新集群&#xff0c;并且在該集群的兩個成員之間分配了一個名為user-map的緩存對象。 二手技術&#xff1a; JDK 1.6.0_21 Maven的…

Ajax學習筆記

Ajax 什么是ajax AJAX即“Asynchronous JavaScript and XML”&#xff08;異步的JavaScript與XML技術&#xff09;&#xff0c;指的是一套綜合了多項技術的瀏覽器端網頁開發技術。以前&#xff0c;幾乎所有的網站都由HTML頁面實現&#xff0c;服務器處理每一個用戶請求都需要重…

美團點評DBProxy讀寫分離使用說明

目的 因為業務架構上需要實現讀寫分離&#xff0c;剛好前段時間美團點評開源了在360Atlas基礎上開發的讀寫分離中間件DBProxy&#xff0c;關于其介紹在官方文檔已經有很詳細的說明了&#xff0c;其特性主要有&#xff1a;讀寫分離、負載均衡、支持分表、IP過濾、sql語句黑名單、…

apriori算法c++_關聯分析——基于Apriori算法實現

電子商務推薦系統主要是通過統計和挖掘技術&#xff0c;根據用戶在網站上的行為,主動為用戶提供推薦服務&#xff0c;從而提高網站體驗。而根據不同的業務場景&#xff0c;推薦系統需要滿足不同的推薦粒度&#xff0c;包括搜索推薦,商品類目推薦,商品標簽推薦&#xff0c;店鋪推…

在Oracle Coherence中分發Spring Bean

本文展示了如何通過使用Oracle Coherence中的EntryProcessor和可移植對象格式&#xff08;POF&#xff09;功能來分發Spring Bean。 Coherence通過EntryProcessor API支持無鎖編程模型。 此功能通過減少網絡訪問并在條目上執行隱式的低級鎖定來提高系統性能。 此隱式低級鎖定功…

postman測試實例--斷言

讓我們來看看postman測試的一些例子。 其中大部分是作為內部postman片段。 大多數測試是為單行的JavaScript語句一樣簡單。 只要你想一個請求&#xff0c;你可以有很多的測試。注意&#xff1a;一個響應已從服務器接收后測試腳本運行。測試實例1.設置環境變量 postman.setEnvir…

python實現單例模式的幾種方式_基于Python中單例模式的幾種實現方式及優化詳解...

單例模式單例模式(Singleton Pattern)是一種常用的軟件設計模式&#xff0c;該模式的主要目的是確保某一個類只有一個實例存在。當你希望在整個系統中&#xff0c;某個類只能出現一個實例時&#xff0c;單例對象就能派上用場。比如&#xff0c;某個服務器程序的配置信息存放在一…