Struts2.0第03章Action_第1頁
Struts2.0第03章Action_第2頁
Struts2.0第03章Action_第3頁
Struts2.0第03章Action_第4頁
Struts2.0第03章Action_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、.第三章 Action在前面提到MVC模式中,需要一個控制器來負(fù)責(zé)瀏覽器與服務(wù)器的通訊,實現(xiàn)處理用戶與服務(wù)器的交互。而在Struts2框架中,實現(xiàn)這一功能就是Action,它是整個框架的最核心部分,Action的使用反應(yīng)了應(yīng)用程序的功能需求,Action負(fù)責(zé)存儲數(shù)據(jù)和狀態(tài),與應(yīng)用的具體業(yè)務(wù)邏輯打交道。在本章中將關(guān)注如何在具體的應(yīng)用中根據(jù)不同的需要實現(xiàn)Action,討論Action如何提供Web應(yīng)用中所需要的通用功能。除了Action接口之外,Struts2 Action也可以實現(xiàn)其框架中它模塊的一些功能,例如校驗、國際化、異常處理等等。3.1 Action簡介實現(xiàn)Struts2框架的Actio

2、n有兩種方案。一種是實現(xiàn)框架所提供的Action接口,另一種則是使用框架提供的ActionSupport基類。Struts2規(guī)定,無論使用哪種方法,在最后編寫的Action類中都必須實現(xiàn)execute()這個方法。在Action中首先會涉及到返回類型的概念,下面就讓我們來仔細分析它們。3.1.1返回類型返回類型就是Action執(zhí)行完后,返回的結(jié)果字符串,根據(jù)它才能控制頁面的跳轉(zhuǎn)。Struts2預(yù)定義的返回類型定義在com.opensyphony.xwork2.action這個文件中,它是框架所定義的接口。下面就分析一下該文件,看看框架都預(yù)定義了哪些返回類型。com.opensyphony.xw

3、ork2.actionpackage com.opensymphony.xwork2;public interface Action public static final String SUCCESS = "success" public static final String NONE = "none" public static final String ERROR = "error" public static final String INPUT = "input" public static final

4、 String LOGIN = "login" public String execute() throws Exception;上面的代碼可以從Xwork2提供的源文件里找到,這里省略了原文檔的部分注釋。注意:對于返回類型的含義沒有強制性的要求,用戶可以在控制器出錯的情況下返回SUCCESS,并為之配置出錯的返回頁面,系統(tǒng)不會報錯,但是出于對代碼可讀性和可維護性的考慮,建議讀者按照返回類型的字面含義去配置它,例如Action正確執(zhí)行則返回SUCCESS,出錯則返回ERROR,需要返回到輸入頁面則返回INPUT等等。在該文件中可以發(fā)現(xiàn)有很多預(yù)定義的靜態(tài)字符串常量,其中有非常

5、眼熟的字符串常量SUCCESS,INPUT等等,也就是上述的返回類型。接著來看看在實際的應(yīng)用中如何配置返回類型。struts.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-/Apache Software Foundation/DTD Struts Configuration 2.0/EN" "/dtds/struts-2.0.dtd"><struts&

6、gt; <constant name="struts.devMode" value="true" /> <package name="default" extends="struts-default"><!-包含默認(rèn)配置文件,這樣就不必對每個參數(shù)詳細配置-> <interceptors><interceptor name="greeting" class="example.GreetingInterceptor">&

7、lt;/interceptor> </interceptors> <!- 使用默認(rèn)的攔截器棧的配置 - -><default-interceptor-ref name="completeStack"></default-interceptor-ref><!- 配置控制器 class屬性指向?qū)?yīng)的源代碼文件 - -><action name="greeting" class="example.GreetingAction"><!- 為此控制器添加對應(yīng)的S

8、UCCESS返回類型,并關(guān)聯(lián)一個頁面 -><result name="success" type="velocity">ex01-result.vm</result><interceptor-ref name="greeting"></interceptor-ref></action> </package></struts>下面讓我們來看看對應(yīng)控制器的源代碼。Example Actionpackage example;import com.ope

