第6章Struts2之數(shù)據(jù)校驗與國際化_第1頁
第6章Struts2之數(shù)據(jù)校驗與國際化_第2頁
第6章Struts2之數(shù)據(jù)校驗與國際化_第3頁
第6章Struts2之數(shù)據(jù)校驗與國際化_第4頁
第6章Struts2之數(shù)據(jù)校驗與國際化_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第6章Struts2高級應用6.1類型轉換6.2數(shù)據(jù)校驗的方法6.3Struts2實現(xiàn)國際化的方法6.1類型轉換器Struts2已經內建了字符串類型和如下類型之間相互轉換的轉換器。Boolean和boolean完成字符串和布爾值之間的轉換Character和char完成字符串和字符值之間的轉換Long和long完成字符串和長整型值之間的轉換Float和float完成字符串和單精度浮點值之間的轉換Double和double完成字符串和雙精度浮點值之間的轉換Date完成字符串和日期類型之間的轉換,默認采用請求本地Locale的SHORT格式數(shù)組默認情況下,數(shù)組元素是字符串集合在默認情況下,假定集合元素類型為String,則創(chuàng)建一個新的ArrayList封裝所有字符串如果需要將HTTP請求參數(shù)轉換成上面這些類型,則無需開發(fā)者進行任何特殊的處理6.1.1引用類型的轉換方式借助于內置的類型轉換器,Struts2可以完成字符串與基本類型之間的類型轉換借助于OGNL表達式,Struts2允許以另一種方式將請求參數(shù)轉換成復合類型示例代碼(ognlConvert)User.javaloginAction.javastruts.xmlinput.jsp6.1.1引用類型的轉換方式User.javapublic

classUser{privateStringname;privateStringpass;//name屬性的setter和getter方法public

voidsetName(Stringname){=name;}publicStringgetName(){return

;}//pass屬性的setter和getter方法public

voidsetPass(Stringpass){this.pass=pass;}publicStringgetPass(){return

this.pass;}}public

classLoginActionimplementsAction{//User類型屬性封裝請求參數(shù)privateUseruser;privateStringtip;//user屬性的setter和getter方法public

voidsetUser(Useruser){this.user=user;}publicUsergetUser(){return

this.user;}//tip屬性的setter和getter方法public

voidsetTip(Stringtip){this.tip=tip;}publicStringgetTip(){return

this.tip;}6.1.1引用類型的轉換方式LoginAction.jsppublicStringexecute()throwsException{//通過user屬性的name屬性和pass屬性來判斷控制邏輯if(getUser().getName().equals(“j2ee")&&getUser().getPass().equals(“tust")){setTip("登錄成功");return

SUCCESS;}else{setTip("登錄失敗?。?);return

ERROR;}}}6.1.1引用類型的轉換方式6.1.1引用類型的轉換方式struts.xml(片段)<actionname="login"class="org.crazyit.app.action.LoginAction"><resultname="success">/welcome.jsp</result><resultname="error">/error.jsp</result></action>6.1.1引用類型的轉換方式input.jsp(片段)<s:formaction="login"> <!--該表單域封裝的請求參數(shù)名為-->

<s:textfieldname=""label="用戶名"/> <!--該表單域封裝的請求參數(shù)名為user.pass-->

<s:textfieldname="user.pass"label="密碼"/> <tr> <tdcolspan="2"><s:submitvalue="轉換"theme="simple"/> <s:resetvalue="重填"theme="simple"/></td> </tr></s:form>6.1.1引用類型的轉換方式welcome.jsp(片段)<head><title>轉換成功</title></head><body><s:propertyvalue="tip"/><br/>用戶名為:<s:propertyvalue=""/><br/>密碼為:<s:propertyvalue="user.pass"/><br/></body>6.1.1引用類型的轉換方式Struts2會把參數(shù)的值賦給Action實例的user屬性的name屬性并將user.pass參數(shù)的值賦值給Action實例的user屬性的pass屬性。注意:系統(tǒng)必須為復合類(User類)提供無參構造方法如果希望使用請求參數(shù)的形式為Action實例的user屬性的name屬性賦值,則必須為user屬性對應的復合類(User類)提供setName()方法。因為Struts2是通過調用該方法來為該屬性賦值的。當然Action中還應該包含getUser()方法。6.1.2自定義類型轉換需要把一個字符串轉換成一個復合對象電話號碼ser對象:abc,xyzStruts2不知道如何完成字符串和復合對象之間的轉換。例子:localConverterinput.jspLoginAction.java6.1.2自定義類型轉換6.1.2自定義類型轉換public

