Java EE輕量級框架應(yīng)用開發(fā)第3章 Struts2的高級特性_第1頁
Java EE輕量級框架應(yīng)用開發(fā)第3章 Struts2的高級特性_第2頁
Java EE輕量級框架應(yīng)用開發(fā)第3章 Struts2的高級特性_第3頁
Java EE輕量級框架應(yīng)用開發(fā)第3章 Struts2的高級特性_第4頁
Java EE輕量級框架應(yīng)用開發(fā)第3章 Struts2的高級特性_第5頁
已閱讀5頁,還剩50頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第三章Struts2的高級特性本章要點·攔截器簡介·攔截器配置·自定義攔截器·Struts2的國際化·Struts2輸入校驗·應(yīng)用中的異常處理攔截器簡介攔截器是AOP(Aspect-Oriented

Programming,面向切面編程)的一種實現(xiàn)策略攔截器的工作原理攔截器都是通過代理的方式調(diào)用的當請求到達Struts2的ServletDispatcher(Web

HTTP請求的調(diào)度器,所有對Action的請求都將通過ServletDispatcher調(diào)用)時,Struts2會查找配置文件,并根據(jù)配置實例化相對

的攔截器對象,然后將這些對象串成一個列表(list),

最后逐個調(diào)用列表中的攔截器每個Action請求都包裝在一系列的攔截器內(nèi)部攔截器可以在Action執(zhí)行之前做準備操作,也可以在Action執(zhí)行之后做回收操作·每個Action既可以將操作轉(zhuǎn)交給下面的攔截器,也可以直接退出操作,返回用戶已定的視圖資源攔截器的工作時序攔截器意義·系統(tǒng)在多個地方需要使用相同的代碼,許多剛從事軟件開發(fā)的人員,遇到這種情況時,可能使用復(fù)制與粘貼的方式解決問題·復(fù)制與粘貼方式的缺點是代碼臃腫,更重要的是給軟件日后升級與維護帶來極大不便·如果把圖中的相同代碼段定義成一個方法,然后在3個代碼段中調(diào)用該方法,如下圖所示。這樣,如果要修改相同代碼段的代碼,則只需要修改一個地方即可·把攔截器看做是對調(diào)用方法的改進。稱某個實例是一個攔截器時,是從其行為上來說的,如果從代碼的角度來看,攔截器就是一個類,類中包含方法,只是這個方法比較特殊,它會在目標方法被調(diào)用之前“自動”執(zhí)行攔截器角色·Struts2框架中的操作不是所有Action都需要實現(xiàn)的,所以需要以動態(tài)的方式將其自由組合要實現(xiàn)這種需求,可以在Action中分別調(diào)用不同的方式來實現(xiàn),但直接調(diào)用的方式有一定的缺陷:

Action類直接調(diào)用所有需要的方法,形成Action與特定方法的高度耦合,降低Action類的服用性攔截器策略,可以在配置文件中指定需要的攔截器,從而使攔截器的方法在目標方法執(zhí)行之前或之后自動執(zhí)行,這樣就完成了通用操作的動態(tài)插入·攔截器與Action之間的關(guān)系·由于攔截器是通過配置文件配置的,所以通過攔截器引入操作的方式是可插拔方式·攔截器簡介·攔截器配置·自定義攔截器·Struts2的國際化·Struts2輸入校驗·應(yīng)用中的異常處理攔截器配置·struts.xml配置文件中定義一個攔截器非常簡單,可以打開struts-default.xml文件,在該文件中定義了許多攔截器<interceptors><interceptor

name="alias"class="erceptor.AliasInterceptor"/><interceptor

name="autowiring"class="erceptor.ActionAutowiringInterceptor"/><interceptor

name="chain"class="erceptor.ChainingInterceptor"/><interceptor

name="conversionerror"class="erceptor.StrutsConversionerrorInterceptor"/><!—其他攔截器的配置--></interceptors>·定義一個攔截器,只需要使用<interceptor>元素指定攔截類與攔截器名<interceptor

name="攔截器名字"class="攔截器對于的Java類型"/>·如果還需要向配置的攔截器傳入?yún)?shù),則需要在<interceptor>元素中加入<param>元素<interceptor

name="攔截器名字"class="攔截器對于的Java類型"/><!—param元素可以出現(xiàn)多次,name屬性指定的是參數(shù)的名字,中間是參數(shù)的值--><param