9、nsymphony.xwork2.ActionSupport;public class Greeting extends ActionSupport public String execute() throws Exception return SUCCESS;代碼中加粗的部分就是在框架中所預(yù)定義的返回類型,在Action中用到的是大寫的返回類型名,而在配置文件struts.xml中用到的則是對應(yīng)的小寫字符串值,由這兩者的一一對應(yīng)關(guān)系將Action和Result一一對應(yīng)起來。返回類型是溝通Action與Result的一座橋梁。3.1.2 execute()方法在Struts2中所有的Actio

10、n都要實現(xiàn)execute()方法。用戶的業(yè)務(wù)邏輯就是在該方法中處理,然后通過返回類型回到對應(yīng)的視圖,Action的作用就相當(dāng)于在前述章節(jié)中講解Struts2改進MVC模式的派發(fā)器作用。要實現(xiàn)execute()方法有兩種方法,一種是實現(xiàn)com.opensyphony.xwork2.action接口,還有一種則是從com.opensymphony.xwork2.ActionSupport基類派生。兩種方法各有優(yōu)劣,下面分別舉例說明:n 方法一:實現(xiàn)Action接口我們選取了第二章的例子作演示:HelloWorld.javapackage example;import com.opensymphon

11、y.xwork2.Action;public class helloworld implements Actionpublic String message;/歡迎消息public String execute()/添加歡迎消息message = “helloworldn” return SUCCESS;/*省略語句*/ 可以看出實現(xiàn)這樣的一個接口要求很簡單,同時分析上文給出的Action源文件可以發(fā)現(xiàn)它的功能也有局限,沒有給開發(fā)者提供任何額外的功能,因此這樣的實現(xiàn)方法比較適合簡單的Action。對于稍復(fù)雜的應(yīng)用應(yīng)該考慮使用繼承ActionSupport基類。n 方法二:繼承ActionSup

12、port基類同樣,為簡單起見,我們選取了第一部分2.4.1的例子作說明:helloworld.actionpackage example;import com.opensymphony.xwork2.ActionSupport;public class helloworld extends ActionSupportpublic String message;public String name;public String execute()if ( name = null | "".equals(name)|"w".equals(name)/如果用戶的

13、輸入不合法,那么給出出錯信息addFieldError("name","Blank names or 'w' not allowed");/返回輸入頁面return INPUT;/添加歡迎消息message = "hello "+name+"!n"return SUCCESS;表面上看,似乎這個Action和前一個例子沒有太大的差別,都是實現(xiàn)了execute()方法,然后返回一個返回類型。然而注意execute()里面黑體的部分讀者也許就能發(fā)現(xiàn),這里ActionSupport提供了出錯處理的一個函數(shù)

14、。其實遠遠不止這一個簡單的功能,ActionSupport還提供了近30個成員函數(shù)涵蓋了國際化、校驗、出錯處理等各個方面來處理用戶的業(yè)務(wù)邏輯。所以如果用戶的業(yè)務(wù)邏輯不是足夠簡單的話,那么應(yīng)該選擇從ActionSupport基類中派生出自己的Action,這樣就可以使用框架所帶來的種種便捷。3.2 Action接口有了上面的分析,下面讓我們直接來看一下com.opensyphony.xwork2.action接口的源代碼:(上面已經(jīng)給出,這里為了和下面的比較,不妨再次給出)。com.opensyphony.xwork2.actionpackage com.opensymphony.xwork2;

15、public interface Action public static final String SUCCESS = "success" public static final String NONE = "none" public static final String ERROR = "error" public static final String INPUT = "input" public static final String LOGIN = "login" public St

16、ring execute() throws Exception;當(dāng)從頁面提交請求到一個action的時候,應(yīng)用就會跳轉(zhuǎn)到相應(yīng)的action中去執(zhí)行execute()方法。所以當(dāng)編寫自己的action的時候,如果是實現(xiàn)這個接口,那么只要在execute()方法中添加相應(yīng)的功能代碼就可以了,但是這并不是一個好的實現(xiàn)業(yè)務(wù)邏輯的方法,因為這樣對于只有很少代碼的應(yīng)用或許是可以的,但是如果是對有比較多的代碼的應(yīng)用,那么必定會造成邏輯的混亂,對以后的維護、修改等都是不利的。在后面,讀者將會看到,我們將會把實現(xiàn)代碼放在相應(yīng)的類中,而在action的execute()方法中只是調(diào)用這些方法,以此來達到便于管理的

17、目的。3.3 ActionSupport基類ActionSupport是編寫設(shè)計業(yè)務(wù)邏輯Action的強有力支持。它提供的功能也十分強大。下面將會仔細的介紹一些常用的ActionSupport的成員函數(shù),并且詳細的了解ActionSupport的原理。下面列出了ActionSupport基類的大部分成員函數(shù)以及相關(guān)描述:表3-1 ActionSupport的成員函數(shù)返回類型成員函數(shù)描述voidaddActionError(Sting anErrorMessage)向Action添加一個Action級別的錯誤voidaddActionMessage(String aMessage)向Action

18、添加一個Action級別的信息void addFieldError(String fieldName, String errorMessage)為指定的域添加一個出錯信息void clearErrorsAndMessages()清除所有的錯誤和信息Stringexecute()其缺省的實現(xiàn)僅返回SUCCESSCollectiongetActionErrors()獲得Action級別的錯誤集合CollectiongetActionMessages()獲得Action級別的信息集合MapgetFieldErrors()獲得與域相關(guān)的錯誤信息的集合StringgetText(St

19、ring aTextName)基于鍵獲得指定的鍵值,不存在則返回NULLStringgetText(String aTextName, List args)基于鍵和附加參數(shù)獲得指定的鍵值,不存在則返回NULLStringgetText(String aTextName, String defaultValue)基于鍵獲得指定的鍵值,不存在則返回缺省值boolean hasActionErrors()是否有Action級別的錯誤boolean hasActionMessages()是否有Action級別的信息boolean hasErrors()

20、是否有錯誤,包括域和Action級別boolean hasFieldErrors()是否有域級別的錯誤voidpause(String result)暫停Action的執(zhí)行,拋出異常,并轉(zhuǎn)向?qū)?yīng)返回類型voidsetActionErrors(Collection errorMessages)設(shè)置Action級別的所有錯誤voidsetActionMessages(Collection messages)設(shè)置Action級別的所有信息voidsetFieldErrors(Map errorMap)設(shè)置域級別的所有錯誤voidvalidate()默認(rèn)的空校驗