classLoginActionimplementsAction{//User類型屬性封裝請求參數(shù)privateUseruser;privateStringtip;//屬性的setter和getter方法publicStringexecute()throwsException{//通過user屬性的name屬性和pass屬性來判斷控制邏輯if(getUser().getName().equals(“j2ee")&&getUser().getPass().equals(“tust")){setTip("登錄成功");return

SUCCESS;}else{setTip("登錄失?。?!");return

ERROR;}}}6.1.2自定義類型轉換1、定義類型轉換器2、在Web應用中注冊類型轉換器6.1.2自定義類型轉換自定義類型轉換1、實現(xiàn)TypeConverter接口XpublicinterfaceTypeConverter{publicObjectconvertValue(Mapcontext,Objecttarget,Membermember,StringpropertyName,Objectvalue,ClasstoType);}6.1.2自定義類型轉換2、繼承DefaultTypeConverter重寫convertValue()方法負責完成類型的轉換,雙向轉換:字符串User實例通過判斷參數(shù)toType(需要轉換的目標類型)的類型toType==String.classtoType==User.classconvertValue()方法的參數(shù)和返回值的意義context:類型轉換的上下文,即Action的上下文value:需要轉換的參數(shù),根據(jù)轉換方向不一樣,其值亦不同toType:轉換的目標類型√6.1.2自定義類型轉換

UserConverter.javapublic

classUserConverterextendsDefaultTypeConverter{//類型轉換器必須重寫convertValue方法,該方法需要完成雙向轉換publicObjectconvertValue(Mapcontext,Objectvalue,ClasstoType){//當需要將字符串向User類型轉換時if(toType==User.class){//系統(tǒng)的請求參數(shù)是一個字符串數(shù)組String[]params=(String[])value;//創(chuàng)建一個User實例Useruser=newUser();//只處理請求參數(shù)數(shù)組第一個數(shù)組元素,并將該字符串以英文逗號分割成兩個字符串String[]userValues=params[0].split(",");//為User實例賦值user.setName(userValues[0]);user.setPass(userValues[1]);//返回轉換來的User實例returnuser;}為何是字符串數(shù)組而不是字符串?文本框:用戶輸入一個普通字符串下拉列表框(可選多項):對應的請求參數(shù)是字符串數(shù)組。為了考慮到所有情形,因而把請求參數(shù)視為字符串數(shù)組。對于文本框中提供的請求參數(shù),轉換器把它當成長度為1的數(shù)組。6.1.2自定義類型轉換else

if(toType==String.class){//將需要轉換的值強制類型轉換為User實例Useruser=(User)value;return"<"+user.getName()+","+user.getPass()+">";}return

null;}}6.1.2自定義類型轉換配置類型轉換器的方式:配置局部類型轉換器僅僅對某個Action的屬性起作用配置全局類型轉換器對所有Action的特定類型的屬性都會生效

局部類型轉換器的配置文件的名稱為“類名-perties”,其中類名為使用該類型轉換器的Action類的名稱。如LoginAperties

需要創(chuàng)建一個名為“perties”的配置文件。

6.1.2自定義類型轉換局部類型轉換器