name=”參數(shù)名”></param></interceptor>使用攔截器?!?/p>

可以將多個攔截器合并在一起組成一個攔截器棧,struts-default.xml文件如下<interceptor-stack

name="basicStack"><interceptor-ref

name="exception"/><interceptor-ref

name="servletConfig"/><interceptor-ref

name="prepare"/><interceptor-ref

name="checkbox"/><interceptor-ref

name="multiselect"/><interceptor-refname="actionMappingParams"/><interceptor-ref

name="params"><paramname="excludeParams">dojo\..*,^struts\..*</param></interceptor-ref><interceptor-ref

name="conversionerror"/></interceptor-stack><interceptor-stackname="validationWorkflowStack"><interceptor-ref

name="basicStack"/><interceptor-ref

name="validation"/><interceptor-ref

name="workflow"/></interceptor-stack><interceptor-stackname="jsonValidationWorkflowStack"><interceptor-ref

name="basicStack"/><interceptor-ref

name="validation"><paramname="excludeMethods">input,back,cancel</param></interceptor-ref><interceptor-ref

name="jsonValidation"/><interceptor-ref

name="workflow"/></interceptor-stack><interceptor-stack

name="fileUploadStack"><interceptor-ref

name="fileUpload"/><interceptor-ref

name="basicStack"/></interceptor-stack><!—其他攔截器棧-->·

定義攔截器??梢允褂?lt;interceptor-stack>元素,由于攔截器棧是由多個攔截器組成的,所以加入<interceptor-ref>元素指定攔截器棧包含的每一個攔截器,定義攔截器的語法形式如下<interceptor-stack

name="攔截器棧名字"><interceptor-ref

name="攔截器名字"/><interceptor-ref

name="攔截器名字"/><interceptor-ref

name="攔截器名字"/><!—其他攔截器--></interceptor-stack>·

攔截器棧被定義之后,就可以將這個攔截器棧當成一個普通的攔截器來使用,只是在功能上是多個攔截器的有機組合,這樣,就可以在一個攔截器棧中包含另一個攔截器棧為攔截器棧指定參數(shù)為攔截器棧指定參數(shù)可以分為兩種情況定義攔截器時指定參數(shù)值:這種參數(shù)值為攔截器參數(shù)的默認值,通過<interceptor>元素來使用使用攔截器時指定參數(shù)值:這種參數(shù)值是在使用攔截器時動態(tài)分配的參數(shù)值,通過<interceptor-ref>元素來使用在配置攔截器時為攔截器指定參數(shù)<interceptor-stack

name="攔截器棧1"><interceptor-ref

name="攔截器1"><param

name="參數(shù)1">參數(shù)值</param><param

name="參數(shù)1">參數(shù)值</param><!—更多攔截器--></interceptor-ref><interceptor-ref

name="攔截器2"/><interceptor-ref

name="攔截器3"/><!—更多攔截器--></interceptor-stack>·

當需要為攔截器棧中的攔截器指定參數(shù)時,不但可以針對每一個攔截器指定參數(shù),也可以針對一個攔截器棧統(tǒng)一定義所有的參數(shù)<interceptor-stack

name="攔截器棧"><interceptor-ref

name="攔截器1"><param

name="參數(shù)1">參數(shù)值</param><param

name="參數(shù)1">參數(shù)值</param></interceptor-ref><interceptor-ref

name="攔截器2"><param

name="參數(shù)1">參數(shù)值</param><param

name="參數(shù)1">參數(shù)值</param></interceptor-ref></interceptor-stack><!—下面的代碼是給攔截器棧統(tǒng)一指定參數(shù),形式如下--><interceptor-stack

name="攔截器棧"><param

name="參數(shù)1">參數(shù)值</param><param

name="參數(shù)1">參數(shù)值</param><interceptor-ref

name="攔截器1"></interceptor-ref><interceptor-ref

name="攔截器2"></interceptor-ref></interceptor-stack>使用攔截器定義攔截器或者攔截器棧后,就可以用來攔截