21、器我們在編寫控制器的時候,能夠使用的框架的API也就是這些了,當(dāng)然不是所有的都經(jīng)常使用,一般常用的是出錯處理的一些函數(shù),如hasErrors()、hasFieldErrors()等等。讀者可以對照自己的需求合理的選取和使用自己所需的API。為了更好的理解Struts2,下面我們對ActionSupprot的源代碼進行剖析:com.opensyphony.xwork2.ActionSupportpackage com.opensymphony.xwork2;/*省略代碼*/public class ActionSupport implements Action,, Validateable,,

22、ValidationAware,, TextProvider,, LocaleProvider,, Serializable,, ContinuableObject protected transient static final Log LOG = LogFactory.getLog(ActionSupport.class); private transient final TextProvider textProvider = new TextProviderSupport(getClass(),, this); private final ValidationAwareSupport v

23、alidationAware = new ValidationAwareSupport(); public void setActionErrors(Collection errorMessages) validationAware.setActionErrors(errorMessages); public Collection getActionErrors() return validationAware.getActionErrors(); /*省略語句*/ public Map getErrors() return getFieldErrors(); /*省略語句*/ public

24、Locale getLocale() return ActionContext.getContext().getLocale(); public String getText(String aTextName) return textProvider.getText(aTextName); /*省略語句*/ public void addActionError(String anErrorMessage) validationAware.addActionError(anErrorMessage); /*省略語句*/ public String doInput() throws Excepti

25、on return INPUT; /*省略語句*/ public boolean hasActionErrors() return validationAware.hasActionErrors(); /*省略語句*/ public void clearErrorsAndMessages() validationAware.clearErrorsAndMessages(); public void validate() public void pause(String result) 從上述代碼中可以發(fā)現(xiàn)ActionSupport基類實現(xiàn)了很多的接口,但是仔細的觀察上面列出的函數(shù)不難發(fā)現(xiàn),它所