(LoginAperties)與Action所在路徑一致增加的配置內容<propName>=<ConvertClass><propName>:需要進行類型轉換的屬性<ConvertClass>:類型轉換器的實現(xiàn)類LoginApertiesuser=org.crazyit.app.converter.UserConverter指定user屬性需要使用UserConverter類來完成類型轉換6.1.2自定義類型轉換局部類型轉換器只能對指定Action、指定屬性起作用如果應用中有多個Action都包含了User類型的屬性,或者一個Action中包含了多個User類型的屬性,更適合用全局類型轉換器全局類型轉換器提供文件perties,置于應用程序的類加載路徑下org.crazyit.app.domain.User=org.crazyit.app.converter.UserConverter指定org.crazyit.app.domain.User類型需要使用UserConverter來完成類型轉換6.1.2自定義類型轉換3、繼承StrutsTypeConverterStrutsTypeConverter類是DefaultTypeConverter類的子類實現(xiàn)了convertValue()方法,將兩個不同轉換方向替換成不同方法convertFromString()當需要把字符串轉換成復合類型時convertToString()當需要把復合類型轉換為字符串時改寫的UserConverter類參數(shù)說明注冊方法6.1.2自定義類型轉換改寫的UserConverter類publicclassUserConverterextendsStrutsTypeConverter

{ //實現(xiàn)將字符串類型轉換成復合類型的方法

publicObjectconvertFromString(Mapcontext ,String[]values,ClasstoClass) { //創(chuàng)建一個User實例

Useruser=newUser(); //只處理請求參數(shù)數(shù)組第一個數(shù)組元素,

//并將該字符串以英文逗號分割成兩個字符串

String[]userValues=values[0].split(","); //為User實例賦值

user.setName(userValues[0]); user.setPass(userValues[1]); //返回轉換來的User實例

returnuser; } 6.1.2自定義類型轉換//實現(xiàn)將復合類型轉換成字符串類型的方法

publicStringconvertToString(Mapcontext,Objecto) { //將需要轉換的值強制類型轉換為User實例

Useruser=(User)o; return"<"+user.getName()+"," +user.getPass()+">"; }}6.1.3類型轉換中的錯誤處理在表示層處理數(shù)據(jù)過程中,經常會出現(xiàn)沒有嚴格按照頁面要求進行的數(shù)據(jù)錄入操作輸入電話號碼:02260274469實際上,表現(xiàn)層數(shù)據(jù)涉及兩個處理數(shù)據(jù)校驗&類型轉換只有當輸入數(shù)據(jù)時有效數(shù)據(jù)時,才可以進行有效地類型轉換有效類型轉換是基礎,然后才做數(shù)據(jù)校驗為了處理類型轉換錯誤,Strus2提供了處理類型轉換錯誤的攔截器,名稱為“conversionError”,在“struts-default.xml”文件包含對該攔截器的配置。此攔截器負責將對應錯誤封裝成表單域錯誤(FieldError),并將它們放入ActionContext中。輸出出錯信息:<s:fielderror/>6.1.3類型轉換中的錯誤處理<s:fielderror/>輸出的錯誤提示Struts2的表單標簽使用xhtml主題時,本身就會輸出錯誤提示6.2數(shù)據(jù)校驗的方法6.2.1數(shù)據(jù)校驗的必要性6.2.2通過Action中的validate()方法實現(xiàn)校驗6.2.3通過Xwork框架實現(xiàn)校驗6.2.1輸入校驗的必要性用戶在客戶端的瀏覽器中輸入信息,通過網(wǎng)絡提交到服務器,服務器對接收的信息進行處理并將結果返回給用戶。要想保證這一過程能夠順利執(zhí)行就必須保證用戶提交信息的合法性。輸入校驗確保數(shù)據(jù)信息的有效性保證Web應用的安全性6.2.1輸入校驗的必要性輸入校驗分為兩部分:客戶端校驗:通常使用腳本語言校驗,例如JavaScript。校驗輸入信息是否滿足一定的要求或滿足一定的結構,如校驗輸入的文本是否為空校驗輸入的文本是否是數(shù)字校驗E-mail的格式是否正確優(yōu)點:可以快速提示用戶輸入錯誤,提高響應速度。防止將無效數(shù)據(jù)發(fā)送到服務器,從而減輕服務器的負擔。6.2.1輸入校驗的必要性服務端校驗:通過檢查HTTP請求信息以校驗輸入是否正確有些數(shù)據(jù)必須通過程序交給服務器去處理,校驗注冊的用戶名是否存在校驗登錄的密碼是否正確另一個原因就是如果用戶瀏覽器禁用了腳本執(zhí)行,客戶端校驗就會失效。安全性校驗錯誤登錄次數(shù)限制使用訪問來源校驗實現(xiàn)方式通過Action中的validate()方法使用xWork校驗框架6.2.2