Action了,攔截行為會在Action的execute()方法被執(zhí)行之前執(zhí)行可以使用<interceptor-ref>元素在Action中配置攔截器,其配置語法與在攔截器棧中引用攔截器的語法完全一樣,都是定義<interceptor-ref>元素,并且在該元素中定義name屬性·定義攔截器:攔截器1與攔截器2。在Action中使用攔截器,配置語法與在攔截器棧中引用攔截器是一樣的。但是在第2個Action配置中使用<interceptor-ref

name=“defaultStack”/>,即系統(tǒng)默認攔截器棧:defaultStack<interceptors><interceptor

name="攔截器1"class="對應(yīng)的Java類"/><interceptor

name="攔截器2"class="對應(yīng)的Java類"/></interceptors><!—使用攔截器--><action

name=”public”

class=”com.action.PublicAction”><result

name=”success”></result><result

name=”login”></result><interceptor-ref

name=”攔截器1”/><interceptor-ref

name=”攔截器2”/></action><action

name="checkLogin"class="com.action.DefaultAction"><resultname="success">/success.jsp</result><resultname="login">/login.jsp</result><interceptor-ref

name="攔截器1"/><interceptor-ref

name="defaultStack"</action>·在struts-default.xml文件中,攔截器棧的配置代碼如下<interceptor-stack

name="defaultStack"><interceptor-ref

name="exception"/><interceptor-ref

name="alias"/><interceptor-ref

name="servletConfig"/><interceptor-ref

name="i18n"/><interceptor-ref

name="prepare"/><interceptor-ref

name="chain"/><interceptor-ref

name="debugging"/><interceptor-ref

name="scopedModelDriven"/><interceptor-ref

name="modelDriven"/><interceptor-ref

name="fileUpload"/><interceptor-ref

name="checkbox"/><interceptor-ref

name="multiselect"/><interceptor-ref

name="staticParams"/><interceptor-ref

name="actionMappingParams"/><interceptor-ref

name="params"><paramname="excludeParams">dojo\..*,^struts\..*</param></interceptor-ref><interceptor-ref

name="conversionerror"/><interceptor-ref

name="validation"><paramname="excludeMethods">input,back,cancel,browse</param></interceptor-ref><interceptor-ref

name="workflow"><paramname="excludeMethods">input,back,cancel,browse</param></interceptor-ref></interceptor-stack>默認攔截器配置默認攔截器需要使用<default-interceptor-ref>元素,此元素為<package>的子元素,配置后,攔截器為其所在包中的默認攔截器配置<default-interceptor-ref>元素時,需要指定name屬性,該name屬性值必須是已經(jīng)存在的攔截器名字,表明將攔截器設(shè)置為默認攔截器<struts><package

name="default"

extends="struts-default"

namespace="/"><interceptors>

<!—攔截器根元素--><interceptor

name=""class=""/><!—定義一個攔截器--><interceptor-stack

name=""/>

<!—定義一個攔截器棧--></interceptors><default-interceptor-ref

name="攔截器(棧)的名字"/><action

.../></package></struts>在struts.xml文件中配置一個包時,可以為其指定默認攔截器,一旦為某個包指定了默認攔截器,如果該包

中的某些Action沒有顯式指定其他攔截器,則默認攔

截器會起作用與在Action中使用普通攔截器一樣,也可以在配置默認攔截器時為該攔截器指定參數(shù)。所以,在<default-interceptor-ref>元素中同樣支持<param>子元素<struts><package

name="default"

extends="struts-default"

namespace="/"><interceptors>

<!—攔截器根元素--><interceptor

name=""class=""/><!—定義一個攔截器--><interceptor-stack

name=""/>

<!—定義一個攔截器棧--></interceptors><default-interceptor-ref

name=""><param

name=""></param><!--可以配置多個參數(shù)值--></default-interceptor-ref><action

.../></package></struts>為配置默認攔截器指定參數(shù),與使用攔截器指定的參數(shù)一樣,將覆蓋定義攔截器時指定的參數(shù)配置默認攔截器也是使用攔截器的一種方式,可以避免在單獨的Action中配置攔截器。通過在包的<package>元素下配置默認攔截器,就為此包下的所有Action同時配置了相同的攔截器當繼承了Struts-default包時,也就是繼承了默認攔截器棧defaultStack,這就意味著,如果在子包中

沒有為Action指定攔截器,則defaultStack攔截器