26、提供的接口都是圍繞著控制器的核心出錯處理來完成的,如hasActionErrors()等等??v觀整個文件,所有的操作都圍繞著validationAware這個類展開,validationAware對于ActionSupport來說是非常重要的一部分,所有的Error,Message,FieldError都間接的存放在validationAware這個類中。那么validationAware這個類究竟是什么樣子的一個類呢?下面就來看看它的廬山真面目:com.opensyphony.xwork2. validationAware/*省略代碼*/public class ValidationAwar

27、eSupport implements ValidationAware, Serializable private Collection actionErrors; private Collection actionMessages; private Map fieldErrors; /*省略語句*/ 看到這里就恍然大悟了,actionErrors和actionMessages實際是用Collection這個數(shù)據(jù)結(jié)構(gòu)存放的,fieldErrors則是用Map這個數(shù)據(jù)結(jié)構(gòu)存放的,所有Action對這三個變量的操作實際上都是間接的對這三個數(shù)據(jù)結(jié)構(gòu)的操作。以后用到這三個類的時候自然就有了經(jīng)驗。3.4

28、 Action實例作為示例,我們在這里提供兩種不同功能Action的完全實現(xiàn),供讀者參考和練習(xí)。n 實現(xiàn)Action接口;n 繼承ActionSupport基類;3.4.1 實現(xiàn)Action接口的實例這里我們使用Action完成一個有趣的應(yīng)用:由服務(wù)端動態(tài)生成顏色代碼供客戶端顯示時使用,這樣在客戶端每一次刷新頁面的時候,文字的顏色就改變一次。下面詳細講解如何實現(xiàn)該應(yīng)用。為了實現(xiàn)這個應(yīng)用,我們需要編寫一個控制器、一個頁面以及與之對應(yīng)的配置文件,下面讓我們來一步一步的完成它。web.xml<?xml version="1.0" encoding="UTF-8&q

29、uot;?><web-app id="WebApp_9" version="2.4" xmlns=" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation=" <display-name>Struts 2 First</display-name> <filter> <filter-name>struts-cleanup</filter-name> <

30、filter-class> org.apache.struts2.dispatcher.ActionContextCleanUp </filter-class> </filter> <filter-mapping> <filter-name>struts-cleanup</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>struts2</filte

31、r-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>i

32、ndex.html</welcome-file> </welcome-file-list></web-app>這個文件是所有Web應(yīng)用都要有的配置文件,但是對于不同的框架,實現(xiàn)的方法和語法是不盡相同的。web.xml是SUN servlet規(guī)范的標(biāo)準(zhǔn)配置文件,所有的Java的Web開發(fā)項目都要配置文件,我們發(fā)現(xiàn)Struts2在web.xml里面配置了filter,由此也可以看出,Struts2框架是作為一個過濾器來處理所有的Web請求的。從上面的配置文件可以看出,web.xml指定容器在捕獲到Web請求之后將其轉(zhuǎn)交給Struts2,那么Struts2又是如何

33、來處理這些請求的呢?這就要觀察Struts2的配置文件struts.xml了。struts.xml<!DOCTYPE struts PUBLIC "-/Apache Software Foundation/DTD Struts Configuration 2.0/EN" "/dtds/struts-2.0.dtd"><struts> <constant name="struts.devMode" value="true" /> <

34、;package name="ActionDemo" extends="struts-default"> <action name="colorText" class="example.ColorText"> <result name="success" type="velocity">Colorful.vm</result> </action> </package> </struts>這是Stru

35、ts2的配置文件,它為Xwork2的工作方式進行配置。分析這段配置文件可以看出,URL中對colorText.action的請求會被Struts2轉(zhuǎn)交給用戶所編寫的代碼example.ColorText,具體是怎么處理的,當(dāng)然就要看看對應(yīng)的源代碼是怎么編寫的了。colorText.javapackage example;import com.opensymphony.xwork2.Action;public class ColorText implements Actionprivate String randomRGB;public String execute()int R=(int)(M

36、ath.random()*254+1);int G=(int)(Math.random()*254+1);int B=(int)(Math.random()*254+1);randomRGB=Integer.toHexString(R)+Integer.toHexString(G)+Integer.toHexString(B);return SUCCESS;public String getRandomRGB() return randomRGB;在控制器的代碼里面,首先生成了一個隨機的顏色RGB,并將其組合為對應(yīng)的RGB顏色的16進制代碼,如果顏色生成成功,就返回成功執(zhí)行的代碼SUCCESS

