




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Struts2上海浦東軟件園職業(yè)技能培訓Struts2Struts2是在WebWork2基礎發(fā)展而來的。和struts1一樣, Struts2也屬于MVC框架。不過有一點大家需要注意的是:盡管Struts2和struts1在名字上的差別不是很大,但Struts2和struts1在代碼編寫風格上幾乎是不一樣的。那么既然有了struts1,為何還要推出struts2。主要是因為struts2有以下優(yōu)點:1 在軟件設計上Struts2沒有像struts1那樣跟Servlet API和struts API有著緊密的耦合,Struts2的應用可以不依賴于Servlet API和struts API。 S
2、truts2的這種設計屬于無侵入式設計,而Struts1卻屬于侵入式設計。public class OrderListAction extends Action public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception 2 Struts2提供了攔截器,利用攔截器可以進行AOP編程,實現(xiàn)如權限攔截等功能。3 Strut2提供了類型轉換器,我們可以把特殊的請求參數(shù)轉換成需要的
3、類型。在Struts1中,如果我們要實現(xiàn)同樣的功能,就必須向Struts1的底層實現(xiàn)BeanUtil注冊類型轉換器才行。4 Struts2提供支持多種表現(xiàn)層技術,如:JSP、freeMarker、Velocity等5 Struts2的輸入校驗可以對指定方法進行校驗,解決了Struts1長久之痛。6 提供了全局范圍、包范圍和Action范圍的國際化資源文件管理實現(xiàn)搭建Struts2開發(fā)環(huán)境搭建Struts2環(huán)境時,我們一般需要做以下幾個步驟的工作:1找到開發(fā)Struts2應用需要使用到的jar文件.2編寫Struts2的配置文件3在web.xml中加入Struts2 MVC框架啟動配置搭建Str
4、uts2開發(fā)環(huán)境-開發(fā)Struts2應用依賴的jar文件大家可以到下載struts-2.x.x-all.zip,目前最新版為2.1.8。下載完后解壓文件,開發(fā)struts2應用需要依賴的jar文件在解壓目錄的lib文件夾下。不同的應用需要的JAR包是不同的。下面給出了開發(fā)Struts 2程序最少需要的JAR。struts2-core-2.x.x.jar :Struts 2框架的核心類庫xwork-core-2.x.x.jar :XWork類庫,Struts 2在其上構建ognl-2.6.x.jar :對象圖導航語言(Object Graph Navigation Language),strut
5、s2框架通過其讀寫對象的屬性freemarker-2.3.x.jar :Struts 2的UI標簽的模板使用FreeMarker編寫commons-logging-1.x.x.jar :ASF出品的日志包,Struts 2框架使用這個日志包來支持Log4J和JDK 1.4+的日志記錄。commons- 文件上傳組件,2.1.6版本后必須加入此文件搭建Struts2開發(fā)環(huán)境- Struts2應用的配置文件Struts2默認的配置文件為struts.xml ,該文件需要存放在WEB-INF/classes下,該文件的配置模版如下:搭建Struts2開發(fā)環(huán)境-Struts2在web中的啟動配置在st
6、ruts1.x中, struts框架是通過Servlet啟動的。在struts2中,struts框架是通過Filter啟動的。他在web.xml中的配置如下: struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter !- 自從Struts 2.1.3以后,下面的FilterDispatcher已經標注為過時 org.apache.struts2.dispatcher.FilterDispatcher - struts2 /*在StrutsPrepareAndExecuteFilter的init(
7、)方法中將會讀取類路徑下默認的配置文件struts.xml完成初始化操作。注意:struts2讀取到struts.xml的內容后,以javabean形式存放在內存中,以后struts2對用戶的每次請求處理將使用內存中的數(shù)據,而不是每次都讀取struts.xml文件第一個Struts2應用-HelloWorld在默認的配置文件struts.xml 中加入如下配置: /WEB-INF/page/hello.jsp Struts.xml配置中的包介紹 /WEB-INF/page/hello.jsp 在struts2框架中使用包來管理Action,包的作用和java中的類包是非常類似的,它主要用于管理
8、一組業(yè)務功能相關的action。在實際應用中,我們應該把一組業(yè)務功能相關的Action放在同一個包下。配置包時必須指定name屬性,該name屬性值可以任意取名,但必須唯一,他不對應java的類包,如果其他包要繼承該包,必須通過該屬性進行引用。包的namespace屬性用于定義該包的命名空間,命名空間作為訪問該包下Action的路徑的一部分,如訪問上面例子的Action,訪問路徑為:/test/helloworld.action。 namespace屬性可以不配置,對本例而言,如果不指定該屬性,默認的命名空間為“”(空字符串)。通常每個包都應該繼承struts-default包, 因為Stru
9、ts2很多核心的功能都是攔截器來實現(xiàn)。如:從請求中把請求參數(shù)封裝到action、文件上傳和數(shù)據驗證等等都是通過攔截器實現(xiàn)的。 struts-default定義了這些攔截器和Result類型??梢赃@么說:當包繼承了struts-default才能使用struts2提供的核心功能。 struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定義。 struts-default.xml也是Struts2默認配置文件。 Struts2每次都會自動加載 struts-default.xml文件。包還可以通過abstract=“true”定
10、義為抽象包,抽象包中不能包含action。第一個Struts2應用-HellWorld例子中使用到的com.javatrain.action.HelloWorldAction類如下:package com.javatrain.action;public class HelloWorldActionprivate String message;public String getMessage() return message;public void setMessage(String message) this.message = message;public String execute()
11、this.message = 我的第一個struts2應用;return success;第一個Struts2應用-HelloWorld例子中使用到的/WEB-INF/page/hello.jsp如下: 第一個struts2應用 $message 可以使用EL表達式訪問Action中的屬性。訪問HelloWorld應用在struts1中,通過節(jié)點的path屬性指定訪問該action的URL路徑。在struts2中,情況就不是這樣了,訪問struts2中action的URL路徑由兩部份組成:包的命名空間+action的名稱,例如訪問本例子HelloWorldAction的URL路徑為:/test
12、/helloworld (注意:完整路徑為::端口/內容路徑/test/helloworld)。另外我們也可以加上.action后綴訪問此Action。 /WEB-INF/page/hello.jsp Action名稱的搜索順序1獲得請求路徑的URI,例如url是:path1/path2/path3/test.action2首先尋找namespace為/path1/path2/path3的package,如果不存在這個package則執(zhí)行步驟3;如果存在這個package,則在這個package中尋找名字為test的action,當在該package下尋找不到action 時就會直接跑到默認n
13、amaspace的package里面去尋找action(默認的命名空間為空字符串“” ) ,如果在默認namaspace的package里面還尋找不到該action,頁面提示找不到action 3尋找namespace為/path1/path2的package,如果不存在這個package,則轉至步驟4;如果存在這個package,則在這個package中尋找名字為test的action,當在該package中尋找不到action 時就會直接跑到默認namaspace的package里面去找名字為test的action ,在默認namaspace的package里面還尋找不到該action,頁
14、面提示找不到action 4尋找namespace為/path1的package,如果不存在這個package則執(zhí)行步驟5;如果存在這個package,則在這個package中尋找名字為test的action,當在該package中尋找不到action 時就會直接跑到默認namaspace的package里面去找名字為test的action ,在默認namaspace的package里面還尋找不到該action,頁面提示找不到action 5尋找namespace為/的package,如果存在這個package,則在這個package中尋找名字為test的action,當在package中尋找
15、不到action或者不存在這個package時,都會去默認namaspace的package里面尋找action,如果還是找不到,頁面提示找不到action。Action配置中的各項默認值 /WEB-INF/page/hello.jsp 1如果沒有為action指定class,默認是ActionSupport。2如果沒有為action指定method,默認執(zhí)行action中的execute() 方法。3如果沒有指定result的name屬性,默認值為success。Action中result的各種轉發(fā)類型/WEB-INF/page/hello.jspresult配置類似于struts1中的fo
16、rward,但struts2中提供了多種結果類型,常用的類型有: dispatcher(默認值)、 redirect 、 redirectAction 、 plainText。在result中還可以使用$屬性名表達式訪問action中的屬性,表達式里的屬性名對應action中的屬性。如下:/view.jsp?id=$id下面是redirectAction 結果類型的例子,如果重定向的action中同一個包下: helloworld如果重定向的action在別的命名空間下:helloworld/testplaintext:顯示原始文件內容,例如:當我們需要原樣顯示jsp文件源代碼 的時候,我們可
17、以使用此類型。/xxx.jspUTF-8多個Action共享一個視圖-全局result配置當多個action中都使用到了相同視圖,這時我們應該把result定義為全局視圖。struts1中提供了全局forward,struts2中也提供了相似功能:/message.jsp為Action的屬性注入值Struts2為Action中的屬性提供了依賴注入功能,在struts2的配置文件中,我們可以很方便地為Action中的屬性注入值。注意:屬性必須提供setter方法。public class HelloWorldActionprivate String savePath;public String
18、getSavePath() return savePath;public void setSavePath(String savePath) this.savePath = savePath; ./images/WEB-INF/page/hello.jsp上面通過節(jié)點為action的savePath屬性注入“/images”指定需要Struts 2處理的請求后綴前面我們都是默認使用.action后綴訪問Action。其實默認后綴是可以通過常量”struts.action.extension“進行修改的,例如:我們可以配置Struts 2只處理以.do為后綴的請求路徑: 如果用戶需要指定多個請求
19、后綴,則多個后綴之間以英文逗號(,)隔開。如: 細說常量定義常量可以在struts.xml或perties中配置,建議在struts.xml中配置,兩種配置方式如下:在在struts.xml文件中配置常量文件中配置常量 在在perties中配置常量中配置常量struts.action.extension=do因為常量可以在下面多個配置文件中進行定義,所以我們需要了解struts2加載常量的搜索順序:pertiesweb.xml如果在多個文件中配置
20、了同一個常量,則后一個文件中配置的常量值會覆蓋前面文件中配置的常量值.常用的常量介紹 Struts2的處理流程StrutsPrepareAndExecuteFilterInterceptorActionResultJsp/html用戶請求Struts2內置的一些攔截器或用戶自定義攔截器用戶編寫的action類,類似struts1中的Action類似struts1中的forward響應StrutsPrepareAndExecuteFilter是Struts 2框架的核心控制器,它負責攔截由/*指定的所有用戶請求,當用戶請求到達時,該Filter會過濾用戶的請求。默認情況下,如果用戶請求的路徑不帶
21、后綴或者后綴以.action結尾,這時請求將被轉入Struts 2框架處理,否則Struts 2框架將略過該請求的處理。當請求轉入Struts 2框架處理時會先經過一系列的攔截器,然后再到Action。與Struts1不同,Struts2對用戶的每一次請求都會創(chuàng)建一個Action,所以Struts2中的Action是線程安全的。為應用指定多個struts配置文件在大部分應用里,隨著應用規(guī)模的增加,系統(tǒng)中Action的數(shù)量也會大量增加,導致struts.xml配置文件變得非常臃腫。為了避免struts.xml文件過于龐大、臃腫,提高struts.xml文件的可讀性,我們可以將一個struts.x
22、ml配置文件分解成多個配置文件,然后在struts.xml文件中包含其他配置文件。下面的struts.xml通過元素指定多個配置文件:通過這種方式,我們就可以將Struts 2的Action按模塊添加在多個配置文件中。動態(tài)方法調用如果Action中存在多個方法時,我們可以使用!+方法名調用指定方法。如下:public class HelloWorldActionprivate String message;.public String execute() throws Exceptionthis.message = 我的第一個struts2應用;return success;public St
23、ring other() throws Exceptionthis.message = 第二個方法;return success;假設訪問上面action的URL路徑為: /struts/test/helloworld.action要訪問action的other() 方法,我們可以這樣調用:/struts/test/helloworld!other.action如果不想使用動態(tài)方法調用,我們可以通過常量struts.enable.DynamicMethodInvocation關閉動態(tài)方法調用。使用通配符定義action/WEB-INF/page/hello.jsppublic class He
24、lloWorldActionprivate String message;.public String execute() throws Exceptionthis.message = 我的第一個struts2應用;return success;public String other() throws Exceptionthis.message = 第二個方法;return success;要訪問other()方法,可以通過這樣的URL訪問:/test/helloworld_other.action接收請求參數(shù)采用基本類型接收請求參數(shù)采用基本類型接收請求參數(shù)(get/post)在Action類
25、中定義與請求參數(shù)同名的屬性,struts2便能自動接收請求參數(shù)并賦予給同名屬性。請求路徑: public class ProductAction private Integer id; public void setId(Integer id) /struts2通過反射技術調用與請求參數(shù)同名的屬性的setter方法來獲取請求參數(shù)值 this.id = id; public Integer getId() return id; 采用復合類型接收請求參數(shù)采用復合類型接收請求參數(shù)請求路徑: public class ProductAction private Product product; pub
26、lic void setProduct(Product product) duct = product; public Product getProduct() return product;Struts2首先通過反射技術調用Product的默認構造器創(chuàng)建product對象,然后再通過反射技術調用product中與請求參數(shù)同名的屬性的setter方法來獲取請求參數(shù)值。關于struts2.1.6接收中文請求參數(shù)亂碼問題struts2.1.6版本中存在一個Bug,即接收到的中文請求參數(shù)為亂碼(以post方式提交),原因是struts2.1.6在獲取并使用了請求參數(shù)后才調用HttpS
27、ervletRequest的setCharacterEncoding()方法進行編碼設置 ,導致應用使用的就是亂碼請求參數(shù)。這個bug在struts2.1.8中已經被解決,如果你使用的是struts2.1.6,要解決這個問題,你可以這樣做:新建一個Filter,把這個Filter放置在Struts2的Filter之前,然后在doFilter()方法里添加以下代碼public void doFilter(.)HttpServletRequest req = (HttpServletRequest) request;req.setCharacterEncoding(UTF-8);/應根據你使用的編
28、碼替換UTF-8filterchain.doFilter(request, response);自定義類型轉換器java.util.Date類型的屬性可以接收格式為2009-07-20的請求參數(shù)值。但如果我們需要接收格式為的請求參數(shù),我們必須定義類型轉換器,否則struts2無法自動完成類型轉換。import java.util.Date;public class HelloWorldAction private Date createtime;public Date getCreatetime() return createtime;public void setCreatetime(Dat
29、e createtime) this.createtime = createtime;自定義類型轉換器public class DateConverter extends DefaultTypeConverter Override public Object convertValue(Map context, Object value, Class toType) SimpleDateFormat dateFormat = new SimpleDateFormat(yyyyMMdd);try if(toType = Date.class)/當字符串向Date類型轉換時String params
30、 = (String) value;/ Request.getParameterValues() return dateFormat.parse(params0);else if(toType = String.class)/當Date轉換成字符串時Date date = (Date) value;return dateFormat.format(date); catch (ParseException e) return null;將上面的類型轉換器注冊為局部類型轉換器:在Action類所在的包下放置ActionClassNperties文件,Action
31、ClassName是Action的類名,后面的-perties是固定寫法,對于本例而言,文件的名稱應為HelloWorldAperties 。在properties文件中的內容為:屬性名稱=類型轉換器的全類名對于本例而言, HelloWorldAperties文件中的內容為:createtime= com.javatrain.conversion.DateConverter自定義全局類型轉換器將上面的類型轉換器注冊為全局類型轉換器:在WEB-INF/classes下放置xwork-con
32、perties文件 。在properties文件中的內容為:待轉換的類型=類型轉換器的全類名對于本例而言, perties文件中的內容為:java.util.Date= com.javatrain.conversion.DateConverter訪問或添加request/session/application屬性public String scope() throws Exception ActionContext ctx = ActionContext.getContext(); ctx.getApplication().put(
33、app, 應用范圍);/往ServletContext里放入app ctx.getSession().put(ses, session范圍);/往session里放入ses ctx.put(req, request范圍);/往request里放入req return scope;JSP: $applicationScope.app $sessionScope.ses $requestScope.req 獲取HttpServletRequest / HttpSession / ServletContext / HttpServletResponse對象方法一,通過ServletActionCon
34、text.類直接獲取:public String rsa() throws ExceptionHttpServletRequest request = ServletActionContext.getRequest();ServletContext servletContext = ServletActionContext.getServletContext();request.getSession() HttpServletResponse response = ServletActionContext.getResponse();return scope;方法二,實現(xiàn)指定接口,由strut
35、s框架運行時注入:public class HelloWorldAction implements ServletRequestAware, ServletResponseAware, ServletContextAwareprivate HttpServletRequest request;private ServletContext servletContext;private HttpServletResponse response;public void setServletRequest(HttpServletRequest req) this.request=req;public
36、void setServletResponse(HttpServletResponse res) this.response=res;public void setServletContext(ServletContext ser) this.servletContext=ser;文件上傳第一步:在第一步:在WEB-INF/lib下加入下加入commons-、commons-io-1.3.2.jar。這兩個文件可以從下載。這兩個文件可以從下載。第二步:把第二步:把form表的表的enctype設置為:設置為:“multipart/form-data“,如下:如下: 第三步:在第三步:在Acti
37、on類中添加以下屬性,類中添加以下屬性,屬性紅色部分對應于表單中文件字段的名稱屬性紅色部分對應于表單中文件字段的名稱:public class HelloWorldAction private File uploadImage;/得到上傳的文件 private String uploadImageContentType;/得到文件的類型 private String uploadImage得到文件的名稱 /這里略省了屬性的getter/setter方法 public String upload() throws ExceptionString realpath = ServletActionC
38、ontext.getServletContext().getRealPath(/images); = new );if(!() ();(uploadImage, new , uploadImage);return success; 多文件上傳第一步:在第一步:在WEB-INF/lib下加入下加入commons-、commons-io-1.3.2.jar。這兩個文件可以從下載。這兩個文件可以從下載。第二步:把第二步:把form表的表的enctype設置為:設置為:“multipart/form-data“,如下:如下: 第三步:在第三步:在Action類中添加以下屬性,類中添加以下屬性,屬性紅色
39、部分對應于表單中文件字段的名稱屬性紅色部分對應于表單中文件字段的名稱:public class HelloWorldAction private File uploadImages;/得到上傳的文件 private String uploadImagesContentType;/得到文件的類型 private String uploadImages得到文件的名稱 /這里略省了屬性的getter/setter方法 public String upload() throws ExceptionString realpath = ServletActionContext.getServletCont
40、ext().getRealPath(/images); = new );if(!() ();for(int i=0 ;iuploadImages.length; i+) = uploadImagesi; (uploadImage, new , uploadImagesi);return success; 自定義攔截器要自定義攔截器需要實現(xiàn)erceptor.Interceptor接口:public class PermissionInterceptor implements Interceptor private static final l
41、ong serialVersionUID = -51783102L; public void destroy() public void init() public String intercept(ActionInvocation invocation) throws Exception System.out.println(進入攔截器);if(session里存在用戶)String result = invocation.invoke();elsereturn “l(fā)ogon”;/System.out.println(返回值:+ result);/return result; 自定義攔截器
42、/WEB-INF/page/hello.jsp因為struts2中如文件上傳,數(shù)據驗證,封裝請求參數(shù)到action等功能都是由系統(tǒng)默認的defaultStack中的攔截器實現(xiàn)的,所以我們定義的攔截器需要引用系統(tǒng)默認的defaultStack,這樣應用才可以使用struts2框架提供的眾多功能。如果希望包下的所有action都使用自定義的攔截器,可以通過把攔截器定義為默認攔截器。注意:每個包只能指定一個默認攔截器。另外,一旦我們?yōu)樵摪械哪硞€action顯式指定了某個攔截器,則默認攔截器不會起作用。輸入校驗在struts2中,我們可以實現(xiàn)對action的所有方法進行校驗或者對action的指定方
43、法進行校驗。對于輸入校驗struts2提供了兩種實現(xiàn)方法:1. 采用手工編寫代碼實現(xiàn)。2. 基于XML配置方式實現(xiàn)。手工編寫代碼實現(xiàn)對action中所有方法輸入校驗通過重寫validate() 方法實現(xiàn), validate()方法會校驗action中所有與execute方法簽名相同的方法。當某個數(shù)據校驗失敗時,我們應該調用addFieldError()方法往系統(tǒng)的fieldErrors添加校驗失敗信息(為了使用addFieldError()方法,action可以繼承ActionSupport ),如果系統(tǒng)的fieldErrors包含失敗信息,struts2會將請求轉發(fā)到名為input的resu
44、lt。在input視圖中可以通過顯示失敗信息。validate()使用例子:使用例子:public void validate() if(this.mobile=null | .equals(this.mobile.trim() this.addFieldError(username, 手機號不能為空); else if(!pile(1358d9).matcher(this.mobile.trim().matches()this.addFieldError(“mobile, 手機號的格式不正確); 驗證失敗后,請求轉發(fā)至驗證失敗后,請求轉發(fā)至input視圖:視圖:/WEB-INF/page/a
45、ddUser.jsp在在addUser.jsp頁面中使用頁面中使用顯示失敗信息。顯示失敗信息。手工編寫代碼實現(xiàn)對action指定方法輸入校驗通過validateXxx()方法實現(xiàn), validateXxx()只會校驗action中方法名為Xxx的方法。其中Xxx的第一個字母要大寫。當某個數(shù)據校驗失敗時,我們應該調用addFieldError()方法往系統(tǒng)的fieldErrors添加校驗失敗信息(為了使用addFieldError()方法,action可以繼承ActionSupport ),如果系統(tǒng)的fieldErrors包含失敗信息,struts2會將請求轉發(fā)到名為input的result。在
46、input視圖中可以通過顯示失敗信息。validateXxx()方法使用例子:方法使用例子:public String add() throws Exception return success;public void validateAdd() if(username=null & .equals(username.trim() this.addFieldError(username, 用戶名不能為空用戶名不能為空);驗證失敗后,請求轉發(fā)至驗證失敗后,請求轉發(fā)至input視圖:視圖:/WEB-INF/page/addUser.jsp在在addUser.jsp頁面中使用頁面中使用顯示失敗信息。
47、顯示失敗信息。輸入校驗的流程1。類型轉換器對請求參數(shù)執(zhí)行類型轉換,并把轉換后的值賦給action中的屬性。2。如果在執(zhí)行類型轉換的過程中出現(xiàn)異常,系統(tǒng)會將異常信息保存到ActionContext,conversionError攔截器將異常信息添加到fieldErrors里。不管類型轉換是否出現(xiàn)異常,都會進入第3步。3。系統(tǒng)通過反射技術先調用action中的validateXxx()方法,Xxx為方法名。4。再調用action中的validate()方法。5。經過上面4步,如果系統(tǒng)中的fieldErrors存在錯誤信息(即存放錯誤信息的集合的size大于0),系統(tǒng)自動將請求轉發(fā)至名稱為input
48、的視圖。如果系統(tǒng)中的fieldErrors沒有任何錯誤信息,系統(tǒng)將執(zhí)行action中的處理方法?;赬ML配置方式實現(xiàn)對action的所有方法進行輸入校驗使用基于XML配置方式實現(xiàn)輸入校驗時,Action也需要繼承ActionSupport,并且提供校驗文件,校驗文件和action類放在同一個包下,文件的取名格式為:ActionClassName-validation.xml,其中ActionClassName為action的簡單類名,-validation為固定寫法。如果Action類為erAction,那么該文件的取名應為:UserAction-validation.xml。下面是校驗文件
49、的模版: true 用戶名不能為空! 指定action中要校驗的屬性,指定校驗器,上面指定的校驗器requiredstring是由系統(tǒng)提供的,系統(tǒng)提供了能滿足大部分驗證需求的校驗器,這些校驗器的定義可以在xwork-2.x.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。為校驗失敗后的提示信息,如果需要國際化,可以為message指定key屬性,key的值為資源文件中的key。在這個校驗文件中,對action中字符串類型的username屬性進行驗證,首先要求調用trim()方法去掉空格,然后判斷用戶名是否為空
50、。編寫校驗文件時,不能出現(xiàn)幫助信息在編寫ActionClassName-validation.xml校驗文件時,如果出現(xiàn)不了幫助信息,可以按下面方式解決:windwos-preferences-myeclipse-files and editors-xml-xmlcatalog點“add”,在出現(xiàn)的窗口中的location中選“”,然后在xwork-2.1.2解壓目錄的srcjava目錄中選擇xwork-validator-1.0.3.dtd,回到設置窗口的時候不要急著關閉窗口,應把窗口中的Key Type改為URI 。Key改為struts2提供的校驗器列表系統(tǒng)提供的校驗器如下:requir
51、ed (必填校驗器,要求field的值不能為null)requiredstring (必填字符串校驗器,要求field的值不能為null,并且長度大于0,默認情況下會對字符串去前后空格)stringlength(字符串長度校驗器,要求field的值必須在指定的范圍內,否則校驗失敗,minLength參數(shù)指定最小長度,maxLength參數(shù)指定最大長度,trim參數(shù)指定校驗field之前是否去除字符串前后的空格)regex(正則表達式校驗器,檢查被校驗的field是否匹配一個正則表達式.expression參數(shù)指定正則表達式,caseSensitive參數(shù)指定進行正則表達式匹配時,是否區(qū)分大小寫
52、,默認值為true)int(整數(shù)校驗器,要求field的整數(shù)值必須在指定范圍內,min指定最小值,max指定最大值)double(雙精度浮點數(shù)校驗器,要求field的雙精度浮點數(shù)必須在指定范圍內,min指定最小值,max指定最大值)fieldexpression(字段OGNL表達式校驗器,要求field滿足一個ognl表達式,expression參數(shù)指定ognl表達式,該邏輯表達式基于ValueStack進行求值,返回true時校驗通過,否則不通過)email(郵件地址校驗器,要求如果field的值非空,則必須是合法的郵件地址)url(網址校驗器,要求如果field的值非空,則必須是合法的ur
53、l地址)date(日期校驗器,要求field的日期值必須在指定范圍內,min指定最小值,max指定最大值)conversion(轉換校驗器,指定在類型轉換失敗時,提示的錯誤信息)visitor(用于校驗action中的復合屬性,它指定一個校驗文件用于校驗復合屬性中的屬性)expression(OGNL表達式校驗器,expression參數(shù)指定ognl表達式,該邏輯表達式基于ValueStack進行求值,返回true時校驗通過,否則不通過,該校驗器不可用在字段校驗器風格的配置中)校驗器的使用例子required 必填校驗器 性別不能為空!requiredstring 必填字符串校驗器 true
54、用戶名不能為空!stringlength:字符串長度校驗器102true校驗器的使用例子email:郵件地址校驗器電子郵件地址無效regex:正則表達式校驗器 手機號格式不正確!校驗器的使用例子int:整數(shù)校驗器1150年齡必須在1-150之間字段OGNL表達式校驗器!CDATAimage() 文件不能為空基于XML配置方式對指定action方法實現(xiàn)輸入校驗當校驗文件的取名為ActionClassName-validation.xml時,會對 action中的所有處理方法實施輸入驗證。如果你只需要對action中的某個action方法實施校驗,那么,校驗文件的取名應為:ActionClassN
55、ame-ActionName-validation.xml,其中ActionName為struts.xml中action的名稱。例如:在實際應用中,常有以下配置:/WEB-INF/page/message.jsp/WEB-INF/page/addUser.jspUserAction中有以下兩個處理方法:public String add() throws Exception .public String update() throws Exception .要對add()方法實施驗證,校驗文件的取名為: UserAction-user_add-validation.xml要對update()方
56、法實施驗證,校驗文件的取名為: UserAction-user_update-validation.xml基于XML校驗的一些特點當為某個action提供了ActionClassName-validation.xml和ActionClassName-ActionName-validation.xml兩種規(guī)則的校驗文件時,系統(tǒng)按下面順序尋找校驗文件:1。AconClassName-validation.xml2。ActionClassName-ActionName-validation.xml系統(tǒng)尋找到第一個校驗文件時還會繼續(xù)搜索后面的校驗文件,當搜索到所有校驗文件時,會把校驗文件里的所有校驗規(guī)
57、則匯總,然后全部應用于action方法的校驗。如果兩個校驗文件中指定的校驗規(guī)則沖突,則只使用后面文件中的校驗規(guī)則。當action繼承了另一個action,父類action的校驗文件會先被搜索到。假設UserAction繼承BaseAction:訪問上面action,系統(tǒng)先搜索父類的校驗文件:BaseAction-validation.xml, BaseAction-user-validation.xml,接著搜索子類的校驗文件: UserAction-validation.xml, UserAction-user-validation.xml。應用于上面action的校驗規(guī)則為這四個文件的總和
58、。國際化準備資源文件,資源文件的命名格式如下:baseName_language_pertiesbaseName_pertiesbaseNperties其中baseName是資源文件的基本名,我們可以自定義,但language和country必須是java支持的語言和國家。如:中國大陸: baseName_zh_CN.properties美國: baseName_en_US.properties現(xiàn)在為應用添加兩個資源文件:第一個存放中文:javatrain_zh_CN.properties內容為:welcome=歡迎來到傳智播客第二個
59、存放英語(美國): javatrain_en_US.properties內容為: welcome=welcome to Struts2對于中文的屬性文件,我們編寫好后,應該使用jdk提供的native2ascii命令把文件轉換為unicode編碼的文件。命令的使用方式如下:native2ascii 源文件.properties 目標文件.properties配置全局資源與輸出國際化信息當準備好資源文件之后,我們可以在struts.xml中通過struts.custom.i18n.resources常量把資源文件定義為全局資源文件,如下:javatrain為資源文件的基本名。后面我們就可以在頁面
60、或在后面我們就可以在頁面或在action中訪問國際化信息:中訪問國際化信息:l在JSP頁面中使用標簽輸出國際化信息:,name為資源文件中的keyl在Action類中,可以繼承ActionSupport,使用getText()方法得到國際化信息,該方法的第一個參數(shù)用于指定資源文件中的key。l在表單標簽中,通過key屬性指定資源文件中的key,如:國際化輸出帶占位符的國際化信息資源文件中的內容如下:welcome= 0,歡迎來到傳智播客1在jsp頁面中輸出帶占位符的國際化信息 學習在Action類中獲取帶占位符的國際化信息,可以使用getText(String key, String args
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 快遞驛站承包合同范本
- 鋼結構廠房維修合同范本
- 二零二五年度水電項目設計與施工包工包料一體化合同
- 2025年度路橋工程環(huán)境保護與水土保持合同
- 2025年度林地經營權轉讓協(xié)議書(含林木資產)
- 2025年度考研備考輔導機構教學質量監(jiān)控合同模板
- 二零二五年度苗圃租賃與農業(yè)現(xiàn)代化合同
- 二零二五年度幼兒園師資培訓及引進合同
- 二零二五年度醫(yī)療機構聘用合同模板:醫(yī)療行業(yè)人才儲備及培養(yǎng)方案
- 2025年度財務公司客戶數(shù)據保密合同
- 2019年10月自考03706思想道德修養(yǎng)與法律基礎試題及答案含解析
- 無人機操控技術 課件全套 項目1-6 緒論-無人機自動機場
- 江蘇紅豆實業(yè)股份有限公司償債能力分析
- 四川省2023年普通高等學校高職教育單獨招生文化考試(中職類)數(shù)學試題(原卷版)
- 水力機械原理與設計課件
- 江蘇電子信息職業(yè)學院單招職業(yè)技能測試參考試題庫(含答案)
- 充電樁采購安裝投標方案(技術方案)
- 7.1開放是當代中國的鮮明標識課件-高中政治選擇性必修一當代國際政治與經濟(1)2
- 2024年浙江首考英語聽力原文解惑課件
- 民族團結教材
- 煤礦頂板管理技術培訓課件
評論
0/150
提交評論