棧將執(zhí)行默認攔截器Action·與攔截器相關(guān)的配置元素<interceptors>元素:用來定義攔截器,所有攔截器與攔截器棧都在此元素下定義??梢园釉?lt;interceptor>和<interceptor-stack>,分別用來定義攔截器與攔截器棧<interceptor>元素:用來定義攔截器,需要指定兩個屬性,用name屬性指定攔截器的名字,用class屬性指定

攔截器的類<interceptor-ref>元素:用來引用其他攔截器或攔截器棧,可以作為<interceptor-stack>元素和<action>元素的子元素<param>元素:用來為攔截器指定參數(shù),可以作為<intercptor>元素和<interceptor-ref>元素的子元素·攔截器簡介·攔截器配置·自定義攔截器·Struts2的國際化·Struts2輸入校驗·應(yīng)用中的異常處理自定義攔截器實現(xiàn)攔截器類Struts2提供了Interceptor接口,通過該接口可以很容易的實現(xiàn)一個攔截器類。開發(fā)者只需要直接或間接實現(xiàn)

Interceptor接口public

interface

Interceptor

extends

Serializable{void

destroy();void

init();String

intercept(ActionInvocation

invocation)

throws

Exception;}這個接口提供了3個方法init():由攔截器在執(zhí)行之前調(diào)用,主要用于初始化系統(tǒng)資源destroy():與init()對應(yīng),用于攔截器在執(zhí)行之后銷毀資源

intercept():攔截器的核心方法,實現(xiàn)具體的攔截操作,返回一個字符串作為邏輯視圖·

Struts2提供了一個抽象攔截器(AbstractInterceptor)類,這個類對

init()和destory()方法進行空實現(xiàn),因為并不是每次實現(xiàn)攔截器

時都要申請資源。下述代碼是實現(xiàn)判斷用戶是否登錄的攔截器package

erceptor;import

java.util.Map;import

com.opensymphony.xwork2.Action;import

com.opensymphony.xwork2.ActionContext;import

com.opensymphony.xwork2.ActionInvocation;public

class

LoginInterceptor

extends

AbstractInterceptor

{@OverrideMap

session

=

arg0.getInvocationContext().getSession();//獲取session對象String

username

=

(String)session.get("user");//獲取session中的user,賦值給username屬性

if(username!=null

&&

username.length()>0){//如果session中存在user,則進行后續(xù)操作return

arg0.invoke();}else//否則,即沒有user對象,表示用戶還沒有登錄{import

erceptor.AbstractInterceptor;

ActionContext

ac

=arg0.getInvocationContext();//獲取ActionContext對象public

String

intercept(ActionInvocation

arg0)throws

Exception{ac.put("popedom","您還沒有登錄,請登錄!");//設(shè)置提示信息return

Action.LOGIN;}}}使用自定義攔截器使用自定義攔截器有兩個步驟使用<interceptor>元素定義攔截器通過<interceptor-ref>元素使用攔截器使用<interceptors>元素配置攔截器,攔截器名為

checkLogin,指向LoginInterceptor.java攔截器類,并在名為checkLogin的Action中使用此攔截器,對

請求Action進行簡單定義package

com.action;import

com.opensymphony.xwork2.ActionSupport;public

class

DefaultAction

extends

ActionSupport

{public

String

execute(){return

SUCCESS;}}·

如果用戶還沒有登錄,系統(tǒng)就會轉(zhuǎn)向login.jsp登錄頁面,

使用taglib指令定義uri屬性,該屬性值表示引入Struts2框架,并設(shè)置前綴標簽為s。使用<s:property>標簽定義value屬性及屬性值,是為輸出相應(yīng)的popedom提示信息<%@

page

language="java"

import="java.util.*"

pageEncoding="UTF-8"%><%@

taglib

prefix="s"uri="/struts-tags"%><!--導入Struts2標簽庫--><html><body><center><s:property

value=”popedom”/><br/><b>用戶登錄</b><br/><s:form><s:textfield

name="username"label="用戶名"size="15"/><s:password

name="password"label="密碼"size="15"/><s:submit

value="提交"/></s:form></center></body></html>·

應(yīng)用程序的web.xml文件中對Struts2框架進行配置,否則運行程序時,會出現(xiàn)404錯誤,找不到該應(yīng)用程序。web.xml文件的內(nèi)容如下列所示·