編程方式實現(xiàn)輸入校驗在Action類中手動創(chuàng)建校驗數(shù)據(jù)的代碼,包括:在execute()方法中實現(xiàn)校驗:使用validate()方法實現(xiàn)校驗:實現(xiàn)校驗邏輯與業(yè)務邏輯的分離。validate*()的使用:可以為不同的方法配置其獨立的校驗代碼只需將相同的校驗邏輯放在validate()方法即可。6.2.2編程方式實現(xiàn)輸入校驗validate*()使用的示例:publicclassValidateTestextendsActionSupport{ //省略屬性及其set、get方法

publicStringlogin(){ //用于登錄

return"login"; } publicStringregist(){ //用于注冊

return"regist"; } publicvoidvalidate(){ //相同的校驗

//省略校驗代碼

} publicvoidvalidateLogin(){//只對login()方法的請求執(zhí)行校驗

//省略校驗代碼

} publicvoidvalidateRegist(){//只對regist()方法的請求執(zhí)行校驗

//省略校驗代碼

}}6.2.2

編程方式實現(xiàn)輸入校驗P.170ch6-3工程6.2.3通過XWork校驗框架實現(xiàn)使用validate方法校驗時,如果Web應用中存在大量Action就需要多次重寫validate方法,這使得代碼非常繁瑣。Struts2的校驗框架本質上是基于XWork的validator框架,因此可以使用XWork的validator框架來對Struts2進行數(shù)據(jù)校驗,以減少代碼量。使用XWork的validator框架實現(xiàn)數(shù)據(jù)校驗,只需編寫一個簡單的驗證文件即可。