37、.代碼執(zhí)行到這里,Struts2就會去配置文件struts.xml里面查找此控制的結(jié)果類型SUCCESS的配置,顯然配置文件指示轉(zhuǎn)向到Colorful.vm繼續(xù)執(zhí)行。ColorText.java就是這個應(yīng)用的action,它的功能是為頁面提供隨機的顏色。這將會在后面的效果圖中看到。Colorful.vm<html><head><title>This Page Generates Colorful Texts</title></head><body><font color="$randomRGB"&

38、gt;NanJing Food<br>/*省略正文部分*/</font></body></html>這是執(zhí)行colorTest.java這個action后跳轉(zhuǎn)到的頁面,顯示一些文本。代碼中加粗的部分,就是變色頁面的關(guān)鍵代碼,通過$randomRGB每一次刷新頁面都會從Action取得一個隨機的顏色,從而實現(xiàn)了頁面顏色的不斷變化。由于在視圖中使用了中文,必須做相應(yīng)的配置(即國際化的問題,在后面將會詳細介紹,這里就暫不介紹),設(shè)置對應(yīng)的配置文件:perties /velocity配置文件input.encoding=GBKou

39、tput.encoding=GBKSperties /Struts2配置文件Struts.i18n.encoding=GBK最后,完成的應(yīng)用的文件層次結(jié)構(gòu)圖如下:圖3-1應(yīng)用的文件層次結(jié)構(gòu)在文件層次結(jié)構(gòu)圖中出現(xiàn)了我們未曾提到的test文件夾,這是對Action測試時留下的,與項目本身沒有關(guān)系。如果讀者的配置和文件都沒有錯誤的話,執(zhí)行后應(yīng)該能得到這樣的一個結(jié)果:圖3-2 結(jié)果頁面如果讀者刷新頁面,那么將得到另一種顏色的文字:圖3-3 刷新后的頁面3.4.2 實現(xiàn)ActionSupport基類的實例我們知道ActionSupport基類為用戶提供了很多的函數(shù)使得Action實現(xiàn)起

40、來更上手,下面來看這樣一個例子:首先用戶登陸一個頁面AS.JSP,然后頁面提示用戶輸入一個質(zhì)數(shù),如果輸入的是一個質(zhì)數(shù),ACTION會跳轉(zhuǎn)到成功頁面,如果不是,ACTION會添加錯誤提示信息,并將頁面重定向到輸入頁面。下面具體分析這些源文件。AS.jsp<% taglib uri="/struts-tags" prefix="s" %><!DOCTYPE HTML PUBLIC "-/W3C/DTD HTML 4.01 Transitional/EN"><html> <head> <

41、title>THIS PAGE TESTS ACTIONSUPPORT CLASS</title> </head> <body> <s:form action="prime"> <s:textfield label="Please enter a Prime Number:" name="number"/> <input type="submit"/> </s:form> </body></html>界

42、面使用了Struts2的標(biāo)簽會在后續(xù)章節(jié)中詳細闡述,這里textfield標(biāo)簽是一個文本輸入標(biāo)簽,它與常規(guī)的文本輸入域相比最大的優(yōu)點就是集成了錯誤顯示功能。從頁面取得輸入的數(shù)據(jù)之后,需要對該數(shù)據(jù)進行一些判斷,因此還需要編寫對應(yīng)的控制器primeAction。primeAction.javapackage example;import com.opensymphony.xwork2.ActionSupport;public class primeAction extends ActionSupportprivate int num;private String number;public Str