啟動Tomcat服務(wù)器,在瀏覽器地址欄中輸入鏈接

http://localhost:8080/ch3/checkLogin.action發(fā)送請求<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-</filter><?xml

version="1.0"

encoding="UTF-8"?><web-ap<p!v-e-rFsilotne=r"D2i.s5p"atcher用來初始化struts2并且處理所有的WEB請求。-->xmln<sf=i"lhtetrp-:m/a/pjpaivnag.>/xml/ns/javaee"

xmlns:xsi="http<:f/i/lwtwewr.-wn3a.moer>gs/t2r0u0t1s/2X<M/LfSiclhtemra-nianmset>ance"<uxrsli-:psacthtemranL>o/c*a<t/iuornl=-"phattpe:r/n/>/xml/ns/javaee

http:</fjialvtae.rs-umna.pcpoimn/gx>ml/ns/javaee/web-app_2_5.xsd"><welc<o!m-e-f定il義e-Sltirsut>s2的FilterDispathcer的Filter--><wel<cfoimlet-efri>le>index.jsp</welcome-file></welc<ofmiel-tfeirl-en-almies>ts>truts2</filter-name></web-app>class>·

像這種檢查是否登錄的攔截器,通常不會僅僅作用在一個Action上,而是作用在所有需要用戶登錄后才可以訪問的Action上。因此,可以把這個攔截器定義為一個默認攔截器<struts><package

name="default"

extends="struts-default"><interceptors><!—定義攔截器--><interceptor

name="checkLogin"

class="erceptor.LoginInterceptor"

/><interceptor-stack

name=”checkLogin”><interceptor-ref

name=”check”/><!--定義一個登錄攔截器棧--><interceptor-ref

name=”defaultStack”/><!--使用默認攔截器--></interceptor-stack></interceptors><default-interceptor-ref

name”checkLogin”/><!--使用攔截器--><action

name="checkLogin"

class="tmq.action.DefaultAction"><result

name="success">/success.jsp</result><resultname="login">/login.jsp</result></action></package></struts>·攔截器簡介·攔截器配置·自定義攔截器·Struts2的國際化·Struts2輸入校驗·應(yīng)用中的異常處理Struts2的國際化·國際化主要是指語言的國際化,目的是能提供一個語言自適應(yīng)、顯示更友好的用戶界面,掃除語言障礙,是不同地區(qū)和使用不同語言的用戶都能方便地使用同一個應(yīng)用系統(tǒng)Struts2實現(xiàn)國際化的機制·Struts2國際化建立在Java國際化的基礎(chǔ)上,只是它對Java國際化進行了優(yōu)化和封裝,從而簡化了國

際化的實現(xiàn)過程運行流程中需要實現(xiàn)的文件·

golbalMessages_zh_CN.properties就是經(jīng)過轉(zhuǎn)碼后的中文資源文件,代碼如下·

國際化資源文件

以.properties為擴展名的文本文件,該文本文件以鍵值對的形式存儲國際化消息,即key=value,命名規(guī)則是resourceName_language_perties英文語言國際化資源文件,文件名為globalMessages_en_US.properties對應(yīng)l的og是inB中tn文=L資ogi源n

文件,文件名為globalMessages_GBK.properties·

中文l資og源inT文itl件e=在Use實rL際ogi應(yīng)n

用中不能直接使用,因為它包含非西歐字符,必須把loginName=

LoginNameloginPassword=

LoginPasswordUserName=用戶名這個文件Pas通sWo過rdn=a密ti碼ve2ascii命令進行轉(zhuǎn)碼,轉(zhuǎn)碼之后的資源文件才能使用Login=登錄·

globaRleMgeisstsearg=e注s_冊GBK.properties文件進行轉(zhuǎn)碼,命令語句如下native2ascii

–encoding

UTF-8

globalMessages_GBK.propertiesglobalMessages_zh_CN.propertiesloginBtn

=\u767B\u5F55loginTitle=

\u7528\u6237\u767B\u5F55loginName=

\u7528\u6237\u540D\u79F0loginPassword=

\u7528\u6237\u5BC6\u7801·配置文件在struts.xml配置文件中進行配置<constant

name="struts.custom.i18n.resources"

value="messageResource"/>在perties配置文件中進行配置struts.custom.i18n.resources=globalMessages·輸出國際化消息<·%@