6.2.3通過XWork校驗框架實現(xiàn)修改ch6-3的例子將LoginAction.java中的validate()方法和validateLog()方法刪除在com.action包下創(chuàng)建驗證文件LoginAction-validation.xml文件6.2.3通過XWork校驗框架實現(xiàn)驗證文件的幾個關鍵問題命名規(guī)則校驗配置方式校驗器6.2.3通過XWork校驗框架實現(xiàn)命名規(guī)則actionName-validation.xml,actionName是指需要校驗的Action的類名,且該文件與Action類同路徑當用戶提交請求后,系統(tǒng)會自動加載該文件完成對用戶請求的校驗。當一個Action中有多個業(yè)務處理方法,需要多個校驗邏輯時,定義校驗文件actionName-methodName-validation.xml6.2.3通過XWork校驗框架實現(xiàn)Struts2框架的數(shù)據(jù)校驗步驟Struts2框架中的類型轉換器對HTTP請求的數(shù)據(jù)進行數(shù)據(jù)類型轉換,得到符合類型的值使用Struts2中的Xwork校驗框架進行校驗調用validateX()方法進行數(shù)據(jù)校驗調用validate()方法進行數(shù)據(jù)校驗6.2.3通過XWork校驗框架實現(xiàn)兩種配置校驗文件的方式字段校驗方式(Field-valiator)針對字段或屬性,在校驗時任何一個字段都能夠返回一個明確的消息。非字段校驗方式(Non-Fieldvalidator)將字段有效地組合到一起,不能對一個字段返回一個明確的消息。6.2.3通過XWork校驗框架實現(xiàn)字段校驗方式<fieldname="birth"><field-validatortype="date"><!--下面指定日期字符串時,必須使用本Locale的日期格式--><paramname="min">1900-01-01</param><paramname="max">2050-02-21</param><message>生日必須在${min}到${max}之間</message></field-validator></field>被校驗的字段校驗器名為校驗器指定校驗參數(shù)校驗失敗后的提示信息6.2.3通過XWork校驗框架實現(xiàn)非字段方式<!—指定校驗器名--><validatortype="date"><!--使用該校驗器校驗birth屬性--><paramname="fieldName">birth</param><!--指定日期校驗器的范圍--><paramname="min">1900-01-01</param><paramname="max">2050-02-21</param><!--指定校驗失敗后的輸出birth.rang對應的國際化信息--><messagekey="birth.range"/></validator>6.2.3通過XWork校驗框架實現(xiàn)校驗器(valiator)requiredvalidator(必填校驗器)requiredstringvalidator(必填字符串校驗器)stringlengthvalidator(字符串長度校驗器)regexvalidator(表達式校驗器)emailvalidator(郵件校驗器)urlvalidator(網(wǎng)址校驗器)intvalidator(整數(shù)校驗器)doublevalidator(雙精度數(shù)校驗器)6.2.2編寫校驗規(guī)則文件利用Struts2的校驗框架進行輸入驗證例子:basicValidate無需對程序代碼做任何改變,只需編寫校驗規(guī)則文件。regist.jspRegistAction.javaRegistAction-validation.xmlstruts.xml6.3國際化支持程序國際化是商業(yè)系統(tǒng)的一個基本要求今天的軟件系統(tǒng)不再是簡單的單機程序,往往都是一個開放系統(tǒng)。需要面對來自全世界各個地方的瀏覽者。因此,國際化是商業(yè)系統(tǒng)中不可缺少的一部分。Struts2的國際化是建立在Java國際化的基礎上通過提供不同國家/語言環(huán)境的消息資源,然后通過ResourceBuddle加載指定Locale對應的資源文件,再取得該資源文件中指定key對應的消息。Struts2框架對Java程序國際化進行了進一步的封裝,從而簡化了應用程序的國際化。6.3.1國際化實現(xiàn)原理國際化即通常所說的i18n(Internationalization),是指程序能夠在不修改內部代碼的前提下,根據(jù)不同的語言以及地區(qū)顯示相應的界面。國際化中涉及到的幾個概念:國際化資源文件:保存各種版本語言編寫的消息。程序擁有自動選擇國際化資源文件的功能。Locale:對應區(qū)域/語言等信息。ResourceBundle:用來加載國際化資源。I18nInterceptor:Struts2提供的國際化攔截器,負責處理Locale相關信息。6.3.1國際化實現(xiàn)原理修改瀏覽器語言設置修改瀏覽器語言設置6.3.2準備國際化資源文件Struts2的國際化資源文件以.properties結尾,文件名前綴可以任意命名。習慣上命名方式有以下3種:文件名前綴.properties。文件名前綴_語言種類.properties。文件名前綴_語言種類_國家代碼.properties語言代碼字段必須是有效的ISO(InternationalStandardizationOrganization,國際標準化組織)語言代碼,ISO-639標準定義的這些代碼格式為英文小寫、雙字符。6.3.2準備國際化資源文件國家代碼字段語言語言代碼國家代碼漢語(Chinese)ZhCN英語(English)EnUS法語(French)FrFR德語(German)deDE日語(Japanese)jaJP意大利語(Italian)itIT6.3.2準備國際化資源文件國際化資源文件的內容結構“key”=“value”“key”對應消息名,可以任意命名,“value”則應該是同一信息不同的語言表示,對于不同語言的配置文件,“key”都是一致的而“value”的內容不同。

漢語的配置文件內容為: hello=你好 英語的配置文件內容為: hello=hello

法語的配置文件內容為: hello=bonjour6.3.2準備國際化資源文件根據(jù)國際化信息的作用范圍可以將國際化資源文件分為3種:全局范圍:包范圍Action范圍6.3.2準備國際化資源文件全局范圍:該資源文件被放置在WEB-INF/classes路徑下,文件信息可以在整個工程范圍內被使用。它在“struts.xml”中配置方式的為:<constantname="struts.custom.i18n.resources"value=""/>屬性value的值為全局范圍資源文件的文件名前綴6.4.2準備國際化資源文件包范圍:該資源文件被放置在對應包的根

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論