43、ing execute() num=Integer.valueOf(number);if ( !IsPrimeNumber(num) addFieldError("number","You entered a non Prime");/如果不是質(zhì)數(shù)那么添加出錯信息,并且返回pause(INPUT);if ( IsPrimeNumber(num) return SUCCESS;return INPUT;public BooleanIsPrimeNumber(int i)/質(zhì)數(shù)的判斷函數(shù)int m=(int)Math.sqrt( i );for (int n

44、=2;n<=m;n+)if ( i%n=0 ) return false;return true;public String getNumber() return number;public void setNumber(String number) this.number = number;這個Action對用戶輸入的數(shù)據(jù)進行處理,是質(zhì)數(shù)的將其轉(zhuǎn)到一個成功的頁面pass.html,如果不是,那么它就會向輸入域添加一個域級別的錯誤信息,然后調(diào)用pause()方法使用戶返回INPUT頁面重新進行輸入。pass.html<!DOCTYPE HTML PUBLIC "-/W3C

45、/DTD HTML 4.01 Transitional/EN"><html> <head> <title>Congratulations</title> </head> <body> <font color="red"> <h2>Congratulations You passed the Prime Tests</h2> </font> </body></html>這是一個簡單的顯示通過信息的頁面。如果通過了質(zhì)數(shù)測

46、試,那么系統(tǒng)將向用戶顯示這個頁面。struts.xml<!DOCTYPE struts PUBLIC "-/Apache Software Foundation/DTD Struts Configuration 2.0/EN" "/dtds/struts-2.0.dtd"><struts> <constant name="struts.devMode" value="true" /><package name="Act

47、ionDemo" extends="struts-default"> <action name="prime" class="example.primeAction"> <result name="success">pass.html</result> <result name="input">AS.jsp</result> </action></package></struts>這個

48、是對應(yīng)的配置文件,由于web.xml和前面所舉的例子完全一致,所以這里不再累述。WEB應(yīng)用的框架結(jié)構(gòu)和上例也是一樣的,讀者可以參照前面的例子進行配置。由于篇幅的原因,我們這里只給出,輸入錯誤后的界面。圖3-4 有FieldError的INPUT頁面3.5在Action中實現(xiàn)基本校驗校驗是業(yè)務(wù)邏輯中經(jīng)常碰到的一個問題,有很多方法可以實現(xiàn)這個業(yè)務(wù)邏輯。Struts2提供了基本校驗和高級的框架校驗來滿足不同層次的需要,這里將向讀者講述基本校驗的一些策略和方法,至于高級的校驗框架,將在后面的第三部分高級特性中向讀者詳細闡述。3.5.1使用Action的execute()方法如果我么使用Action接口

49、,而不是集成ActionSupport,因為沒有框架提供的API支持所以大部分的校驗邏輯都由用戶自行在execute()這個方法里完成,而且無法集成出錯的處理,如果要添加出錯信息,那么只有在Action里面添加新的屬性字段,因此比較適合一些簡單的校驗。例如在第一部分向讀者展示的一個HelloWorld的例子,其實就是基本校驗的雛形。舉一個簡單的例子,如果需要對用戶輸入的一個數(shù)值進行校驗以確定它是一個素數(shù),那么用Action我們可以這樣做。primeAction.javapackage example;import com.opensymphony.xwork2.Action;public cl

50、ass primeAction implements Actionprivate int number;public int getNumber() return number;public String execute() if ( IsPrimeNumber() return SUCCESS;return INPUT;public BooleanIsPrimeNumber()/*-省略代碼-*/return false;當(dāng)我們把校驗的邏輯混合在execute()方法里面的時候,勢必會造成維護的困難,不僅如此代碼的可復(fù)用性也大大降低。因此十分有必要將校驗與Action的execute()方法

51、獨立開來。3.5.2使用ActionSupport的validate()方法與基本的Action相比ActionSupport實現(xiàn)了很多的成員函數(shù),特別是為校驗提供便利的很多成員函數(shù),不僅如此ActionSupport更是實現(xiàn)了validate()這個方法,將校驗與業(yè)務(wù)邏輯的流程獨立開來,這樣ActionSupport與Action相比就更適合拿來做校驗。同樣的校驗質(zhì)數(shù)的應(yīng)用如果有了ActionSupprot基類的支持,可以這樣寫。primeAction.javapackage example;import com.opensymphony.xwork2.ActionSupport;publi

52、c class _primeAction extends ActionSupportpublic int number;public int getNumber() return number;public String execute()return SUCCESS;public void validate()/TODO how to validateif ( isPrimeNumber(number) ;addFieldError("number","You should Enter a Prime number");public Boolean i

53、sPrimeNumber( int number)/TODO validate Prime numberreturn false;這樣來寫代碼不僅對客戶更友好(提供了出錯的信息提示),代碼的可復(fù)用性也得到了加強,因此如果不是特別簡單的校驗,推薦使用基類方式來完成校驗。3.5.3 使用注釋實現(xiàn)校驗上面介紹了兩種實現(xiàn)校驗的方法,它們有一個共同點:所有實現(xiàn)校驗功能的代碼都是由程序員自己編寫。或許有人會問:作為一個框架,Struts2在校驗上只能為使用者提供這些功能嗎?其實,Struts2提供的功能遠不止這些,下面將介紹的注釋實現(xiàn)校驗就能在很大程度上簡便校驗的實現(xiàn)。Struts2本身提供了許多校驗器供

54、編程人員使用,使用這些校驗器可以方便地校驗像輸入是否為空、是否符合特定的格式(如:Date格式、email格式)等規(guī)則?,F(xiàn)在,由于Java1.5的注釋機制能更加方便程序員編程,所以Struts2也引入了這一機制。而在Struts2中,結(jié)合上面的兩種優(yōu)點,可以使用注釋來實現(xiàn)校驗功能。通過查看源代碼可以發(fā)現(xiàn),在包com.opensymphony.xwork2.validator.annotations下有實現(xiàn)校驗的源代碼文件,下面將這些文件列表如下3-2所示:表3-2 注釋校驗器及其功能文件名功能RequiredFieldValidator.java校驗指定字段是否為空RequiredString

55、Validator.java校驗指定字符串字段非空IntRangeFieldValidator.java校驗指定整數(shù)字段是否在一個范圍內(nèi)DateRangeFieldValidator.java校驗指定的日期是否在一個范圍內(nèi)ExpressionValidator.java校驗指定的表達式是否為真FieldExpressionValidator.java校驗指定OGNL表達式字段EmailValidator.java校驗一個指定的字符字段如果非空是否是一個合法郵箱地址UrlValidator.java校驗一個指定的字段是否是字符串并且合法VisistorFieldValidator.java將當(dāng)前

56、校驗推送到另一相關(guān)校驗ConversionErrorFieldValidator.java校驗指定字段是否發(fā)生轉(zhuǎn)換錯誤StringLengthFieldValidator.java校驗指定字段是否發(fā)生轉(zhuǎn)換錯誤RegexFieldValidator.java校驗指定使用正規(guī)表達式的字符字段DoubleRangeFieldValidator.java校驗指定符點數(shù)字段是否在一個范圍內(nèi)在編程過程中,只要導(dǎo)入包com.opensymphony.xwork2.validator.annotations,就可以使用這些校驗器。要使用注釋實現(xiàn)校驗,可以按照下面的步驟:1. 創(chuàng)建一個接口或者一個類。正如前面所

57、說,一般情況下創(chuàng)建繼承com.opensymphony.xwork2.ActionSupport的類。2. 為類創(chuàng)建字段變量,并為這此變量創(chuàng)建getter和setter方法。3. 使用com.opensymphony.xwork2.validator.annotations.Validation注釋上面創(chuàng)建的類,告訴Struts2將為該類使用注釋校驗。例如:Validation()public class AnnotationAction extends ActionSupport這樣就打開了注釋校驗功能。4. 為setter()方法或execute()方法添加校驗器。這里是實現(xiàn)對不同的字段使

58、用不同的校驗器的地方。例一:IntRangeFieldValidator(type = ValidatorType.FIELD, min = "6", max = "10", message = "age must be between $min and $max, current value is $bar.")public void setAge(int age) this.age = age;這里是為age的setAge()方法添加校驗器,添加的校驗器是IntRangeFieldValidator。其中,type可以是ValidatorType.FIELD或ValidatorType.SIMPLE,min和max是被校驗整數(shù)的最大值和最小值,而message是校驗出錯時的信息。例二:expressions = ExpressionValidator(expression = "password=confirm", message = "password must be equles to confirm. password=

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論