pa在ge

lAancgtuaigeo=n"j中ava進"im行por國t="j際ava.<%@

taglib

prefix="s"

uri="/struts-tag<html><head><title>用戶登錄</title></head><body><h3><s:text

name="loginTitl<s:form

action="checklogin"*出"的page方Enc法oding="UTF-8"%>/h3>d="post"><s:token/></s:form></body></html>·國際化消息最終是要在視圖頁面通過Struts2標簽進行輸出的,包括在頁面上輸出國際化消息和在表單的label標簽中輸出國際化消息化ut輸il.s"%>public

String

addUser(){int

jg

=

ud.addUser(this.username);if(jg==1)

return

SUCCESS;else

if(jg==2){this.addFieldError(e""u/s>e<",

getText("huizhi.havename"));return

NONmEe;tho<s:textf}ield

name="loginName"

key="loginName"/><s:passweolrsdename="loginPassword"

key="loginPassword"/><s:submit

key="logirneBtunr"n/E>RROR;}}加載國際化資源文件的方式加載全局范圍資源文件國際化資源文件放到WEB-INF/classes,采用這種方式,對于Web應(yīng)用中的所有Action和視圖文件,都能夠訪問或輸出國際化資源文件中的消息加載包范圍資源文件國際化資源文件放在某個包下,命名規(guī)則是

packageName_language_perties。其中

packageName是包名,該包下的所以Action能訪問該資源文件,而其他Action不能訪問加載Action范圍資源文件可以為某個Action單獨指定國際化資源文件,國際化資源文件放在該Action的同級目錄內(nèi)?!ぜ虞d臨時指定范圍資源文件國際化資源文件的存放位置和命名規(guī)則與加載全局范圍國際化資源文件的方式相同采用此種方式時,可以使用il8n標簽臨時動態(tài)地設(shè)置國際化子文件。在<s:il8n>標簽中定義屬性,用來指定國際化資源文件名字中自定義的部分,該標簽要作為其他標簽

的父標簽來使用<s:i18n

n?ame將="g<losb:aliMels8sange>s標">簽作為<s:text>標簽的父標簽時,<s:text><s:form

action="checklogin"

method="post"><標s:t簽ext就fiel會d

n加ame=載"lo<gisn:Naimel"8keny>="標log簽inNa指me"定/>的國際化資源文件<將s:pa<sssw:oridln8amne=>"標logi簽nPa作ssw為ord"<kse:y=f"loorgimnP>a標sswo簽rd"的/>父標簽時,表單中<s:submit

key="loginBtn"/><的s:t元oke素n/>就會加載<s:il8n>標簽指定的國際化資源文件</s:form></s:i18n>實現(xiàn)自由選擇語言環(huán)境import

java.util.Map;public

void

setCurrent(Locale

current)

{this.current

=

current;ResourceBundle

bundle

=

ResourceBundle.getBundle("globalMessages",current);//向集合中裝載美國英語語言對象public

String

execute(){·Struts2提供一個名字為il8n的攔截器,并把該攔截<%@器pacgk添eaglea加ncgouma.g到uet=i"l默j;ava認"pa攔geEn截codi器ng="棧UTF-中8"%>,利用il8n攔截器實現(xiàn)用<%@itmapgolritb

jparveaf.iuxt=i"ls."*u;ri="/struts-tags"%><sc戶irmipot自rltacn由ogmu.aog選pe=n"sj擇yamvpahs語ocnryi.p言xtw"o>r環(huán)k2.A境ctio的nSup功por能t;public

cfluanscstCihonocehsaAncgteiLonceaxlte(n)d{s

ActionSupport

{·priva新te

L建oca文le

c件urdroeCcnuhtm;eonot.slaenAgFcortmi.soubnm.itj()a;va}</s}c·ript>在JSP頁面中利用Map對象填充下拉列表框。新建一個<!--p省ub略li其c

他Map內(nèi)g容et-L-o>cales(){<s:set

n名ame字="SME為aSpSlIcoOcNha_olLeOosCAs=LenEe".wvjHaalssuphet=的a"b#ls文e(s2s)i件;on[/"/W定W_義TRMAaNpS類_I型18實N_例LO化CA對LE"象]"l/o>cales<s:b·ean

ids=t"lrocuatlesLi.sxt"mnlam配e="置co/m/如.獲Ch取o下o系se統(tǒng)Act的io默n"認>國家/語言環(huán)境<s:param

namleo=c"acluersr.epnut"(bvuanldule=."g#eStEStSrIiOnNg_(L"OhCuAiLzEh=i=.neunl"l)?,Llocale.U:S#)S;ESSION_LOCALE"

/></s:bean><form

action="<s:url/>"name="l/a/n向gF集or合m"中>裝載簡體中文語言對象valure=t"u#rSnESSUICOCNE_SLSO;CALE==null

?

locale

:

#SESSION_LOCALE"name="request_locale"

id="langSelecter"onchange="changeLocale()"

theme="simple"/>}}</form><action

name=l"ochaoloese."pculta(sbsu=n"dcloem.guetiSlt.rCihnogo(s"ehAucitzihoin."c>n"),Locale.CHINA);<s:<srelseuclt

ncasmsreSe=t"yuslruenc=cl"eowscisad"lt>eh/s:;c1h3o0opsxe".jsp</resul/t/>返回本地化對象</ac}tion>

