版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第四章數(shù)據(jù)類型轉(zhuǎn)換與數(shù)據(jù)驗證上節(jié)回顧
OGNL語言及使用OGNL如何訪問對象
Struts2常用標(biāo)簽的使用UI標(biāo)簽非UI標(biāo)簽主要內(nèi)容Struts2中的數(shù)據(jù)類型轉(zhuǎn)換
Struts2中的數(shù)據(jù)驗證驗證框架的使用Struts2國際化本講目標(biāo)Struts2中的數(shù)據(jù)類型轉(zhuǎn)換
Struts2中的數(shù)據(jù)驗證Struts2國際化OGNL基礎(chǔ)OGNL融入Struts2為什么進行類型轉(zhuǎn)換為什么進行類型轉(zhuǎn)換在基于HTTP協(xié)議的Web應(yīng)用中客戶端請求的所有內(nèi)容都以文本編碼方式傳輸?shù)椒?wù)器端服務(wù)器端的編程語言卻有著豐富的數(shù)據(jù)類型Servlet中,類型轉(zhuǎn)換工作由開發(fā)者自己完成Struts2提供了多種內(nèi)置類型轉(zhuǎn)換器,自動對客戶端傳來的數(shù)據(jù)進行類型轉(zhuǎn)換,另外開發(fā)者可以開發(fā)自定義類型轉(zhuǎn)換器Stringagestr=request.getParameter("age");intage=Integer.parseInt(agestr);通過表單實現(xiàn)信息的錄入,包括名稱、年齡、生日、坐標(biāo)信息其中的年齡、生日、坐標(biāo)分別為整型、日期類型和自定義類型,而不是字符串類型,這會涉及類型轉(zhuǎn)換類型轉(zhuǎn)換實例第一步:定義和配置Action內(nèi)置類型轉(zhuǎn)換器publicclassRegisterActionextendsActionSupport{ privateStringname;
privateintage; privateDatebirthday;
privatePointpoint; ...//省略各個屬性的setter和getter方法}publicclassPoint{ privateintx;//X坐標(biāo)
privateinty;//Y坐標(biāo)
…//省略setter和getter方法}<struts> <packagename="Struts2"extends="struts-default"> <actionname="register" class="cn.jbit.action.RegisterAction"> <resultname="success">success.jsp</result>
<resultname="input">register.jsp</result> </action> </package></struts>第二步:創(chuàng)建頁面錄入頁面register.jsp成功頁面success.jsp內(nèi)置類型轉(zhuǎn)換器<html><head><title>錄入頁面</title></head> <body> <h2>信息錄入</h2> <br/> <s:formaction="register"> <s:textfieldname="name"label="名稱"/> <s:textfieldname="age"label="年齡"/> <s:textfieldname="birthday"label="生日"/> <s:textfieldname="point"label="坐標(biāo)"/> <s:submitvalue="提交"></s:submit> <s:resetvalue="重置"></s:reset> </s:form> </body></html><html> <head> <title>錄入成功</title> </head> <body>
錄入信息如下<br/> <hr>
名稱:<s:propertyvalue="name"/><br>
年齡:<s:propertyvalue="age"/><br>
生日:<s:propertyvalue="birthday"/><br>
坐標(biāo):<s:propertyvalue="point"/><br> </body></html>內(nèi)置類型轉(zhuǎn)換器Struts2提供了一些內(nèi)置類型轉(zhuǎn)換器,可以處理大多數(shù)常用的類型轉(zhuǎn)換
繼承StrutsTypeConverter抽象類繼承org.apache.struts2.util.StrutsTypeConverter類創(chuàng)建自定義類型轉(zhuǎn)換器#將一個或多個字符串值轉(zhuǎn)換為指定的類型publicObjectconvertFromString(Mapcontext,String[]val,ClasstoType)#將指定對象轉(zhuǎn)化為字符串publicStringconvertToString(Mapcontext,Objectobject)應(yīng)用于全局范圍的類型轉(zhuǎn)換器在src目錄創(chuàng)建perties應(yīng)用于特定類的類型轉(zhuǎn)換器在特定類的相同目錄下創(chuàng)建一個名為ClassNperties的屬性文件
配置自定義類型轉(zhuǎn)換器轉(zhuǎn)換類全名=類型轉(zhuǎn)換器類全名特定類的屬性名=類型轉(zhuǎn)換器類全名創(chuàng)建坐標(biāo)類型轉(zhuǎn)換器publicclassPointConverterextendsStrutsTypeConverter{ publicObjectconvertFromString(Mapcontext,String[]values,
ClasstoType){ //獲取X、Y坐標(biāo)
Stringstr=values[0]; Stringxy[]=str.split(","); intx=Integer.parseInt(xy[0]); inty=Integer.parseInt(xy[1]); //構(gòu)建坐標(biāo)對象
Pointpoint=newPoint(); point.setX(x); point.setY(y); returnpoint;//返回坐標(biāo)對象 } publicString
convertToString(Mapcontext,Objectobject){ //將坐標(biāo)對象轉(zhuǎn)換為字符串
Pointpoint=(Point)object; intx=point.getX(); inty=point.getY(); Stringstr="("+x+","+y+")"; returnstr;//返回字符串 }}將字符串轉(zhuǎn)換為坐標(biāo)類型將坐標(biāo)對象轉(zhuǎn)換為字符串應(yīng)用于特定類在RegisterAction類同一個目錄下創(chuàng)建文件RegisterAction-perties
配置坐標(biāo)類型轉(zhuǎn)換器point=cn.jbit.converter.PointConverterAction類中的屬性名,不是類名或其他創(chuàng)建日期類型轉(zhuǎn)換器publicclassDateConverterextendsStrutsTypeConverter{ privatefinalDateFormat[]dfs={
newSimpleDateFormat("yyyy年MM月dd日"), newSimpleDateFormat("yyyy-MM-dd"), newSimpleDateFormat("yyyy/MM/dd")}; publicObjectconvertFromString(Mapcontext,String[]values, ClasstoType){ StringdateStr=values[0];//獲取日期的字符串
for(inti=0;i<dfs.length;i++){//遍歷日期支持格式,進行轉(zhuǎn)換
try{ returndfs[i].parse(dateStr); }catch(Exceptione){ continue;
} }
thrownewTypeConversionException(); } publicStringconvertToString(Mapcontext,Objectobject){ Datedate=(Date)object; //輸出的格式是yyyy-MM-dd returnnewSimpleDateFormat("yyyy-MM-dd").format(date); }}將指定格式字符串轉(zhuǎn)換為日期類型將日期轉(zhuǎn)換為指定格式字符串支持轉(zhuǎn)換的多種日期格式應(yīng)用于全局范圍src目錄下創(chuàng)建文件perties
配置日期類型轉(zhuǎn)換器java.util.Date=cn.jbit.converter.DateConverterDate類的完整類名,而不是屬性名birthday或其他如果在錄入界面中輸入了錯誤格式的內(nèi)容,比如年齡、日期、坐標(biāo)都隨意輸入字符串,會出現(xiàn)什么情況呢?處理類型轉(zhuǎn)換錯誤向用戶輸出類型轉(zhuǎn)換錯誤的前提條件啟動StrutsConversionErrorInterceptor攔截器攔截器已經(jīng)包含在defaultStack攔截器棧中Action要繼承ActionSupport類其實是要實現(xiàn)ValidationAware接口配置input結(jié)果映射頁面使用Struts2表單標(biāo)簽或<s:fielderror>標(biāo)簽Struts2表單標(biāo)簽內(nèi)嵌了輸出錯誤信息功能普通HTML標(biāo)簽需使用<s:fielderror>標(biāo)簽輸出轉(zhuǎn)換錯誤處理類型轉(zhuǎn)換錯誤修改所有類型的轉(zhuǎn)換錯誤信息思路修改xwork.default.invalid.fieldvalue鍵的值處理類型轉(zhuǎn)換錯誤實現(xiàn)在struts.xml中指定資源文件的基名在src目錄下創(chuàng)建資源文件并修改鍵值 xwork.default.invalid.fieldvalue =字段“{0}”的值無效<constantname="struts.custom.i18n.resources" value="message"/>定制特定字段的類型轉(zhuǎn)換錯誤信息思路在Action范圍的資源文件中添加I18N消息鍵invalid.fieldvalue.xxx處理類型轉(zhuǎn)換錯誤實現(xiàn)在RegisterAction相同包下創(chuàng)建RegisterAperties,指定鍵值
invalid.fieldvalue.birthday=生日轉(zhuǎn)換錯誤對用戶登錄添加表單驗證功能Struts2提供了數(shù)據(jù)驗證機制,需要繼承ActionSupport類來完成Action開發(fā)ActionSupport類不僅對Action接口進行簡單實現(xiàn),同時增加了驗證、本地化等支持Struts2的數(shù)據(jù)校驗修改LoginActionStruts2的數(shù)據(jù)校驗publicclassLoginActionextendsActionSupport{ … publicvoidvalidateExecute(){ if(“admin".equals(username)&&“123".equals(password)){ Map<String,Object>session= ActionContext.getContext().getSession(); if(session.containsKey(CURRENT_USER)){
session.remove(CURRENT_USER); } session.put(CURRENT_USER,username); }else{
super.addActionError("用戶名為空,或用戶名密碼不匹配。"); } } publicStringexecute(){
returnSUCCESS; }} 繼承ActionSupport驗證出錯,指定錯誤提示信息驗證成功修改JSP頁面Struts2的數(shù)據(jù)校驗<%@taglibprefix="s"uri="/struts-tags"%>…<div>
<s:actionerror/></div><s:formaction="/login.action"> <div>
用戶名:
<s:textfieldname="username"/> </div> <div>
密
碼:
<s:passwordname="password"/> </div> <inputtype="submit"value="提交"/></s:form> 顯示服務(wù)器返回的錯誤信息修改struts.xml文件Struts2的數(shù)據(jù)校驗…<struts> <!--設(shè)置用戶界面主題,默認(rèn)值為xhtml風(fēng)格--> <constantname="struts.ui.theme"value="simple"/> <packagename="default"namespace="/"extends="struts-default"> <actionname="login"class="cn.jbit.strutsdemo.LoginAction"> <resultname="success">/success.jsp</result>
<resultname="input">/login.jsp</result>
</action> </package></struts>“input”結(jié)果:指定用戶輸入不能通過驗證時的返回頁面對用戶注冊功能進行驗證用戶名:不能為空,長度在6和10之間密碼:不能為空,密碼長度>=6確認(rèn)密碼:必須和密碼相同電話:不能為空,符合電話號碼格式用戶姓名:不能為空,長度在2和4之間使用驗證框架進行驗證用戶無需編碼,在外部配置文件中指定某個字段的驗證類型,并提供出錯信息即可使用驗證框架可以減輕開發(fā)者負(fù)擔(dān),提高開發(fā)效率驗證框架第一步:創(chuàng)建RegisterAction實現(xiàn)對用戶注冊的處理第二步:在struts.xml中配置action通過“input”指定驗證錯誤時需返回的頁面驗證框架publicclassRegisterActionextendsActionSupport{
privateUseruser;//用戶信息
privateStringrepassword; //確認(rèn)密碼
… publicStringexecute(){ returnSUCCESS; }}<actionname="register"class="cn.houserent.action.RegisterAction"> <resultname="success">/index.jsp</result>
<resultname="input">/page/register.jsp</result></action>第三步:創(chuàng)建注冊頁面register.jsp第四步:創(chuàng)建驗證文件驗證框架<s:formaction="register"> <s:textfieldname=""label="用戶名"/> <s:passwordname="user.password"label="密碼"/> <s:passwordname="repassword"label="確認(rèn)密碼"/> <s:textfieldname="user.telephone"label="電話"/> <s:textfieldname="user.username"label="用戶姓名"/> <s:submitvalue="立即注冊"></s:submit></s:form><?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEvalidatorsPUBLIC "-//OpenSymphonyGroup//XWorkValidator1.0.2//EN"
"/xwork/xwork-validator-1.0.2.dtd"><validators></validators>
第五步:使用驗證框架編寫驗證規(guī)則用戶名:不能為空,長度在6和10之間驗證框架<validators> <fieldname=""> <field-validatortype="requiredstring"> <paramname="trim">true</param> <message>用戶名不能為空</message> </field-validator>
<field-validatortype="stringlength"> <paramname="maxLength">10</param> <paramname="minLength">6</param> <message>用戶名長度須在${minLength}和 ${maxLength}之間</message> </field-validator> </field> </validators>第五步:使用驗證框架編寫驗證規(guī)則密碼:不能為空,密碼長度>=6密碼和確認(rèn)密碼必須一致驗證框架<validators> <fieldname="user.password"> … </field> <fieldname="repassword"> … <field-validatortype="fieldexpression"> <paramname="expression">
user.password==repassword </param> <message>密碼和確認(rèn)密碼必須相同</message> </field-validator> </field> </validators>第五步:使用驗證框架編寫驗證規(guī)則電話號碼:不能為空,符合電話號碼格式驗證框架<validators> <fieldname="user.telephone"> <field-validatortype="requiredstring"> <message>電話號碼不能為空</message> </field-validator> <field-validatortype="regex"> <paramname="expression">
^(\d{3,4}-){0,1}(\d{7,8})$ </param> <message>電話號碼格式不正確</message> </field-validator> </field></validators>國際化(Internationalization:I18N)使程序在不做任何修改的情況下,可以在不同國家或地區(qū)和不同語言環(huán)境下,按照當(dāng)?shù)氐恼Z言和格式習(xí)慣顯示字符本地化(Localization:L10N)一個國際化的程序,當(dāng)它運行在本地機器時,能夠根據(jù)本地機器的語言和地區(qū)設(shè)置顯示相應(yīng)字符國際化和本地化國際化和本地化Java程序的國際化思路將程序中的提示信息、錯誤信息等放在資源文件中,為不同國家/語言編寫對應(yīng)資源文件資源文件由很多key-value對組成,key保持不變,value隨國家/語言不同而不同這些資源文件使用共同的基名,通過在基名后面添加語言代碼、國家和地區(qū)代碼來進行區(qū)分實現(xiàn)對用戶注冊功能的國際化對英文用戶顯示英文界面和驗證錯誤信息對中國香港用戶顯示繁體中文界面和驗證錯誤信息對其他用戶顯示簡體中文界面和驗證錯誤信息實現(xiàn)國際化步驟在struts.xml中指定資源文件的基名及存儲路徑按照需求創(chuàng)建對應(yīng)的三個資源文件,存放相應(yīng)資源實現(xiàn)JSP頁面信息的國際化顯示實現(xiàn)驗證錯誤信息的國際化顯示使用Struts2實現(xiàn)國際化第一步:指定資源文件的基名及存儲路徑第二步:創(chuàng)建對應(yīng)的三個資源文件位置在src目錄下,或者直接在WEB-INF/classes目錄名稱message_pertiesmessage_zh_HK.propertiesperties使用Struts2實現(xiàn)國際化<struts> <constantname="struts.custom.i18n.resources"value="message"/> <constantname="struts.i18n.encoding"value="UTF-8"/> …… </struts>第三步:實現(xiàn)JSP頁面信息的國際化顯示使用Struts2實現(xiàn)國際化<html> <head> <title>
<s:textname="register.page"/> </title> </head> <body> <h2>
<s:textname="register.title"/> </h2> <s:formaction="register"> <s:textfieldname=""key="name"/> <s:passwordname="user.password"key="password"/> <s:passwordname="repassword"label="%{getText('repassword')}"/> <s:textfieldname="user.telephone"label="%{getText('telephone')}"/> <s:textfieldname="user.username"label="%{getText('username')}"/> <s:submitvalue="%{getText('submit')}"/> </s:form> </body></html>注冊頁面#message_pertiesregister.page=HouserRent-UserRegisterregister.title=NewUserRegistername=Name…submit=RegisterNow#message_zh_HK.propertiesregister.page=青鳥租房-用戶註冊register.title=新用戶註冊name=用戶名…submit=立即註冊#pertiesregister.page=青鳥租房-用戶注冊register.title=新用戶注冊name=用戶名…submit=立即注冊資源文件第四步:實現(xiàn)驗證錯誤信息的國際化顯示使用Struts2實現(xiàn)國際化#message_pertiesname.null=Namecannotbenullname.length=Nameshouldbebetween${minLength}and${maxLength}password.null=Passwordcannotbenullpassword.length=Mininumpasswordlengthis${minLength}…#message_zh_HK.propertiesname.null=用戶名不能為空name.length=用戶名長度必須在
${minLength}和${maxLength}之間password.null=密碼長度不能為空password.length=密碼長度必須大於等於${minLength}…#perties
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 17283.2-2026天然氣水分的測定第2部分:用振蕩頻差法測定水含量
- 鐵路車輛制修工崗前實操能力考核試卷含答案
- 抗生素酶裂解工操作安全知識考核試卷含答案
- 船模制作工操作能力考核試卷含答案
- 漿紗漿染工安全培訓(xùn)效果考核試卷含答案
- 水上救生員操作評估競賽考核試卷含答案
- 淀粉及淀粉糖制造工創(chuàng)新應(yīng)用評優(yōu)考核試卷含答案
- 酒店員工工作紀(jì)律與獎懲制度
- 酒店客房鑰匙卡回收管理制度
- 超市員工保密制度
- 2025年秋季散學(xué)典禮校長講話:以四馬精神赴新程攜溫暖期許啟寒假
- 2026貴州省黔晟國有資產(chǎn)經(jīng)營有限責(zé)任公司面向社會招聘中層管理人員2人備考考試試題及答案解析
- 2025年營養(yǎng)師考試練習(xí)題及答案
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會成熟人才招聘備考題庫及答案詳解一套
- 通信工程冬季施工安全培訓(xùn)
- 中醫(yī)外科乳房疾病診療規(guī)范診療指南2023版
- 壓實瀝青混合料密度 表干法 自動計算
- 田口三次設(shè)計
- 《我的戒煙》閱讀答案
- GB/T 7442-2007角向磨光機
- GB/T 324-2008焊縫符號表示法
評論
0/150
提交評論