日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

通過元數據驗證對象

瀏覽:247日期:2024-07-19 15:28:27
內容: 很多開發人員一直都在抱怨,除了java代碼,他們還要管理眾多的XML配置文件。有了最近增加到java的元數據,通過使用標注(注解),框架里的普通詳細配置信息現在都可以嵌入java文件里了。Sun的文章“J2SE 5.0 概要(J2SE 5.0 in a Nutshell.)對元數據和標注進行了簡要介紹。這篇文章中,我們將總結現今的配置數據是如何管理的,緊接著的一個實現,標注如何在一個簡單的驗證框架使用,描述了日后元數據將提供什么樣的功能。版權聲明:任何獲得Matrix授權的網站,轉載時請務必保留以下作者信息和鏈接作者:Jacob Hookomginge(作者的Blog:http://blog.matrix.org.cn/page/ginge)原文:http://www.onjava.com/pub/a/onjava/2005/01/19/metadata_validation.html譯文:http://www.matrix.org.cn/resource/article/44/44151_metadata_validation.html關鍵字:metadata;validation使用框架的今天 在我們日常的作業中,我們都使用了框架來處理這些事情,例如持久化,用戶輸入,驗證,web服務以及工作流。為了與這些框架一起工作,我們不得不通過不同的方法在業務對象里做綁定。一些開發人員使用的與框架綁定的方法是:1,實現或者繼承框架提供的類。一個這樣的例子就是為了處理用戶的輸入,Struts里繼承ActionForm。為了能夠使用該框架,這是強制的,并且需要開發人員編寫和維護專門的業務對象(Employee對象和EmployeeForm)。2,維護單獨的配置文件,這些配置文件把Java對象和方法映射到該框架。Hibernate,Struts以及JavaServerFace都大量的使用了XML配置文件。然而,這些對于Java代碼很不顯眼,我們失去了編譯時驗證以及不得不在不同的位置維護數據――在XML文件和在不同的Java文件中。元數據將提供什么?元數據允許我們綁定框架相關的配置數據到我們的業務對象而無須改變或者繼承任何對象固有的職責。我喜歡將元數據跟Javadoc注釋做比較。如果你改變了一個Javadoc注釋,它并不會改變你的代碼的行為的,除非你確實用到Javadoc命令。概念上,元數據以相似的方式運作。你可以把配置數據添加到你的對象,不用改變代碼的行為,除非你要尋找該特定的元數據。既然元數據以這樣的方式運作,你可以使用標注(Java元數據)來支持持久化,支持你的web應用框架。斟酌這個例子:@Column('usrEmail')@ValidateEmailpublic void setEmail(String email) { this.email = email;}在上面的例子里,@Column('usrEmail')是一個會在你的持久化框架使用的標注,而@ValidateEmail是在你的web框架里為了驗證用戶輸入使用的。注意到支持這兩個框架我們不需要改變setEmail(String)方法,從而保持了它的原汁原味,以及通有的簡單性。最后,如前所述,主要的好處就是配置數據可以在你的java對象里以一種類型安全的方式維護。不需要額外的剪切和粘貼類名,方法名到單獨的XML文件里,卻同時確保了名稱與java代碼相一致。以此代替的是僅僅通過標注在你的代碼里的方法里聲明配置數據。驗證用戶輸入一個的使用元數據的優秀例子是在一個簡單的框架哩驗證用戶輸入。有了這個框架,結果是允許開發人員去像這樣去裝飾對象:@ValidateRequired@ValidateEmailpublic void setEmail(String email) { this.email = email;}@ValidateRequired@ValidateLength(min=6,max=12)public void setPassword(String password) { this.password = password;}同時,開發人員應該能夠對一個已標注bean的屬性驗證輸入:Validator.validate(loginBean, 'email', 'yourname@onjava.com');Validator.validate(loginBean, 'password', ''); // 非法實現元數據驗證讓我們來看可以定義多種驗證的情形。這里有一個關于ValidateLength 和 ValidateExpr標注是怎樣的例子://例子 @ValidateLength(min=6,max=8)public @interface ValidateLength { int min() default 0; int max() default Integer.MAX_VALUE;}// 例子 @ValidateExpr('^(w){0,2}$');public @interface ValidateExpr { String value();}當在一個框架里使用標注的時候一些問題出現了。首先,我們除了綁定狀態,不能給標注綁定任何的行為或者操作。其次,沒有任何方法知道有哪些標注是用于驗證的。這是因為標注不允許繼承(extends 或者 implements),也就意味著進行標注自省時,沒有instanceof能力。那么,我們怎樣才能夠在我們的框架里插入 驗證元數據?僅僅對標注進行標注!@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Validate { Class<? extends ValidateHandler> value();}如你在上面所看到的Validate標注將為運行時反射保留(@Retention(RetentionPolicy.RUNTIME))同時它也被聲明為標注其他的標注(@Target(ElementType.ANNOTATION_TYPE))。另外,這個將處理驗證邏輯的Validate標注僅有一個指定了一個ValidateHandler實例的Class變量。在我們進一步深入之前,讓我們來看看Validate是如何應用到我們的ValidateExpr標注的:@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)@Validate(ValidateExprHandler.class)public @interface ValidateExpr { String value();}有三個標注已添加到我們ValidateExpr標注里了。前兩個是明了的,但是第三個,@Validate(ValidateExprHandler.class)解決了前面提及到的在一個框架里使用標注所碰到的兩個問題。我們現在提供了一個方法,就是標記所有Validate標注的驗證器,而這些Validate標注可以通過反射找到。同時,我們通過ValidateExprHandler提供了一個支持處理ValidaeExpr標注的Class類型。讓我們看看ValidateExprHandler是如何被實現的(在這篇文章底部的Resources包含了這個和其他例子樣例源碼.zip)// 如在Validate標注使用的接口public interface ValidateHandler{ public void validate(T settings, Object value) throws ValidationException; public Class getSettingsType();}// 與ValidateExpr標注使用的處理者public class ValidateExprHandler implements ValidateHandler{ public void validate(ValidateExpr settings, Object value) throws ValidationException { String i = (value != null) ? value.toString() : ''; if (!Pattern.matches(settings.value(), i)) { throw new ValidationException(i + ' does not match the pattern ' + settings.value()); } } public Class getSettingsType() { return ValidateExpr.class; } }快速總結一下我們迄今所完成的:對于每個驗證器,我們定義一個標注,實現一個ValidateHandler類以提供標注實際的行為。既然對于Java元數據沒有任何繼承機制,我們用一個標記標注(Validate)以使我們的驗證框架可以在運行時使用反射找到驗證器的實現。Validatehandler接口允許一個標注委派其行為,這些行為將在處理時被使用。處理驗證器現在該是時候操作處理我們的驗證標注了。在本文前面,我展示了一個驗證器工具的例子,也就是關注找尋和處理聲明在你的Bean里的驗證器。Validator.validate(loginBean, 'email', 'yourname@onjava.com');Validator.validate(loginBean, 'password', '');本質上,目的是使用loginBean,為email (setEmail(String)找到setter方法。在J2SE 5.0,Method實現了AnnotatedElement,這使得我們可以為驗證器編寫一個一般的標注處理方法:public static void validate(AnnotatedElement element, Object value) throws ValidationException{ Validate v; ValidateHandler vh; Annotation a; // 抓取所有標注 Annotation[] ma = element.getAnnotations(); for (int i = 0; i < ma.length; i++) { // 如果一個標注擁有一個驗證標注 v = ma[i].annotationType().getAnnotation(Validate.class); if (v != null) { try { // 使用Validate的值創建一個ValidateHandler vh = v.value().newInstance();// 使用當前標注作為ValidateHandler的狀態 // 會拋出 ValidationException異常 vh.validate(ma[i], value); } catch (InstantiationException ie) { } catch (IllegalAccessException iae) { }更加詳細的描述處理:1,從元素(setEmail(String))里抓取所有的標注。2,迭代所有標注檢查每個標注是否聲明了一個Validate標注3,如果找到一個Validate標注,則用其值創建一個ValidateHandler的新實例4,使用從數組里得到的原始標注,將其傳遞給該ValidateHandler的實例做處理這就是所有要做的處理。允許你的框架的用戶毫不費力的在他們的bean屬性上聲明類型安全的標注,目的就是以一個不顯眼的方式為用戶簡化處理的細節。確實,重要的是使其他人更加容易的使用你的框架。路在何方?像EJB 3.0之類的規范已經增強了元數據對持久化映射的支持了。此外,很多開發人員已經熟悉了XDoclet提供以及使用Javadoc元數據如何對已有框架提供配置細節的了。隨著XDclet的流行,使我驚奇的是,在日后發行版本中,框架的開發人員逐漸不再承擔提供標注支持了。就JavaServerFaces而言,John Reynolds最近寫了關于驗證邏輯改放到何處,以及不贊成當前使用方法的blog。在這篇文章中,為驗證框架修改了我們寫就的一些代碼,你應該結合UIComponent的理念進入到驗證處理里。這樣就允許了程序員直接在他們的bean里聲明驗證元數據,而不是分散在JSP頁面里。思索一下,在當今,為了讓你的對象在框架里運作需要什么,或者為了迎合你的雇主,你要學習什么API以及規范?XML和Java反射機制是簡化我們開發應用和與框架工作方面的一個進步。現在,讓我們繼續朝著這條路走和以一種認真的看待Java元數據。相關資源:Sample source code for the validation utility'J2SE 5.0 in a Nutshell with an Introduction to Metadata'J2SE 5.0 Annotations API關于作者Jacob Hookom 是一個 McKesson Medical-Surgical的開發人員,一個Sun's JavaServerFaces RI的貢獻者,同時也是JavaServerFaces專家組(JavaServerFaces Expert Group)的一個活躍成員。 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd 很多開?
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品国产乱码久久久| 视频一区视频二区中文| 国产视频网站一区二区三区| 给我免费播放日韩视频| 亚洲乱亚洲高清| 亚洲91久久| 亚洲男人在线| 在线视频日韩| 久久久夜夜夜| 黄色精品视频| 日本免费新一区视频| 午夜久久tv| 另类专区亚洲| 欧美黄色一区| 日韩高清欧美激情| 9国产精品视频| 精品国产不卡一区二区| 爽好多水快深点欧美视频| 老鸭窝一区二区久久精品| 亚洲婷婷丁香| 亚洲免费网址| 亚洲一卡久久| 欧美日韩四区| 亚洲综合欧美| 尹人成人综合网| 91久久国产| 亚洲欧美日韩一区在线观看| 欧美激情久久久久久久久久久| 亚洲精品动态| 国产精品日韩精品在线播放| 亚洲精一区二区三区| 蜜臀av性久久久久蜜臀aⅴ四虎| 99精品美女| 亚洲一级影院| 午夜久久tv| 日韩av影院| 久久久精品国产**网站| 日韩在线中文| 香蕉久久国产| 久久av偷拍| 久久中文字幕二区| 另类av一区二区| 91麻豆精品激情在线观看最新| 国产精东传媒成人av电影| 日韩av二区| 综合国产视频| 精品视频一区二区三区四区五区| 麻豆精品蜜桃视频网站| 国产第一亚洲| 国产亚洲毛片在线| 国产亚洲高清一区| 九九精品调教| 欧美午夜网站| 亚洲国产日韩欧美在线| 亚久久调教视频| 97精品97| 日本亚洲视频在线| 91精品精品| 日本天堂一区| 不卡一区2区| 成人污污视频| 日本午夜精品视频在线观看| 99久久99视频只有精品| 久久精品97| 蜜桃tv一区二区三区| 欧美一区成人| 91超碰国产精品| 日韩制服丝袜先锋影音| 久久精品人人| 青青国产91久久久久久| 欧美搞黄网站| 精品视频国产| 国产精品日本一区二区三区在线| 日韩一区精品视频| 欧美日韩激情| 欧美freesex黑人又粗又大| 久久激情综合网| 精品国产亚洲一区二区三区大结局| 国产精品mm| 日韩午夜视频在线| 亚洲毛片网站| 天堂久久一区| 99久久久久久中文字幕一区| 亚洲精品**中文毛片| 精品国产午夜肉伦伦影院| 国产精品久久免费视频| 国产精品久久久久久久久免费高清| 蜜臀久久久99精品久久久久久| 久久精品1区| 中文字幕系列一区| av亚洲一区二区三区| 欧美日韩精品免费观看视欧美高清免费大片| 国产精品jk白丝蜜臀av小说| 日韩在线播放一区二区| 中文字幕亚洲影视| 一本综合精品| 国产日韩亚洲| 精品三级在线| 99久久99视频只有精品| 黄色不卡一区| 久久亚洲欧洲| 日本中文字幕不卡| 国产精品jk白丝蜜臀av小说| 久久精品天堂| 国产一区二区久久久久| 麻豆免费精品视频| 国产精品白丝一区二区三区| 丁香婷婷久久| 樱桃视频成人在线观看| 午夜精品亚洲| 国产日韩欧美在线播放不卡| 美女在线视频一区| 亚洲综合电影| 亚洲日本三级| 国产高清不卡| 日韩二区三区四区| av资源新版天堂在线| 亚洲黄色影院| 久久wwww| 亚洲一区二区三区在线免费| 久久69成人| 久久亚洲精品伦理| 久久精品电影| 国产欧美一区| 国产精品综合色区在线观看| 99精品电影| 福利一区视频| 久久免费视频66| 国产欧美另类| 日本不卡在线视频| 久久亚洲精品伦理| 在线国产一区二区| 久久精品欧洲| 欧美a级一区二区| 国产精品亚洲综合久久| 日韩二区三区在线观看| 亚洲精品视频一二三区| 爽爽淫人综合网网站| 欧美性感美女一区二区| 红桃视频国产一区| 久久久精品日韩| 久久黄色影院| 精品日韩毛片| 亚洲精品国产精品粉嫩| 激情不卡一区二区三区视频在线| 日韩一区二区三区免费| 欧美xxxx中国| 国产一区二区三区日韩精品| 国产一区国产二区国产三区| 久久亚洲道色| 成人亚洲一区| 免费欧美一区| 91精品国产自产在线观看永久∴| 在线综合视频| 日韩在线观看一区二区| 中文字幕一区二区av| 国产调教精品| 国产精品欧美日韩一区| 久久国际精品| 欧美国产先锋| 国产日韩欧美三级| 91精品国产一区二区在线观看| 美女视频网站久久| 国产美女高潮在线观看| 噜噜噜久久亚洲精品国产品小说| 免费在线观看视频一区| 亚洲tv在线| 国产成人免费| 亚洲午夜电影| 日韩精品午夜视频| 亲子伦视频一区二区三区| 蜜芽一区二区三区| 色爱综合网欧美| 色综合视频一区二区三区日韩 | 欧美偷窥清纯综合图区| 国产精品二区不卡| 亚洲色图网站| 99精品视频在线| 欧美91在线| 亚洲一级大片| 色婷婷亚洲mv天堂mv在影片| 亚洲精品在线二区| 日韩久久精品| 国产精品探花在线观看| 国产午夜精品一区二区三区欧美| 国产成人久久精品麻豆二区 | 久久99国产精品视频| 久久午夜精品| 午夜久久99| 精品一区在线| 99久久激情| 国产一区二区三区亚洲综合| 日韩在线观看中文字幕| 午夜国产精品视频免费体验区| 久久久久伊人| 久久精品一区二区国产| 国产亚洲电影| 97久久精品| 麻豆一区在线| 超碰在线99|