list="#localeList.locales"

listKey="value"

listValue="key"·攔截器簡介·攔截器配置·自定義攔截器·Struts2的國際化·Struts2輸入校驗·應(yīng)用中的異常處理Struts2輸入校驗·從客戶端輸入數(shù)據(jù),在服務(wù)器使用數(shù)據(jù),數(shù)據(jù)要經(jīng)過兩道工序的處理:首先是數(shù)據(jù)轉(zhuǎn)換,其次是數(shù)據(jù)校驗,開發(fā)者應(yīng)該做最壞的打算,對客戶端輸入數(shù)據(jù)盡最大努力的校驗Struts2輸入校驗的必要性對于Web應(yīng)用而言,基本上所有數(shù)據(jù)都是從客戶端接收過來的客戶端用戶操作不熟練、輸入錯誤、網(wǎng)絡(luò)有問題等和惡意輸入等,都可能產(chǎn)生異常數(shù)據(jù),如果對這些數(shù)據(jù)不加校驗,輕則導致系統(tǒng)阻塞,重則可能導致系統(tǒng)崩潰Struts2手動完成輸入校驗·在Struts2框架中,專門用來校驗數(shù)據(jù)的方法是t=i"poonst為">ValidateAction.java,在該r"/t>類的validate()方法,實現(xiàn)對用的功能"/>戶<s:s輸ubm義t處ion=理"va用lid戶ate.登act錄ion的"meAthcod,fie重ldl寫abeAl=c"姓ti名o"nnaSmue=p"npaome入fie的ldl數(shù)abe據(jù)l="密進碼行"na校me=驗"passit

value="提交"/>uts.xml文件中配置package

com.action;import

java.util.regex.Pattern;impovrtaclomi.odpeanstymeph(o)ny。.xwo開rk2.發(fā)Acti者onSu可ppor以t;通過通過繼承ActionSupport@SuppressWarnings("serial")publ類ic

c,lass并Vali重dat寫eActvioan

elxitedndas

