色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

通過(guò)元數(shù)據(jù)驗(yàn)證對(duì)象

瀏覽:71日期:2024-07-19 15:28:27
內(nèi)容: 很多開(kāi)發(fā)人員一直都在抱怨,除了java代碼,他們還要管理眾多的XML配置文件。有了最近增加到j(luò)ava的元數(shù)據(jù),通過(guò)使用標(biāo)注(注解),框架里的普通詳細(xì)配置信息現(xiàn)在都可以嵌入java文件里了。Sun的文章“J2SE 5.0 概要(J2SE 5.0 in a Nutshell.)對(duì)元數(shù)據(jù)和標(biāo)注進(jìn)行了簡(jiǎn)要介紹。這篇文章中,我們將總結(jié)現(xiàn)今的配置數(shù)據(jù)是如何管理的,緊接著的一個(gè)實(shí)現(xiàn),標(biāo)注如何在一個(gè)簡(jiǎn)單的驗(yàn)證框架使用,描述了日后元數(shù)據(jù)將提供什么樣的功能。版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必保留以下作者信息和鏈接作者: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關(guān)鍵字:metadata;validation使用框架的今天 在我們?nèi)粘5淖鳂I(yè)中,我們都使用了框架來(lái)處理這些事情,例如持久化,用戶輸入,驗(yàn)證,web服務(wù)以及工作流。為了與這些框架一起工作,我們不得不通過(guò)不同的方法在業(yè)務(wù)對(duì)象里做綁定。一些開(kāi)發(fā)人員使用的與框架綁定的方法是:1,實(shí)現(xiàn)或者繼承框架提供的類。一個(gè)這樣的例子就是為了處理用戶的輸入,Struts里繼承ActionForm。為了能夠使用該框架,這是強(qiáng)制的,并且需要開(kāi)發(fā)人員編寫(xiě)和維護(hù)專門(mén)的業(yè)務(wù)對(duì)象(Employee對(duì)象和EmployeeForm)。2,維護(hù)單獨(dú)的配置文件,這些配置文件把Java對(duì)象和方法映射到該框架。Hibernate,Struts以及JavaServerFace都大量的使用了XML配置文件。然而,這些對(duì)于Java代碼很不顯眼,我們失去了編譯時(shí)驗(yàn)證以及不得不在不同的位置維護(hù)數(shù)據(jù)――在XML文件和在不同的Java文件中。元數(shù)據(jù)將提供什么?元數(shù)據(jù)允許我們綁定框架相關(guān)的配置數(shù)據(jù)到我們的業(yè)務(wù)對(duì)象而無(wú)須改變或者繼承任何對(duì)象固有的職責(zé)。我喜歡將元數(shù)據(jù)跟Javadoc注釋做比較。如果你改變了一個(gè)Javadoc注釋,它并不會(huì)改變你的代碼的行為的,除非你確實(shí)用到Javadoc命令。概念上,元數(shù)據(jù)以相似的方式運(yùn)作。你可以把配置數(shù)據(jù)添加到你的對(duì)象,不用改變代碼的行為,除非你要尋找該特定的元數(shù)據(jù)。既然元數(shù)據(jù)以這樣的方式運(yùn)作,你可以使用標(biāo)注(Java元數(shù)據(jù))來(lái)支持持久化,支持你的web應(yīng)用框架。斟酌這個(gè)例子:@Column('usrEmail')@ValidateEmailpublic void setEmail(String email) { this.email = email;}在上面的例子里,@Column('usrEmail')是一個(gè)會(huì)在你的持久化框架使用的標(biāo)注,而@ValidateEmail是在你的web框架里為了驗(yàn)證用戶輸入使用的。注意到支持這兩個(gè)框架我們不需要改變setEmail(String)方法,從而保持了它的原汁原味,以及通有的簡(jiǎn)單性。最后,如前所述,主要的好處就是配置數(shù)據(jù)可以在你的java對(duì)象里以一種類型安全的方式維護(hù)。不需要額外的剪切和粘貼類名,方法名到單獨(dú)的XML文件里,卻同時(shí)確保了名稱與java代碼相一致。以此代替的是僅僅通過(guò)標(biāo)注在你的代碼里的方法里聲明配置數(shù)據(jù)。驗(yàn)證用戶輸入一個(gè)的使用元數(shù)據(jù)的優(yōu)秀例子是在一個(gè)簡(jiǎn)單的框架哩驗(yàn)證用戶輸入。有了這個(gè)框架,結(jié)果是允許開(kāi)發(fā)人員去像這樣去裝飾對(duì)象:@ValidateRequired@ValidateEmailpublic void setEmail(String email) { this.email = email;}@ValidateRequired@ValidateLength(min=6,max=12)public void setPassword(String password) { this.password = password;}同時(shí),開(kāi)發(fā)人員應(yīng)該能夠?qū)σ粋€(gè)已標(biāo)注bean的屬性驗(yàn)證輸入:Validator.validate(loginBean, 'email', '[email protected]');Validator.validate(loginBean, 'password', ''); // 非法實(shí)現(xiàn)元數(shù)據(jù)驗(yàn)證讓我們來(lái)看可以定義多種驗(yàn)證的情形。這里有一個(gè)關(guān)于ValidateLength 和 ValidateExpr標(biāo)注是怎樣的例子://例子 @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();}當(dāng)在一個(gè)框架里使用標(biāo)注的時(shí)候一些問(wèn)題出現(xiàn)了。首先,我們除了綁定狀態(tài),不能給標(biāo)注綁定任何的行為或者操作。其次,沒(méi)有任何方法知道有哪些標(biāo)注是用于驗(yàn)證的。這是因?yàn)闃?biāo)注不允許繼承(extends 或者 implements),也就意味著進(jìn)行標(biāo)注自省時(shí),沒(méi)有instanceof能力。那么,我們?cè)鯓硬拍軌蛟谖覀兊目蚣芾锊迦?驗(yàn)證元數(shù)據(jù)??jī)H僅對(duì)標(biāo)注進(jìn)行標(biāo)注!@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Validate { Class<? extends ValidateHandler> value();}如你在上面所看到的Validate標(biāo)注將為運(yùn)行時(shí)反射保留(@Retention(RetentionPolicy.RUNTIME))同時(shí)它也被聲明為標(biāo)注其他的標(biāo)注(@Target(ElementType.ANNOTATION_TYPE))。另外,這個(gè)將處理驗(yàn)證邏輯的Validate標(biāo)注僅有一個(gè)指定了一個(gè)ValidateHandler實(shí)例的Class變量。在我們進(jìn)一步深入之前,讓我們來(lái)看看Validate是如何應(yīng)用到我們的ValidateExpr標(biāo)注的:@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)@Validate(ValidateExprHandler.class)public @interface ValidateExpr { String value();}有三個(gè)標(biāo)注已添加到我們ValidateExpr標(biāo)注里了。前兩個(gè)是明了的,但是第三個(gè),@Validate(ValidateExprHandler.class)解決了前面提及到的在一個(gè)框架里使用標(biāo)注所碰到的兩個(gè)問(wèn)題。我們現(xiàn)在提供了一個(gè)方法,就是標(biāo)記所有Validate標(biāo)注的驗(yàn)證器,而這些Validate標(biāo)注可以通過(guò)反射找到。同時(shí),我們通過(guò)ValidateExprHandler提供了一個(gè)支持處理ValidaeExpr標(biāo)注的Class類型。讓我們看看ValidateExprHandler是如何被實(shí)現(xiàn)的(在這篇文章底部的Resources包含了這個(gè)和其他例子樣例源碼.zip)// 如在Validate標(biāo)注使用的接口public interface ValidateHandler{ public void validate(T settings, Object value) throws ValidationException; public Class getSettingsType();}// 與ValidateExpr標(biāo)注使用的處理者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; } }快速總結(jié)一下我們迄今所完成的:對(duì)于每個(gè)驗(yàn)證器,我們定義一個(gè)標(biāo)注,實(shí)現(xiàn)一個(gè)ValidateHandler類以提供標(biāo)注實(shí)際的行為。既然對(duì)于Java元數(shù)據(jù)沒(méi)有任何繼承機(jī)制,我們用一個(gè)標(biāo)記標(biāo)注(Validate)以使我們的驗(yàn)證框架可以在運(yùn)行時(shí)使用反射找到驗(yàn)證器的實(shí)現(xiàn)。Validatehandler接口允許一個(gè)標(biāo)注委派其行為,這些行為將在處理時(shí)被使用。處理驗(yàn)證器現(xiàn)在該是時(shí)候操作處理我們的驗(yàn)證標(biāo)注了。在本文前面,我展示了一個(gè)驗(yàn)證器工具的例子,也就是關(guān)注找尋和處理聲明在你的Bean里的驗(yàn)證器。Validator.validate(loginBean, 'email', '[email protected]');Validator.validate(loginBean, 'password', '');本質(zhì)上,目的是使用loginBean,為email (setEmail(String)找到setter方法。在J2SE 5.0,Method實(shí)現(xiàn)了AnnotatedElement,這使得我們可以為驗(yàn)證器編寫(xiě)一個(gè)一般的標(biāo)注處理方法:public static void validate(AnnotatedElement element, Object value) throws ValidationException{ Validate v; ValidateHandler vh; Annotation a; // 抓取所有標(biāo)注 Annotation[] ma = element.getAnnotations(); for (int i = 0; i < ma.length; i++) { // 如果一個(gè)標(biāo)注擁有一個(gè)驗(yàn)證標(biāo)注 v = ma[i].annotationType().getAnnotation(Validate.class); if (v != null) { try { // 使用Validate的值創(chuàng)建一個(gè)ValidateHandler vh = v.value().newInstance();// 使用當(dāng)前標(biāo)注作為ValidateHandler的狀態(tài) // 會(huì)拋出 ValidationException異常 vh.validate(ma[i], value); } catch (InstantiationException ie) { } catch (IllegalAccessException iae) { }更加詳細(xì)的描述處理:1,從元素(setEmail(String))里抓取所有的標(biāo)注。2,迭代所有標(biāo)注檢查每個(gè)標(biāo)注是否聲明了一個(gè)Validate標(biāo)注3,如果找到一個(gè)Validate標(biāo)注,則用其值創(chuàng)建一個(gè)ValidateHandler的新實(shí)例4,使用從數(shù)組里得到的原始標(biāo)注,將其傳遞給該ValidateHandler的實(shí)例做處理這就是所有要做的處理。允許你的框架的用戶毫不費(fèi)力的在他們的bean屬性上聲明類型安全的標(biāo)注,目的就是以一個(gè)不顯眼的方式為用戶簡(jiǎn)化處理的細(xì)節(jié)。確實(shí),重要的是使其他人更加容易的使用你的框架。路在何方?像EJB 3.0之類的規(guī)范已經(jīng)增強(qiáng)了元數(shù)據(jù)對(duì)持久化映射的支持了。此外,很多開(kāi)發(fā)人員已經(jīng)熟悉了XDoclet提供以及使用Javadoc元數(shù)據(jù)如何對(duì)已有框架提供配置細(xì)節(jié)的了。隨著XDclet的流行,使我驚奇的是,在日后發(fā)行版本中,框架的開(kāi)發(fā)人員逐漸不再承擔(dān)提供標(biāo)注支持了。就JavaServerFaces而言,John Reynolds最近寫(xiě)了關(guān)于驗(yàn)證邏輯改放到何處,以及不贊成當(dāng)前使用方法的blog。在這篇文章中,為驗(yàn)證框架修改了我們寫(xiě)就的一些代碼,你應(yīng)該結(jié)合UIComponent的理念進(jìn)入到驗(yàn)證處理里。這樣就允許了程序員直接在他們的bean里聲明驗(yàn)證元數(shù)據(jù),而不是分散在JSP頁(yè)面里。思索一下,在當(dāng)今,為了讓你的對(duì)象在框架里運(yùn)作需要什么,或者為了迎合你的雇主,你要學(xué)習(xí)什么API以及規(guī)范?XML和Java反射機(jī)制是簡(jiǎn)化我們開(kāi)發(fā)應(yīng)用和與框架工作方面的一個(gè)進(jìn)步。現(xiàn)在,讓我們繼續(xù)朝著這條路走和以一種認(rèn)真的看待Java元數(shù)據(jù)。相關(guān)資源:Sample source code for the validation utility'J2SE 5.0 in a Nutshell with an Introduction to Metadata'J2SE 5.0 Annotations API關(guān)于作者Jacob Hookom 是一個(gè) McKesson Medical-Surgical的開(kāi)發(fā)人員,一個(gè)Sun's JavaServerFaces RI的貢獻(xiàn)者,同時(shí)也是JavaServerFaces專家組(JavaServerFaces Expert Group)的一個(gè)活躍成員。 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 很多開(kāi)?
相關(guān)文章:
主站蜘蛛池模板: 国产精品久久久久久久久久久久 | 免费看欧美一级a毛片 | 俄罗斯一级毛片免费播放 | 国产精品久久久久久久人热 | 免费一级特黄a | 国产一区二区三区在线免费观看 | 久草最新视频 | 中国一级特黄大片毛片 | 99精品热女视频专线 | 蜜臀91精品国产高清在线观看 | 亚洲字幕波多野结衣作品 | 久久精品国产福利 | 免费看黄色的网址 | 2022国产精品手机在线观看 | 韩国一级毛片在线观看 | 久草手机视频在线 | 亚洲性网 | 99久久精品6在线播放 | 韩国毛片一级 | 亚洲精品xxx| 国产专区中文字幕 | 97视频免费在线观看 | 欧美精品国产精品 | 完整日本特级毛片 | 国产男人的天堂 | 成人国内精品久久久久影院 | 偷拍第1页 | 免费在线亚洲视频 | 91精品乱码一区二区三区 | 国产精品九九视频 | 国产日韩三级 | 国产成人www免费人成看片 | 欧美一级特黄刺激爽大片 | 亚洲免费视频播放 | 亚洲www视频 | 久草在线在线观看 | 日韩中文字幕免费在线观看 | 精品久久久影院 | 欧美精品xxxⅹ欧美 欧美精品不卡 | 国产精品亚洲专区在线播放 | 在线看国产视频 |