




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第1講 搭建struts2環(huán)境與簡(jiǎn)單應(yīng)用開發(fā)1. struts2框架l struts2由傳統(tǒng)的struts1和webwork兩個(gè)經(jīng)典mvc框架發(fā)展而來(lái)l struts2是一個(gè)非常優(yōu)秀的mvc框架2. mvc思想概述mvc思想將應(yīng)用中各組件按功能進(jìn)行分類,不同的組件使用不同技術(shù)充當(dāng),甚至推薦了嚴(yán)格分層,不同組件被嚴(yán)格限制在其所在層內(nèi),各層之間以松耦合的方式組織在一起,從而提供良好的封裝。model1(jsp+javabean):jsp頁(yè)面接收處理客戶端請(qǐng)求,對(duì)請(qǐng)求處理后直接做出響應(yīng)。用少量的javabean來(lái)處理數(shù)據(jù)庫(kù)連接、數(shù)據(jù)庫(kù)訪問(wèn)等操作。jsp頁(yè)面身兼view和controller兩種角色,
2、將控制邏輯和表現(xiàn)邏輯混雜在一起,從而導(dǎo)致代碼的重用性低,增加了應(yīng)用的擴(kuò)展和維護(hù)的難度。model2(jsp+servlet+javabean):屬于mvc架構(gòu)的設(shè)計(jì)模式。mvc思想將一個(gè)應(yīng)用分為三個(gè)基本部分:model(模型)、view(視圖)、controller(控制器),這三個(gè)部分以最少的耦合協(xié)同工作,從而提高應(yīng)用的可擴(kuò)展性和維護(hù)性。mvc有如下特點(diǎn):l 多個(gè)視圖對(duì)于一個(gè)模型,一旦模型發(fā)生變化,易于維護(hù);l 模型返回的數(shù)據(jù)與顯示邏輯分離;l 應(yīng)用被分隔為三層,降低了各層之間的耦合,提供了應(yīng)用的可擴(kuò)展性;l 控制層的概念也很有效,由于它把不同的模型和不同的視圖組合在一起,完成不同的請(qǐng)求。因
3、此,控制層可以說(shuō)是包含了用戶權(quán)限的概念;l mvc更符合軟件工程化管理的精神。3. struts2的下載和安裝下載并搭建struts2環(huán)境:(1). 下載struts2.2.1;(2). 找到開發(fā)struts2應(yīng)用需要使用到的jar文件;(3). 編寫struts2的配置文件;(4). 在web.xml中加入struts2框架的啟動(dòng)配置。開發(fā)struts2最少需要的jar文件:(1). struts2-core-.jar:struts2框架的核心類庫(kù);(2). xwork-core-.jar:xwork類庫(kù),struts2在其上構(gòu)建;(3). ognl-3.0.ja
4、r:對(duì)象圖導(dǎo)航語(yǔ)言(object graph navigation language),一種功能強(qiáng)大的表達(dá)式語(yǔ)言,主要用于讀寫對(duì)象的屬性;(4). freemarker-2.3.16.jar:struts2ui標(biāo)簽的模板使用freemarker編寫;(5). commons-fileupload-1.2.1.jar:文件上傳組件,2.1.6以后版本必須加入此文件;(6). commons-io-1.3.2.jar:io輸入輸出流組件,主要完成文件的讀寫功能;(7). javassist-3.7.ga.jar:javassist是一個(gè)開源的分析、編輯和創(chuàng)建java字節(jié)碼的類庫(kù)。編寫struts2
5、的配置文件struts2默認(rèn)的配置文件為struts.xml,該文件需要存放在web-inf/classes下在web.xml中加入struts2框架的啟動(dòng)配置<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.strutsprepareandexecutefilter</filter-class></filter><filter-mapping><filter-na
6、me>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>struts2框架是通過(guò)filter啟動(dòng)的,在web.xml中配置。在strutsprepareandexecutefilter的init()方法中將會(huì)讀取類路徑下默認(rèn)的配置文件struts.xml完成初始化操作。注意:struts2讀取到struts.xml的內(nèi)容后,以javabean的形式存放在內(nèi)存中,以后struts2對(duì)用戶的每次請(qǐng)求處理將使用內(nèi)存中的數(shù)據(jù),而不是每次都讀取struts.xml文件
7、。4. strus2簡(jiǎn)單應(yīng)用開發(fā)4.1 helloworld目標(biāo):點(diǎn)擊超鏈接,發(fā)出請(qǐng)求,在請(qǐng)求中存數(shù)據(jù),在另一個(gè)頁(yè)面中顯示存入的數(shù)據(jù)。l jsp+servlet實(shí)現(xiàn)l struts實(shí)現(xiàn)總結(jié):l package用來(lái)管理action,主要用于管理一組業(yè)務(wù)功能相關(guān)的action。l name屬性:必須有并要求name屬性值唯一,它不對(duì)應(yīng)java的類包。l namespace屬性:定義包的命名空間,命名空間是訪問(wèn)該包下action的路徑一部分。l 只有當(dāng)包都繼承了struts-default包,才可以使用struts2的核心功能。l abstract="true"表示該包為抽象包,
8、不能包含actionl struts2中action的默認(rèn)后綴為.action目標(biāo):struts如何實(shí)現(xiàn)簡(jiǎn)單轉(zhuǎn)發(fā) - action配置的各項(xiàng)默認(rèn)值。l 如果沒(méi)有為action指定class,默認(rèn)是actionsupport;l 如果沒(méi)有為action指定method,默認(rèn)執(zhí)行action中的execute()方法;l 如果沒(méi)有指定result的name屬性,默認(rèn)值是success4.2 登錄目標(biāo):輸入用戶名、密碼,成功跳轉(zhuǎn)到成功頁(yè)面,失敗返回登錄頁(yè)面。l jsp+servlet實(shí)現(xiàn)l 表單+actionl struts標(biāo)簽+actionl 國(guó)際化總結(jié):l 添加國(guó)際化配置<constant
9、 name="struts.custom.i18n.resources" value="mess"/>l 添加國(guó)際化文件perties、mess_zh_cn.properties、mess_en_us.propertiesl 修改internet選項(xiàng)第2講 struts2處理流程與常規(guī)配置1.struts2應(yīng)用開發(fā)步驟(1). 在web.xml文件中定義核心filter來(lái)攔截用戶請(qǐng)求。(2). 如果需要以post方法提交請(qǐng)求,則定義包含表單數(shù)據(jù)的jsp頁(yè)面。如果僅僅只是以get方式發(fā)送請(qǐng)求,則無(wú)須此步驟。(3). 定義處理用戶請(qǐng)求的
10、action類。(4). 配置action。(5). 配置處理結(jié)果和物理視圖資源之間的對(duì)應(yīng)關(guān)系。(6). 編寫視圖資源。如果action需要把數(shù)據(jù)傳給視圖資源,則可以借助于ognl表達(dá)式。2.struts2的處理流程l 控制器包括核心控制器和業(yè)務(wù)控制器l 業(yè)務(wù)控制器與物理視圖解耦:若需要將某個(gè)視圖名映射到不同視圖資源,無(wú)須修改xxxaction的代碼,只需修改配置文件。3.struts常量配置l struts.i18n.encoding:指定web應(yīng)用的默認(rèn)編碼集,相當(dāng)于request.setcharacterencoding()。l struts.custom.i18n.resources:
11、指定國(guó)際化資源文件的basenamel struts.action.extension:需要struts處理的請(qǐng)求后綴,默認(rèn)值為action,可以指定多個(gè)l struts.server.static.browsercache:設(shè)置瀏覽器是否緩存靜態(tài)內(nèi)容,默認(rèn)值為true,開發(fā)時(shí)應(yīng)設(shè)為falsel struts.configuration.xml.reload:當(dāng)struts的配置文件修改后,系統(tǒng)是否自動(dòng)重新加載該文件,開發(fā)時(shí)應(yīng)設(shè)為truel struts.devmode:設(shè)置struts2應(yīng)用是否為開發(fā)模式,打印出更詳細(xì)的信息備注:l 哪些常量是有效的?在struts2-core2.2.1.j
12、ar壓縮文件的orgapachestruts路徑下的perties文件中定義。l struts2默認(rèn)會(huì)加載struts.xml、struts-default.xml、struts-plugin.xml三個(gè)配置文件n struts.xml是開發(fā)者定義的默認(rèn)配置文件n struts-default.xml是struts框架自帶的配置文件n struts-plugin.xml是struts插件的默認(rèn)配置文件n 加載順序?yàn)閟truts-default.xml、struts-plugin.xml、struts.xmll struts2常量配置有三種方式n 通過(guò)struts.xml配
13、置文件n 通過(guò)perties文件n 通過(guò)web.xml文件l struts2的所有配置文件(包括用戶自定義配置文件)都可以用來(lái)配置常量,推薦struts.xmll struts2搜索常量的順序?yàn)閟truts-default.xml、struts-plugin.xml、struts.xml、perties、web.xml,如果在多個(gè)文件中配置了同一個(gè)struts2常量,則后一個(gè)會(huì)覆蓋前一個(gè)4.包含其他配置文件l 為了避免struts.xml文件過(guò)于龐大,提高struts.xml文件的可讀性,可以將一個(gè)struts.xml文件分解成多個(gè)配置文件,在strut
14、s.xml中包含其他配置文件l <include file=”struts-part1.xml”/>第3講 實(shí)現(xiàn)和配置action1.action接口和actionsupport類l action類里的屬性,不僅可用于封裝請(qǐng)求參數(shù),還可用于封裝處理結(jié)果l 為了讓用戶開發(fā)的action類更規(guī)范,struts2提供了一個(gè)action接口l actionsupport類是action接口的實(shí)現(xiàn)類,如果開發(fā)者的action繼承了actionsupport類,則會(huì)大大簡(jiǎn)化action的開發(fā)l actionsupport類是action的默認(rèn)處理類2.action訪問(wèn)servlet apil
15、action訪問(wèn)servlet api是必要的l web應(yīng)用中經(jīng)常訪問(wèn)的servlet api有httpservletrequest、httpservletsession和httpservletcontext,對(duì)應(yīng)于jsp內(nèi)置對(duì)象request、session、applicationl struts2提供了一個(gè)actioncontext類,用于action訪問(wèn)servlet apin object get(object key):request.getattribute(string name)n map getapplication():返回一個(gè)map對(duì)象,該對(duì)象模擬了servletcont
16、ext實(shí)例n map getsession():返回一個(gè)map對(duì)象,該對(duì)象模擬了httpsession實(shí)例n static actioncontext getcontext():獲取系統(tǒng)的actioncontext實(shí)例l 實(shí)例:測(cè)試action訪問(wèn)servlet apin 實(shí)現(xiàn)登錄功能,返回success或errorn 用application實(shí)現(xiàn)簡(jiǎn)單計(jì)數(shù)器n 用session保存用戶名n 用request保存提示信息(tip)l action既可以徹底與servlet api分離,也可以用簡(jiǎn)單的方式操作request、session、application范圍的屬性3.action直接訪問(wèn)s
17、ervlet apil 為了在action中直接訪問(wèn)servlet api,struts2提供了如下接口:n servletcontextaware:實(shí)現(xiàn)接口的action可以直接訪問(wèn)servletconext實(shí)例n servletrequestaware:實(shí)現(xiàn)接口的action可以直接訪問(wèn)httpservletrequest實(shí)例n servletresponseaware:實(shí)現(xiàn)接口的action可以直接訪問(wèn)httpservletresponse實(shí)例l 實(shí)例:通過(guò)httpservletresponse為系統(tǒng)添加cookie對(duì)象,實(shí)現(xiàn)自動(dòng)登錄l 即使獲得httpservletresponse對(duì)象
18、,也不要嘗試直接在action中對(duì)客戶端生成響應(yīng)4.使用servletactioncontext訪問(wèn)servlet api5. 配置actionl 包和命名空間n struts2使用包來(lái)組織action,action是struts2的基本“程序單位”n 配置<package />元素時(shí)必須指定name屬性,該屬性是引用該包的唯一標(biāo)識(shí)n extends屬性值必須是另一個(gè)包的name屬性n 因?yàn)閟truts2的配置文件是從上到下處理的,所以父包應(yīng)該在子包前面定義n 命名空間主要是為了處理同一個(gè)web應(yīng)用中包含同名action的情形。同一個(gè)命名空間里不能有同名的action,不同命名空間
19、里可以有同名的actionn struts搜索命名空間的順序u 命名空間只有一個(gè)級(jí)別。如果請(qǐng)求的url是/bookservice/search/get.action,系統(tǒng)將先在/bookservice/search的命名空間(存在)下查找名為get的action,如果在該命名空間內(nèi)找到名為get的action,則由該action處理用戶請(qǐng)求;如果在該命名空間內(nèi)沒(méi)有找到名為get的action,系統(tǒng)將直接進(jìn)入默認(rèn)的命名空間中查找名為get的actin,而不會(huì)在/bookservice的命名空間下查找名為get的action。u 默認(rèn)命名空間和根命名空間的區(qū)別:默認(rèn)命名空間可以處理任何命名空間下的
20、action請(qǐng)求,根命名空間只會(huì)處理根命名空間下的請(qǐng)求。l action的基本配置n 定義<action />元素時(shí),需要指定name屬性,name默認(rèn)不允許使用“/”,如果想使用“/”,需要設(shè)置struts.enable.slashesinactionnames=truel 使用action的動(dòng)態(tài)方法調(diào)用n 動(dòng)態(tài)方法調(diào)用允許在一個(gè)action內(nèi)包含多個(gè)控制處理邏輯n 使用動(dòng)態(tài)方法調(diào)用,應(yīng)該確保struts.enable.dynamicmethodinvocation = truefunction regist()var myform = document.forms0;myfor
21、m.action = "login!regist"<input type="submit" value="注冊(cè)" onclick="regist()"/>l 指定method屬性及使用通配符n 使用method屬性實(shí)現(xiàn)一個(gè)action包含多個(gè)處理邏輯n 使用通配符簡(jiǎn)化struts.xml配置n 通配符可以在method、class和result中使用n 不建議超鏈接直接連接到某個(gè)視圖資源,建議將所有請(qǐng)求都交給struts框架處理n <action name=”*”><result>
22、;/1.jsp</result></action>第4講 配置result和異常處理1.配置resultl 理解處理結(jié)果n <result/>元素定義邏輯視圖和物理視圖之間的映射關(guān)系n 瀏覽者、控制器和視圖資源之間的順序圖如下:l struts2支持的結(jié)果類型n dispatcher:指定使用jsp作為視圖的結(jié)果類型(默認(rèn)值)n redirect:直接跳轉(zhuǎn)到其它url的結(jié)果類型n redirectaction:直接跳轉(zhuǎn)到其它action的結(jié)果類型n plaintext:用于顯示某個(gè)頁(yè)面的原始代碼的結(jié)果類型l plaintext結(jié)果類型n location:指
23、定實(shí)際的資源視圖n charset:指定輸出頁(yè)面時(shí)所使用的字符集<result name="source" type="plaintext"><param name="location">/xxx.jsp</param><param name="charset">utf-8</param>不設(shè)置該選項(xiàng)易出現(xiàn)中文亂碼</result>l redirect結(jié)果類型與dispatcher的區(qū)別:n 重定向會(huì)丟失所有的請(qǐng)求參數(shù)、請(qǐng)求屬性和action處
24、理結(jié)果n 重定向地址欄會(huì)發(fā)生變化l redirectaction結(jié)果類型:直接將請(qǐng)求重定向到另一個(gè)actionn actionname:指定重定向的action名n namespace:指定重定向的action所在的命名空間n 包括同一命名空間的重定向和不同命名空間的重定向l 全局結(jié)果n 使用<global-results/>標(biāo)簽定義n 如果一個(gè)action包含了與全局結(jié)果同名的結(jié)果集,則action里的局部result會(huì)覆蓋全局result。2. 異常處理l 在action中手動(dòng)處理異常,缺點(diǎn):異常處理與代碼耦合,一旦需要改變異常處理方式,必須修改代碼!l struts2中的聲明
25、式異常:以聲明式的方式管理異常處理n action接口中execute方法簽名n 在struts.xml中配置異常處理n 前提:打開struts2的異常處理功能<interceptor name="exception" class="erceptor.exception mappinginterceptor"/><interceptor-stack name="basicstack"><interceptor-ref name="except
26、ion"/>.</interceptor-stack>l 聲明式異常捕獲n 在struts.xml文件中配置<exception-mappting/>元素u exception:指定異常類型u result:指定邏輯視圖名n 異常映射u 局部異常映射:<action />元素的子元素u 全局異常映射:<global-exception-mappint/>元素的子元素n 實(shí)例:u 拋出myexception和sqlexception<global-results><!- 定義當(dāng)sql、root兩個(gè)邏輯異常都對(duì)應(yīng)ex
27、ception.jsp頁(yè) -><result name="sql">/exception.jsp</result><result name="root">/exception.jsp</result></global-results><!- 定義全局異常映射 -><global-exception-mappings><!- 當(dāng)action中遇到sqlexception異常時(shí),系統(tǒng)將轉(zhuǎn)入name為sql的結(jié)果中-><exception-mapping
28、 exception="java.sql.sqlexception" result="sql"/><!- 當(dāng)action中遇到exception異常時(shí),系統(tǒng)將轉(zhuǎn)入name為root的結(jié)果中-><exception-mapping exception="java.lang.exception" result="root"/></global-exception-mappings><action name="login" class="org
29、.crazyit.app.action.loginaction"><!- 定義局部異常映射, 當(dāng)action中遇到myexception異常時(shí),系統(tǒng)將轉(zhuǎn)入name為my的結(jié)果中-><exception-mapping exception="org.crazyit.app.exception.myexception"result="my"/><!- 定義三個(gè)結(jié)果映射 -><result name="my">/exception.jsp</result><r
30、esult name="error">/error.jsp</result><result name="success">/welcome.jsp</result></action>n 全局異常映射的result屬性值通常不要使用局部結(jié)果,局部異常映射的result屬性值既可以使用全局結(jié)果,也可以使用局部結(jié)果l 輸出異常信息n <s:property value=”exception”/>n <s:proterty value=”exceptionstack”/>第5講 str
31、uts2的國(guó)際化1. 加載全局資源文件l 配置basename:<constant name="struts.custom.i18n.resources" value="sandy"/>2. 訪問(wèn)國(guó)際化消息l 用<s:text/>輸出國(guó)際化消息. <s:text name="key"/>l 用表單元素輸出國(guó)際化信息(key屬性)l 在action中輸出國(guó)際化消息. actionsupport類的gettext方法3. 輸出帶占位符的國(guó)際化消息l 在jsp頁(yè)面中填充國(guó)際化消息里的占位符<s:te
32、xt name="title"><s:param><s:property value="username"/></s:param> <s:param><s:property value="username"/></s:param></s:text>l 在action中填充國(guó)際化消息里的占位符. gettext(string atextname,list args). gettext(string key, string args)4. 加載資源文
33、件的方式l 包范圍資源文件. 在包的根路徑下建立多個(gè)文件名為package_lauguage_perties的文件. action優(yōu)先使用包范圍的資源文件l action范圍資源文件. 在action類所在路徑建立actionname_language_perties文件. action優(yōu)先加載action范圍資源文件. action范圍的資源文件,允許不同action使用相同的key表示不同的字符串l 臨時(shí)指定資源文件. 借助于<s:i18n/>標(biāo)簽,在jsp頁(yè)面輸出國(guó)際化消息時(shí)指定國(guó)際化資源的位置. <s:i18n name=”
34、basename”></s:i18n>第6講 struts2的類型轉(zhuǎn)換1.問(wèn)題的提出l struts2框架需要解析http請(qǐng)求參數(shù),并將請(qǐng)求參數(shù)傳給控制器組件。l 問(wèn)題:http請(qǐng)求參數(shù)都是字符串類型,action中定義的是java數(shù)據(jù)類型,struts2框架必須將這些字符串參數(shù)轉(zhuǎn)換成相應(yīng)的數(shù)據(jù)類型。2.struts2內(nèi)建的類型轉(zhuǎn)換器l boolean和booleanl char和characterl int和integerl long和longl float和floadl double和doublel date:日期格式使用用戶請(qǐng)求所在locale的short格式l 數(shù)組:
35、在默認(rèn)情況下,數(shù)組元素是stringl 集合:在默認(rèn)情況下,假定集合元素類型為string,創(chuàng)建一個(gè)新的arraylist封裝所有的字符串l com.opensymphony.xwork2.conversion.impl.xworkbasicconverter(內(nèi)置類型轉(zhuǎn)換類)3.基于ognl的類型轉(zhuǎn)換l username 賦值給action中屬性名為username的屬性l bean.firstname 賦值給action中屬性名為bean對(duì)象的firstname屬性4.自定義類型轉(zhuǎn)換器l 需求:實(shí)現(xiàn)username,password與user類型之間的轉(zhuǎn)換l 自定義類型轉(zhuǎn)換器需要繼承def
36、aulttypeconverter類/類型轉(zhuǎn)換器必須重寫convertvalue方法,該方法需要完成雙向轉(zhuǎn)換public object convertvalue(map context, object value, class totype)/當(dāng)需要將字符串向user類型轉(zhuǎn)換時(shí)if (totype = user.class )/系統(tǒng)的請(qǐng)求參數(shù)是一個(gè)字符串?dāng)?shù)組string params = (string)value;/創(chuàng)建一個(gè)user實(shí)例user user = new user();/只處理請(qǐng)求參數(shù)數(shù)組第一個(gè)數(shù)組元素,/并將該字符串以英文逗號(hào)分割成兩個(gè)字符串string uservalues
37、= params0.split(",");/為user實(shí)例賦值user.setname(uservalues0);user.setpass(uservalues1);/返回轉(zhuǎn)換來(lái)的user實(shí)例return user;else if (totype = string.class )/將需要轉(zhuǎn)換的值強(qiáng)制類型轉(zhuǎn)換為user實(shí)例user user = (user) value;return "<" + user.getname() + ","+ user.getpass() + ">" return null
38、;5. 注冊(cè)類型轉(zhuǎn)換器l struts2支持三種方式來(lái)注冊(cè)類型轉(zhuǎn)換器. 注冊(cè)局部類型轉(zhuǎn)換器:僅僅對(duì)某個(gè)action的屬性起作用. 注冊(cè)全局類型轉(zhuǎn)換器:對(duì)所有action的特定類型的屬性都會(huì)生效. 用注解來(lái)注冊(cè)類型轉(zhuǎn)換器:通過(guò)注解方式來(lái)注冊(cè)類型轉(zhuǎn)換器l 局部類型轉(zhuǎn)換器. 注冊(cè)局部類型轉(zhuǎn)換器使用局部類型轉(zhuǎn)換文件指定. 局部類型轉(zhuǎn)換文件的文件名應(yīng)為actionnperties形式. 類型轉(zhuǎn)換文件應(yīng)該和action類文件放在相同的位置. 內(nèi)容:<propname>=<converterclass>l 全局類型轉(zhuǎn)換器. 全局類型轉(zhuǎn)換器對(duì)指定類型
39、的屬性起作用. 文件名:perties. 放在web-inf/classes路徑下. 內(nèi)容:<proptype>=<converterclass>l 用注解注冊(cè)類型轉(zhuǎn)換器. typeconversion(converter="com.xawx.web.converter.hyphenconverter")6. 基于struts2的自定義類型轉(zhuǎn)換器l struts2提供了一個(gè)strutstypeconverter抽象類,該抽象類是defaulttypeconverter的子類,strutstypeconverte
40、r類簡(jiǎn)化了類型轉(zhuǎn)換器的實(shí)現(xiàn)public class userconverter extends strutstypeconverter /實(shí)現(xiàn)將字符串類型轉(zhuǎn)換成復(fù)合類型的方法public object convertfromstring(map context, string values , class toclass)/創(chuàng)建一個(gè)user實(shí)例user user = new user();/只處理請(qǐng)求參數(shù)數(shù)組第一個(gè)數(shù)組元素,/并將該字符串以英文逗號(hào)分割成兩個(gè)字符串string uservalues = values0.split(",");/為user實(shí)例賦值user.se
41、tname(uservalues0);user.setpass(uservalues1);/返回轉(zhuǎn)換來(lái)的user實(shí)例return user;/實(shí)現(xiàn)將復(fù)合類型轉(zhuǎn)換成字符串類型的方法public string converttostring(map context, object o)/將需要轉(zhuǎn)換的值強(qiáng)制類型轉(zhuǎn)換為user實(shí)例user user = (user) o;return "<" + user.getname() + ","+ user.getpass() + ">"第7講 struts2的輸入校驗(yàn)1.關(guān)于輸入校驗(yàn)l
42、為什么學(xué)習(xí)輸入校驗(yàn)?. 輸入校驗(yàn)是所有web應(yīng)用必須處理的問(wèn)題。. 通過(guò)輸入頁(yè)面收集的數(shù)據(jù)既有正常用戶的誤輸入,也有惡意用戶的惡意輸入。. 健壯的系統(tǒng)必須將這些非法輸入阻止在應(yīng)用之外,防止非法輸入進(jìn)入系統(tǒng)。l 輸入校驗(yàn):捕獲異常輸入時(shí),應(yīng)用程序直接返回,提示瀏覽者必須重新輸入。l 輸入校驗(yàn)分為客戶端校驗(yàn)和服務(wù)器端校驗(yàn)。. 客戶端校驗(yàn):過(guò)濾正常用戶的誤操作,主要通過(guò)javascript代碼完成。. 服務(wù)器端校驗(yàn):通過(guò)在應(yīng)用中編程實(shí)現(xiàn),是整個(gè)應(yīng)用阻止非法數(shù)據(jù)的最后防線。2.基于xml配置方式的輸入校驗(yàn)l 使用struts的校驗(yàn)框架進(jìn)行校驗(yàn),無(wú)須對(duì)程序代碼進(jìn)行任何改變,只需編寫校驗(yàn)規(guī)則文件即可,校驗(yàn)
43、規(guī)則文件指定每個(gè)表單域應(yīng)該滿足怎么的規(guī)則。l 需求:表單驗(yàn)證. name和pass只能是字母、數(shù)字和下劃線,且長(zhǎng)度必須在4到25之間;. age必須在1-150之間;. birth必須在1900-01-01 2050-02-21之間。l 為action指定校驗(yàn)文件. actionclassname-validation.xml. 保存在與action class文件相同的路徑下l 編寫輸入校驗(yàn)文件:com.opensymphony.xwork2.validator.validators下的default.xml中找到<?xml version="1.0" encodi
44、ng="gbk"?><!- 指定校驗(yàn)配置文件的dtd信息 -><!doctype validators public "-/opensymphony group/xwork validator 1.0.3/en""<!- 校驗(yàn)文件的根元素 -><validators><!- 校驗(yàn)action的name屬性 -><field name="name"><!- 指定name屬性必須滿足必填規(guī)則 -><field-validator type=
45、"requiredstring"><param name="trim">true</param><message>必須輸入名字</message></field-validator><!- 指定name屬性必須匹配正則表達(dá)式 -><field-validator type="regex"><param name="expression"><!cdata(w4,25)></param><
46、message>您輸入的用戶名只能是字母和數(shù)字,且長(zhǎng)度必須在4到25之間</message></field-validator></field><!- 校驗(yàn)action的pass屬性 -><field name="pass"><!- 指定pass屬性必須滿足必填規(guī)則 -><field-validator type="requiredstring"><param name="trim">true</param><mes
47、sage>必須輸入密碼</message></field-validator><!- 指定pass屬性必須滿足匹配指定的正則表達(dá)式 -><field-validator type="regex"><param name="expression"><!cdata(w4,25)></param><message>您輸入的密碼只能是字母和數(shù)字,且長(zhǎng)度必須在4到25之間</message></field-validator></fi
48、eld><!- 指定age屬性必須在指定范圍內(nèi)-><field name="age"><field-validator type="int"><param name="min">1</param><param name="max">150</param><message>年紀(jì)必須在1到150之間</message></field-validator></field><!-
49、指定birth屬性必須在指定范圍內(nèi)-><field name="birth"><field-validator type="date"><!- 下面指定日期字符串時(shí),必須使用本locale的日期格式 -><param name="min">1900-01-01</param><param name="max">2050-02-21</param><message>生日必須在$min到$max之間</messa
50、ge></field-validator></field></validators>l 校驗(yàn)過(guò)程. 當(dāng)輸入校驗(yàn)失敗后,struts2將返回名為“input”的邏輯視圖,因此需要配置。. 校驗(yàn)成功后,執(zhí)行action中相應(yīng)的方法。l 顯示校驗(yàn)錯(cuò)誤. <fielderror/>l 提示. 類型轉(zhuǎn)換失敗的提示消息,輸入校驗(yàn)的提示消息都被封裝成fielderror,并被放入actioncontext中,并且校驗(yàn)失敗后都返回“input”邏輯視圖,都可以使用<fielderror/>標(biāo)簽輸出錯(cuò)誤提示。. 如果開發(fā)者使用了struts2標(biāo)簽
51、來(lái)生成表單,則表單標(biāo)簽會(huì)自動(dòng)輸出錯(cuò)誤提示。. 以上校驗(yàn)規(guī)則對(duì)action中所有處理邏輯有效。3.國(guó)際化提示消息l 為<message />標(biāo)簽指定key屬性,該屬性指定的是國(guó)際化提示消息對(duì)應(yīng)的key。. <message key="name.requried"/>. <message>$gettext("name.requried")</message>4.短路校驗(yàn)器l <field-validator/>元素可以指定short-circuit屬性,這個(gè)屬性指定該校驗(yàn)器是否是短路校驗(yàn)器,默認(rèn)值為
52、false。l 對(duì)應(yīng)同一個(gè)字段內(nèi)的多個(gè)校驗(yàn)器,如果一個(gè)短路校驗(yàn)器失敗,其他校驗(yàn)器都根本不會(huì)繼續(xù)校驗(yàn)。5.校驗(yàn)文件的搜索規(guī)則l 一個(gè)action中可能包含多個(gè)處理邏輯,struts2允許為不同的處理邏輯指定不同的校驗(yàn)規(guī)則l 例如:一個(gè)action既處理login又處理registerl 為校驗(yàn)規(guī)則文件名增加actionalias來(lái)指定需要校驗(yàn)的具體處理邏輯. actionclassname-actionalias-validation.xml. registeraction-login-validation.xmll struts2搜索校驗(yàn)規(guī)則文件的順序?yàn)? baseactionclassnam
53、e-validation.xml. baseactionclassname -baseactionalias-validation.xml. actionclassname-validation.xml. actionclassname-actionalias-validation.xml. 自上而下,起作用的校驗(yàn)規(guī)則是所有校驗(yàn)規(guī)則之和,如果兩個(gè)校驗(yàn)規(guī)則文件中指定的校驗(yàn)規(guī)則沖突,則使用下面文件中的校驗(yàn)規(guī)則6.內(nèi)建校驗(yàn)器l struts2提供了大量的內(nèi)建校驗(yàn)器,可以滿足大部分應(yīng)用的校驗(yàn)需求l 必填校驗(yàn)器required:指定的字段必須有值<field name="name&quo
54、t;><field-validator type="required"><!配置必填校驗(yàn)器 -><message>name must not be null</message><!指定校驗(yàn)失敗的提示消息-></field-validator></field>l 必填字符串校驗(yàn)器requirestring:字段值必須非空且長(zhǎng)度大于0<field name="name"><field-validator type="requiredstrin
55、g"><param name=”trim”>true</param><message>name is required</message><!指定校驗(yàn)失敗的提示消息-></field-validator></field>l 整數(shù)校驗(yàn)器int:包括int,short,long,要求字段的整數(shù)值必須在指定的范圍內(nèi)<field name="age"><field-validator type="int"><param name=”m
56、in”>5</param><param name=”max”>150</param><message></message><!指定校驗(yàn)失敗的提示消息-></field-validator></field>l 日期校驗(yàn)器date:要求字段的日期必須在指定的范圍內(nèi)<field name="birth"><field-validator type="date"><param name="min">1900
57、-01-01</param><param name="max">2050-02-21</param><message></message><!指定校驗(yàn)失敗的提示消息-></field-validator></field>l 字段表達(dá)式校驗(yàn)器fieldexpression:要求指定字段滿足一個(gè)邏輯表達(dá)式,當(dāng)表達(dá)式返回true時(shí),通過(guò)校驗(yàn),否則校驗(yàn)失敗。<field name="pass"><field-validator type="
58、fieldexpression"><param name=”expression”><!cdata(pass=rpass)></param><message></message><!指定校驗(yàn)失敗的提示消息-></field-validator></field>l 郵件地址校驗(yàn)器email:要求字符串如果非空,則必須是合法的郵件地址<field name="email"><field-validator type="email"
59、><message></message><!指定校驗(yàn)失敗的提示消息-></field-validator></field>l 網(wǎng)址校驗(yàn)器url:要求字符串如果非空,則必須是合法的url地址<field name="url"><field-validator type="url"><message></message><!指定校驗(yàn)失敗的提示消息-></field-validator></field>l 轉(zhuǎn)換校
60、驗(yàn)器conversion:檢查被檢查字段在類型轉(zhuǎn)換過(guò)程中是否出現(xiàn)錯(cuò)誤。<field name="age"><field-validator type="conversion"><!指定類型轉(zhuǎn)換失敗后,返回輸入頁(yè)面依然保留原來(lái)的錯(cuò)誤輸入-><param name=”repopulatefield”>true</message><message></message><!指定校驗(yàn)失敗的提示消息-></field-validator></field&
61、gt;l 字符串長(zhǎng)度校驗(yàn)器stringlength:被檢查字段的長(zhǎng)度必須在指定的范圍之內(nèi)<field name="user"><field-validator type="stringlength"><param name=”minlength”>4</param><param name=”maxlength”>20</param><message></message><!指定校驗(yàn)失敗的提示消息-></field-validator></field>l 正則表達(dá)式校驗(yàn)器regex:被檢驗(yàn)字段是否匹配一個(gè)正則表達(dá)式<field name="user"><field-validator type="regex"><param name="expression"><!cdata(w4,25)></param><message></message><!指定校驗(yàn)失
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村舊房改造土建合同范例
- 個(gè)人建材銷售合同范本
- 廠房木工勞務(wù)合同范例
- 單位購(gòu)柴油合同范例
- 包工合同范例范例
- 原木砍伐工程合同范例
- 區(qū)域白酒經(jīng)銷合同范例
- 出售農(nóng)村別墅合同范例
- 保障眾籌合同范例
- 發(fā)電玻璃租賃合同范例
- 路燈安裝安全培訓(xùn)
- 《民法典》2024年知識(shí)考試題庫(kù)(含答案)
- JJF(京) 51-2024 智能電表現(xiàn)場(chǎng)校驗(yàn)規(guī)范
- DBJ-T15-60-2019建筑地基基礎(chǔ)檢測(cè)規(guī)范
- 常規(guī)體外受精中國(guó)專家共識(shí)(2024年)解讀 2
- 《茉莉花》(課件)人音版音樂(lè)六年級(jí)上冊(cè)
- 指尖上的非遺-中國(guó)傳統(tǒng)手工藝鑒賞智慧樹知到答案2024年青島黃海學(xué)院
- 二年級(jí)下冊(cè)口算題1000題大全-
- AQ/T 1119-2023 煤礦井下人員定位系統(tǒng)通 用技術(shù)條件(正式版)
- 國(guó)家中醫(yī)藥管理局發(fā)布的406種中醫(yī)優(yōu)勢(shì)病種診療方案和臨床路徑目錄
- 幼兒園班級(jí)幼兒圖書目錄清單(大中小班)
評(píng)論
0/150
提交評(píng)論