Atceti(on)Su方ppor法t{來完成輸入校驗priv·ate

St登rin錄g

na頁me;面validate.jspprivate

String

pass;//省·略<s屬:f性定or的m

ascetXXX()和getXXX()方法public

S類<tsr:it中negxetxecute(){return<SsU:CtCeExStS;}publi·c<v/osi:dsfovtramrl>idate(){

//數(shù)據(jù)校A驗cvtaliidoante()方法if(getName()==null

||

getName().length()<6

||

getName().length()>15){//如果用戶名不符合要求,}息提示<a錯ct誤io信n

息namaed=d"FviaelliddEartreo"rc(l"ansasm=e"t,m"q用.a戶ct姓io名n.的Va長li度da不teA符ct合io要n"求>");<result

name="input">/validate.jsp</result>if(ge<trPeasusl(t)=n=anmuel=l"s|u|cgceetsPsa"s>s/(s)u.clceensgst.hj(s)p<<8/r|e|sgueltP>ass().length()>20){ad<d/FaicetlidoEnr>ror("pass","用戶密碼的長度不符合要求");//如果密碼不符合要求,提示錯誤信}}}在validate()方法中發(fā)現(xiàn)有不合法輸入時,會調(diào)用

其父類的addFieldError()方法,記錄一個fieldError錯誤當流程進入到execute()方法之前,系統(tǒng)會檢查有沒有fieldError,如果有,則不再執(zhí)行execute()方法,而是返回一個input邏輯視圖如果在validate()方法中檢測到輸入錯誤,只需將錯誤記錄下來即可,Struts2框架在調(diào)用業(yè)務(wù)邏輯之前會得知這個錯誤,這樣就可以完成校驗功能自定義校驗器Struts2為開發(fā)者提供了豐富的校驗器,可以滿足大多數(shù)校驗的要求,但是如果在項目程序中需要驗證的內(nèi)容比較復(fù)雜,內(nèi)置校驗器不能滿足要求時,就需要考慮使用自定義校驗器要實現(xiàn)自定義校驗器,首先需要一個校驗類,當

然這個類要滿足一定規(guī)則(實現(xiàn)一些接口),可

以通過com.opensymphony.xwork2.validator接口或者其子類來實現(xiàn)一個校驗類·假設(shè)需要一個字段校驗器,來校驗一個字段的值是不是某個字符串·

在src文件夾下新建validators.xml文件配置時,要pa·ckage通co過m.va繼lid承ator;import

com.opensymphony.xwork2.validator.ValidationException;imporctocomm..oopepnesynmpshyonmy.pxhwoorkn2y.v.alxiwdaotorrk.v2al.ivdaatolris.dFiaetldoVarl.idvataolrSiupdpaortt;ors.FieldVali

publiScuclpapssoMryVta類lida,tor重ext寫endvsaFileliddVaalitdeat(orOSbupjpoerct

t{object)方法private

String

str;

//定義str屬性public

void

validate(Object

obj)

throws

ValidationException

{String?nam<e

v=asulpeird.gaettFoierld>N元ame(素);的nam/e/屬取得性被校用驗于的字指段定名字自定義校驗器名字String

value=super.getFieldValue(name,obj).toString();//取得被校驗字段的值if

(!str.equals(value)){//被校驗的字符串值是否與指定值相同<?xml

v,ersicoln=a"1s.s0"屬enc性odi用ng=于"UTF指-8"定?>校驗器對應(yīng)的校驗類,這樣就把一<!DOCTYPE

validators

PUBLIC

"-//OpenSymphony

Group//XWork

ValidatorConfig<個1f.i0e/自l/dENn定"asmue義p=e"rn.校amded"驗F>ie器ldEr注ror冊(su給per.框get架FieldName(),obj);·<fie使l"dh-t用vtapl:該i/d/}watw校owr.o驗tpyepne器s=y"mtp來ehsotn完"y>.c成om/x校wor驗k/x功work能-va。lid在ator對-coAnfcitg-i1.o0n.d進td"行><va<l!i-d-a指to定r}s用>戶名必須輸入的值-->pu求b<<lvpiaac姓lriSadtmar名tnioanmrg必eng=ae"mt須seSt=tr"r"為t(>e)wsh{twm"<h/cmplrae,rstasum=r這>"ntm樣tqs

.r;av

才li}d可ato以r.My成Val功ida登tor"錄/>

p<u/bv<lamilecisdvsaoatigoder>s用e>t戶St名r(必Str須in為g

wshtmr!)

{</mtehsisa.gset>r

=

str;

}}

</field-validator></field>·攔截器簡介·攔截器配置·自定義攔截器·Struts2的國際化·Struts2輸入校驗·應(yīng)用中的異常處理應(yīng)用中的異常處理任何成熟、完善的軟件系統(tǒng)或網(wǎng)站都有可能出現(xiàn)異常,因此異常處理是必不可少的在傳統(tǒng)的異常處理方式中,開發(fā)人員一般需要編

寫大量的try...catch塊。這種方式增加了開發(fā)人員的編碼量,而且與其他代碼高度耦合,一旦系統(tǒng)

需要改變異常處理,就必須修改代碼,給系統(tǒng)維

護帶來很多不便Struts2作為優(yōu)秀的MVC框架提供了成熟的異常處理機制Struts2異常處理機制傳統(tǒng)的異常處理方式,在Struts2的Action中,

execute()方法將業(yè)務(wù)處理代碼放在try...catch中,若程序出現(xiàn)SQL

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論