




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.第三章 Action在前面提到MVC模式中,需要一個(gè)控制器來(lái)負(fù)責(zé)瀏覽器與服務(wù)器的通訊,實(shí)現(xiàn)處理用戶與服務(wù)器的交互。而在Struts2框架中,實(shí)現(xiàn)這一功能就是Action,它是整個(gè)框架的最核心部分,Action的使用反應(yīng)了應(yīng)用程序的功能需求,Action負(fù)責(zé)存儲(chǔ)數(shù)據(jù)和狀態(tài),與應(yīng)用的具體業(yè)務(wù)邏輯打交道。在本章中將關(guān)注如何在具體的應(yīng)用中根據(jù)不同的需要實(shí)現(xiàn)Action,討論Action如何提供Web應(yīng)用中所需要的通用功能。除了Action接口之外,Struts2 Action也可以實(shí)現(xiàn)其框架中它模塊的一些功能,例如校驗(yàn)、國(guó)際化、異常處理等等。3.1 Action簡(jiǎn)介實(shí)現(xiàn)Struts2框架的Actio
2、n有兩種方案。一種是實(shí)現(xiàn)框架所提供的Action接口,另一種則是使用框架提供的ActionSupport基類(lèi)。Struts2規(guī)定,無(wú)論使用哪種方法,在最后編寫(xiě)的Action類(lèi)中都必須實(shí)現(xiàn)execute()這個(gè)方法。在Action中首先會(huì)涉及到返回類(lèi)型的概念,下面就讓我們來(lái)仔細(xì)分析它們。3.1.1返回類(lèi)型返回類(lèi)型就是Action執(zhí)行完后,返回的結(jié)果字符串,根據(jù)它才能控制頁(yè)面的跳轉(zhuǎn)。Struts2預(yù)定義的返回類(lèi)型定義在com.opensyphony.xwork2.action這個(gè)文件中,它是框架所定義的接口。下面就分析一下該文件,看看框架都預(yù)定義了哪些返回類(lèi)型。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提供的源文件里找到,這里省略了原文檔的部分注釋。注意:對(duì)于返回類(lèi)型的含義沒(méi)有強(qiáng)制性的要求,用戶可以在控制器出錯(cuò)的情況下返回SUCCESS,并為之配置出錯(cuò)的返回頁(yè)面,系統(tǒng)不會(huì)報(bào)錯(cuò),但是出于對(duì)代碼可讀性和可維護(hù)性的考慮,建議讀者按照返回類(lèi)型的字面含義去配置它,例如Action正確執(zhí)行則返回SUCCESS,出錯(cuò)則返回ERROR,需要返回到輸入頁(yè)面則返回INPUT等等。在該文件中可以發(fā)現(xiàn)有很多預(yù)定義的靜態(tài)字符串常量,其中有非常
5、眼熟的字符串常量SUCCESS,INPUT等等,也就是上述的返回類(lèi)型。接著來(lái)看看在實(shí)際的應(yīng)用中如何配置返回類(lèi)型。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)配置文件,這樣就不必對(duì)每個(gè)參數(shù)詳細(xì)配置-> <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"><!- 為此控制器添加對(duì)應(yīng)的S
8、UCCESS返回類(lèi)型,并關(guān)聯(lián)一個(gè)頁(yè)面 -><result name="success" type="velocity">ex01-result.vm</result><interceptor-ref name="greeting"></interceptor-ref></action> </package></struts>下面讓我們來(lái)看看對(duì)應(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ù)定義的返回類(lèi)型,在Action中用到的是大寫(xiě)的返回類(lèi)型名,而在配置文件struts.xml中用到的則是對(duì)應(yīng)的小寫(xiě)字符串值,由這兩者的一一對(duì)應(yīng)關(guān)系將Action和Result一一對(duì)應(yīng)起來(lái)。返回類(lèi)型是溝通Action與Result的一座橋梁。3.1.2 execute()方法在Struts2中所有的Actio
10、n都要實(shí)現(xiàn)execute()方法。用戶的業(yè)務(wù)邏輯就是在該方法中處理,然后通過(guò)返回類(lèi)型回到對(duì)應(yīng)的視圖,Action的作用就相當(dāng)于在前述章節(jié)中講解Struts2改進(jìn)MVC模式的派發(fā)器作用。要實(shí)現(xiàn)execute()方法有兩種方法,一種是實(shí)現(xiàn)com.opensyphony.xwork2.action接口,還有一種則是從com.opensymphony.xwork2.ActionSupport基類(lèi)派生。兩種方法各有優(yōu)劣,下面分別舉例說(shuō)明:n 方法一:實(shí)現(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;/*省略語(yǔ)句*/ 可以看出實(shí)現(xiàn)這樣的一個(gè)接口要求很簡(jiǎn)單,同時(shí)分析上文給出的Action源文件可以發(fā)現(xiàn)它的功能也有局限,沒(méi)有給開(kāi)發(fā)者提供任何額外的功能,因此這樣的實(shí)現(xiàn)方法比較適合簡(jiǎn)單的Action。對(duì)于稍復(fù)雜的應(yīng)用應(yīng)該考慮使用繼承ActionSupport基類(lèi)。n 方法二:繼承ActionSup
12、port基類(lèi)同樣,為簡(jiǎn)單起見(jiàn),我們選取了第一部分2.4.1的例子作說(shuō)明: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、輸入不合法,那么給出出錯(cuò)信息addFieldError("name","Blank names or 'w' not allowed");/返回輸入頁(yè)面return INPUT;/添加歡迎消息message = "hello "+name+"!n"return SUCCESS;表面上看,似乎這個(gè)Action和前一個(gè)例子沒(méi)有太大的差別,都是實(shí)現(xiàn)了execute()方法,然后返回一個(gè)返回類(lèi)型。然而注意execute()里面黑體的部分讀者也許就能發(fā)現(xiàn),這里ActionSupport提供了出錯(cuò)處理的一個(gè)函數(shù)
14、。其實(shí)遠(yuǎn)遠(yuǎn)不止這一個(gè)簡(jiǎn)單的功能,ActionSupport還提供了近30個(gè)成員函數(shù)涵蓋了國(guó)際化、校驗(yàn)、出錯(cuò)處理等各個(gè)方面來(lái)處理用戶的業(yè)務(wù)邏輯。所以如果用戶的業(yè)務(wù)邏輯不是足夠簡(jiǎn)單的話,那么應(yīng)該選擇從ActionSupport基類(lèi)中派生出自己的Action,這樣就可以使用框架所帶來(lái)的種種便捷。3.2 Action接口有了上面的分析,下面讓我們直接來(lái)看一下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)從頁(yè)面提交請(qǐng)求到一個(gè)action的時(shí)候,應(yīng)用就會(huì)跳轉(zhuǎn)到相應(yīng)的action中去執(zhí)行execute()方法。所以當(dāng)編寫(xiě)自己的action的時(shí)候,如果是實(shí)現(xiàn)這個(gè)接口,那么只要在execute()方法中添加相應(yīng)的功能代碼就可以了,但是這并不是一個(gè)好的實(shí)現(xiàn)業(yè)務(wù)邏輯的方法,因?yàn)檫@樣對(duì)于只有很少代碼的應(yīng)用或許是可以的,但是如果是對(duì)有比較多的代碼的應(yīng)用,那么必定會(huì)造成邏輯的混亂,對(duì)以后的維護(hù)、修改等都是不利的。在后面,讀者將會(huì)看到,我們將會(huì)把實(shí)現(xiàn)代碼放在相應(yīng)的類(lèi)中,而在action的execute()方法中只是調(diào)用這些方法,以此來(lái)達(dá)到便于管理的
17、目的。3.3 ActionSupport基類(lèi)ActionSupport是編寫(xiě)設(shè)計(jì)業(yè)務(wù)邏輯Action的強(qiáng)有力支持。它提供的功能也十分強(qiáng)大。下面將會(huì)仔細(xì)的介紹一些常用的ActionSupport的成員函數(shù),并且詳細(xì)的了解ActionSupport的原理。下面列出了ActionSupport基類(lèi)的大部分成員函數(shù)以及相關(guān)描述:表3-1 ActionSupport的成員函數(shù)返回類(lèi)型成員函數(shù)描述voidaddActionError(Sting anErrorMessage)向Action添加一個(gè)Action級(jí)別的錯(cuò)誤voidaddActionMessage(String aMessage)向Action
18、添加一個(gè)Action級(jí)別的信息void addFieldError(String fieldName, String errorMessage)為指定的域添加一個(gè)出錯(cuò)信息void clearErrorsAndMessages()清除所有的錯(cuò)誤和信息Stringexecute()其缺省的實(shí)現(xiàn)僅返回SUCCESSCollectiongetActionErrors()獲得Action級(jí)別的錯(cuò)誤集合CollectiongetActionMessages()獲得Action級(jí)別的信息集合MapgetFieldErrors()獲得與域相關(guān)的錯(cuò)誤信息的集合StringgetText(St
19、ring aTextName)基于鍵獲得指定的鍵值,不存在則返回NULLStringgetText(String aTextName, List args)基于鍵和附加參數(shù)獲得指定的鍵值,不存在則返回NULLStringgetText(String aTextName, String defaultValue)基于鍵獲得指定的鍵值,不存在則返回缺省值boolean hasActionErrors()是否有Action級(jí)別的錯(cuò)誤boolean hasActionMessages()是否有Action級(jí)別的信息boolean hasErrors()
20、是否有錯(cuò)誤,包括域和Action級(jí)別boolean hasFieldErrors()是否有域級(jí)別的錯(cuò)誤voidpause(String result)暫停Action的執(zhí)行,拋出異常,并轉(zhuǎn)向?qū)?yīng)返回類(lèi)型voidsetActionErrors(Collection errorMessages)設(shè)置Action級(jí)別的所有錯(cuò)誤voidsetActionMessages(Collection messages)設(shè)置Action級(jí)別的所有信息voidsetFieldErrors(Map errorMap)設(shè)置域級(jí)別的所有錯(cuò)誤voidvalidate()默認(rèn)的空校驗(yàn)
21、器我們?cè)诰帉?xiě)控制器的時(shí)候,能夠使用的框架的API也就是這些了,當(dāng)然不是所有的都經(jīng)常使用,一般常用的是出錯(cuò)處理的一些函數(shù),如hasErrors()、hasFieldErrors()等等。讀者可以對(duì)照自己的需求合理的選取和使用自己所需的API。為了更好的理解Struts2,下面我們對(duì)ActionSupprot的源代碼進(jìn)行剖析: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(); /*省略語(yǔ)句*/ public Map getErrors() return getFieldErrors(); /*省略語(yǔ)句*/ public
24、Locale getLocale() return ActionContext.getContext().getLocale(); public String getText(String aTextName) return textProvider.getText(aTextName); /*省略語(yǔ)句*/ public void addActionError(String anErrorMessage) validationAware.addActionError(anErrorMessage); /*省略語(yǔ)句*/ public String doInput() throws Excepti
25、on return INPUT; /*省略語(yǔ)句*/ public boolean hasActionErrors() return validationAware.hasActionErrors(); /*省略語(yǔ)句*/ public void clearErrorsAndMessages() validationAware.clearErrorsAndMessages(); public void validate() public void pause(String result) 從上述代碼中可以發(fā)現(xiàn)ActionSupport基類(lèi)實(shí)現(xiàn)了很多的接口,但是仔細(xì)的觀察上面列出的函數(shù)不難發(fā)現(xiàn),它所
26、提供的接口都是圍繞著控制器的核心出錯(cuò)處理來(lái)完成的,如hasActionErrors()等等??v觀整個(gè)文件,所有的操作都圍繞著validationAware這個(gè)類(lèi)展開(kāi),validationAware對(duì)于ActionSupport來(lái)說(shuō)是非常重要的一部分,所有的Error,Message,FieldError都間接的存放在validationAware這個(gè)類(lèi)中。那么validationAware這個(gè)類(lèi)究竟是什么樣子的一個(gè)類(lèi)呢?下面就來(lái)看看它的廬山真面目:com.opensyphony.xwork2. validationAware/*省略代碼*/public class ValidationAwar
27、eSupport implements ValidationAware, Serializable private Collection actionErrors; private Collection actionMessages; private Map fieldErrors; /*省略語(yǔ)句*/ 看到這里就恍然大悟了,actionErrors和actionMessages實(shí)際是用Collection這個(gè)數(shù)據(jù)結(jié)構(gòu)存放的,fieldErrors則是用Map這個(gè)數(shù)據(jù)結(jié)構(gòu)存放的,所有Action對(duì)這三個(gè)變量的操作實(shí)際上都是間接的對(duì)這三個(gè)數(shù)據(jù)結(jié)構(gòu)的操作。以后用到這三個(gè)類(lèi)的時(shí)候自然就有了經(jīng)驗(yàn)。3.4
28、 Action實(shí)例作為示例,我們?cè)谶@里提供兩種不同功能Action的完全實(shí)現(xiàn),供讀者參考和練習(xí)。n 實(shí)現(xiàn)Action接口;n 繼承ActionSupport基類(lèi);3.4.1 實(shí)現(xiàn)Action接口的實(shí)例這里我們使用Action完成一個(gè)有趣的應(yīng)用:由服務(wù)端動(dòng)態(tài)生成顏色代碼供客戶端顯示時(shí)使用,這樣在客戶端每一次刷新頁(yè)面的時(shí)候,文字的顏色就改變一次。下面詳細(xì)講解如何實(shí)現(xiàn)該應(yīng)用。為了實(shí)現(xiàn)這個(gè)應(yīng)用,我們需要編寫(xiě)一個(gè)控制器、一個(gè)頁(yè)面以及與之對(duì)應(yīng)的配置文件,下面讓我們來(lái)一步一步的完成它。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>這個(gè)文件是所有Web應(yīng)用都要有的配置文件,但是對(duì)于不同的框架,實(shí)現(xiàn)的方法和語(yǔ)法是不盡相同的。web.xml是SUN servlet規(guī)范的標(biāo)準(zhǔn)配置文件,所有的Java的Web開(kāi)發(fā)項(xiàng)目都要配置文件,我們發(fā)現(xiàn)Struts2在web.xml里面配置了filter,由此也可以看出,Struts2框架是作為一個(gè)過(guò)濾器來(lái)處理所有的Web請(qǐng)求的。從上面的配置文件可以看出,web.xml指定容器在捕獲到Web請(qǐng)求之后將其轉(zhuǎn)交給Struts2,那么Struts2又是如何
33、來(lái)處理這些請(qǐng)求的呢?這就要觀察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的工作方式進(jìn)行配置。分析這段配置文件可以看出,URL中對(duì)colorText.action的請(qǐng)求會(huì)被Struts2轉(zhuǎn)交給用戶所編寫(xiě)的代碼example.ColorText,具體是怎么處理的,當(dāng)然就要看看對(duì)應(yīng)的源代碼是怎么編寫(xiě)的了。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;在控制器的代碼里面,首先生成了一個(gè)隨機(jī)的顏色RGB,并將其組合為對(duì)應(yīng)的RGB顏色的16進(jìn)制代碼,如果顏色生成成功,就返回成功執(zhí)行的代碼SUCCESS
37、.代碼執(zhí)行到這里,Struts2就會(huì)去配置文件struts.xml里面查找此控制的結(jié)果類(lèi)型SUCCESS的配置,顯然配置文件指示轉(zhuǎn)向到Colorful.vm繼續(xù)執(zhí)行。ColorText.java就是這個(gè)應(yīng)用的action,它的功能是為頁(yè)面提供隨機(jī)的顏色。這將會(huì)在后面的效果圖中看到。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這個(gè)action后跳轉(zhuǎn)到的頁(yè)面,顯示一些文本。代碼中加粗的部分,就是變色頁(yè)面的關(guān)鍵代碼,通過(guò)$randomRGB每一次刷新頁(yè)面都會(huì)從Action取得一個(gè)隨機(jī)的顏色,從而實(shí)現(xiàn)了頁(yè)面顏色的不斷變化。由于在視圖中使用了中文,必須做相應(yīng)的配置(即國(guó)際化的問(wèn)題,在后面將會(huì)詳細(xì)介紹,這里就暫不介紹),設(shè)置對(duì)應(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文件夾,這是對(duì)Action測(cè)試時(shí)留下的,與項(xiàng)目本身沒(méi)有關(guān)系。如果讀者的配置和文件都沒(méi)有錯(cuò)誤的話,執(zhí)行后應(yīng)該能得到這樣的一個(gè)結(jié)果:圖3-2 結(jié)果頁(yè)面如果讀者刷新頁(yè)面,那么將得到另一種顏色的文字:圖3-3 刷新后的頁(yè)面3.4.2 實(shí)現(xiàn)ActionSupport基類(lèi)的實(shí)例我們知道ActionSupport基類(lèi)為用戶提供了很多的函數(shù)使得Action實(shí)現(xiàn)起
40、來(lái)更上手,下面來(lái)看這樣一個(gè)例子:首先用戶登陸一個(gè)頁(yè)面AS.JSP,然后頁(yè)面提示用戶輸入一個(gè)質(zhì)數(shù),如果輸入的是一個(gè)質(zhì)數(shù),ACTION會(huì)跳轉(zhuǎn)到成功頁(yè)面,如果不是,ACTION會(huì)添加錯(cuò)誤提示信息,并將頁(yè)面重定向到輸入頁(yè)面。下面具體分析這些源文件。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)簽會(huì)在后續(xù)章節(jié)中詳細(xì)闡述,這里textfield標(biāo)簽是一個(gè)文本輸入標(biāo)簽,它與常規(guī)的文本輸入域相比最大的優(yōu)點(diǎn)就是集成了錯(cuò)誤顯示功能。從頁(yè)面取得輸入的數(shù)據(jù)之后,需要對(duì)該數(shù)據(jù)進(jìn)行一些判斷,因此還需要編寫(xiě)對(duì)應(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ù)那么添加出錯(cuò)信息,并且返回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;這個(gè)Action對(duì)用戶輸入的數(shù)據(jù)進(jìn)行處理,是質(zhì)數(shù)的將其轉(zhuǎn)到一個(gè)成功的頁(yè)面pass.html,如果不是,那么它就會(huì)向輸入域添加一個(gè)域級(jí)別的錯(cuò)誤信息,然后調(diào)用pause()方法使用戶返回INPUT頁(yè)面重新進(jìn)行輸入。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>這是一個(gè)簡(jiǎn)單的顯示通過(guò)信息的頁(yè)面。如果通過(guò)了質(zhì)數(shù)測(cè)
46、試,那么系統(tǒng)將向用戶顯示這個(gè)頁(yè)面。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>這個(gè)
48、是對(duì)應(yīng)的配置文件,由于web.xml和前面所舉的例子完全一致,所以這里不再累述。WEB應(yīng)用的框架結(jié)構(gòu)和上例也是一樣的,讀者可以參照前面的例子進(jìn)行配置。由于篇幅的原因,我們這里只給出,輸入錯(cuò)誤后的界面。圖3-4 有FieldError的INPUT頁(yè)面3.5在Action中實(shí)現(xiàn)基本校驗(yàn)校驗(yàn)是業(yè)務(wù)邏輯中經(jīng)常碰到的一個(gè)問(wèn)題,有很多方法可以實(shí)現(xiàn)這個(gè)業(yè)務(wù)邏輯。Struts2提供了基本校驗(yàn)和高級(jí)的框架校驗(yàn)來(lái)滿足不同層次的需要,這里將向讀者講述基本校驗(yàn)的一些策略和方法,至于高級(jí)的校驗(yàn)框架,將在后面的第三部分高級(jí)特性中向讀者詳細(xì)闡述。3.5.1使用Action的execute()方法如果我么使用Action接口
49、,而不是集成ActionSupport,因?yàn)闆](méi)有框架提供的API支持所以大部分的校驗(yàn)邏輯都由用戶自行在execute()這個(gè)方法里完成,而且無(wú)法集成出錯(cuò)的處理,如果要添加出錯(cuò)信息,那么只有在Action里面添加新的屬性字段,因此比較適合一些簡(jiǎn)單的校驗(yàn)。例如在第一部分向讀者展示的一個(gè)HelloWorld的例子,其實(shí)就是基本校驗(yàn)的雛形。舉一個(gè)簡(jiǎn)單的例子,如果需要對(duì)用戶輸入的一個(gè)數(shù)值進(jìn)行校驗(yàn)以確定它是一個(gè)素?cái)?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)我們把校驗(yàn)的邏輯混合在execute()方法里面的時(shí)候,勢(shì)必會(huì)造成維護(hù)的困難,不僅如此代碼的可復(fù)用性也大大降低。因此十分有必要將校驗(yàn)與Action的execute()方法
51、獨(dú)立開(kāi)來(lái)。3.5.2使用ActionSupport的validate()方法與基本的Action相比ActionSupport實(shí)現(xiàn)了很多的成員函數(shù),特別是為校驗(yàn)提供便利的很多成員函數(shù),不僅如此ActionSupport更是實(shí)現(xiàn)了validate()這個(gè)方法,將校驗(yàn)與業(yè)務(wù)邏輯的流程獨(dú)立開(kāi)來(lái),這樣ActionSupport與Action相比就更適合拿來(lái)做校驗(yàn)。同樣的校驗(yàn)質(zhì)數(shù)的應(yīng)用如果有了ActionSupprot基類(lèi)的支持,可以這樣寫(xiě)。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;這樣來(lái)寫(xiě)代碼不僅對(duì)客戶更友好(提供了出錯(cuò)的信息提示),代碼的可復(fù)用性也得到了加強(qiáng),因此如果不是特別簡(jiǎn)單的校驗(yàn),推薦使用基類(lèi)方式來(lái)完成校驗(yàn)。3.5.3 使用注釋實(shí)現(xiàn)校驗(yàn)上面介紹了兩種實(shí)現(xiàn)校驗(yàn)的方法,它們有一個(gè)共同點(diǎn):所有實(shí)現(xiàn)校驗(yàn)功能的代碼都是由程序員自己編寫(xiě)?;蛟S有人會(huì)問(wèn):作為一個(gè)框架,Struts2在校驗(yàn)上只能為使用者提供這些功能嗎?其實(shí),Struts2提供的功能遠(yuǎn)不止這些,下面將介紹的注釋實(shí)現(xiàn)校驗(yàn)就能在很大程度上簡(jiǎn)便校驗(yàn)的實(shí)現(xiàn)。Struts2本身提供了許多校驗(yàn)器供
54、編程人員使用,使用這些校驗(yàn)器可以方便地校驗(yàn)像輸入是否為空、是否符合特定的格式(如:Date格式、email格式)等規(guī)則?,F(xiàn)在,由于Java1.5的注釋機(jī)制能更加方便程序員編程,所以Struts2也引入了這一機(jī)制。而在Struts2中,結(jié)合上面的兩種優(yōu)點(diǎn),可以使用注釋來(lái)實(shí)現(xiàn)校驗(yàn)功能。通過(guò)查看源代碼可以發(fā)現(xiàn),在包c(diǎn)om.opensymphony.xwork2.validator.annotations下有實(shí)現(xiàn)校驗(yàn)的源代碼文件,下面將這些文件列表如下3-2所示:表3-2 注釋校驗(yàn)器及其功能文件名功能RequiredFieldValidator.java校驗(yàn)指定字段是否為空RequiredString
55、Validator.java校驗(yàn)指定字符串字段非空IntRangeFieldValidator.java校驗(yàn)指定整數(shù)字段是否在一個(gè)范圍內(nèi)DateRangeFieldValidator.java校驗(yàn)指定的日期是否在一個(gè)范圍內(nèi)ExpressionValidator.java校驗(yàn)指定的表達(dá)式是否為真FieldExpressionValidator.java校驗(yàn)指定OGNL表達(dá)式字段EmailValidator.java校驗(yàn)一個(gè)指定的字符字段如果非空是否是一個(gè)合法郵箱地址UrlValidator.java校驗(yàn)一個(gè)指定的字段是否是字符串并且合法VisistorFieldValidator.java將當(dāng)前
56、校驗(yàn)推送到另一相關(guān)校驗(yàn)ConversionErrorFieldValidator.java校驗(yàn)指定字段是否發(fā)生轉(zhuǎn)換錯(cuò)誤StringLengthFieldValidator.java校驗(yàn)指定字段是否發(fā)生轉(zhuǎn)換錯(cuò)誤RegexFieldValidator.java校驗(yàn)指定使用正規(guī)表達(dá)式的字符字段DoubleRangeFieldValidator.java校驗(yàn)指定符點(diǎn)數(shù)字段是否在一個(gè)范圍內(nèi)在編程過(guò)程中,只要導(dǎo)入包c(diǎn)om.opensymphony.xwork2.validator.annotations,就可以使用這些校驗(yàn)器。要使用注釋實(shí)現(xiàn)校驗(yàn),可以按照下面的步驟:1. 創(chuàng)建一個(gè)接口或者一個(gè)類(lèi)。正如前面所
57、說(shuō),一般情況下創(chuàng)建繼承com.opensymphony.xwork2.ActionSupport的類(lèi)。2. 為類(lèi)創(chuàng)建字段變量,并為這此變量創(chuàng)建getter和setter方法。3. 使用com.opensymphony.xwork2.validator.annotations.Validation注釋上面創(chuàng)建的類(lèi),告訴Struts2將為該類(lèi)使用注釋校驗(yàn)。例如:Validation()public class AnnotationAction extends ActionSupport這樣就打開(kāi)了注釋校驗(yàn)功能。4. 為setter()方法或execute()方法添加校驗(yàn)器。這里是實(shí)現(xiàn)對(duì)不同的字段使
58、用不同的校驗(yàn)器的地方。例一: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()方法添加校驗(yàn)器,添加的校驗(yàn)器是IntRangeFieldValidator。其中,type可以是ValidatorType.FIELD或ValidatorType.SIMPLE,min和max是被校驗(yàn)整數(shù)的最大值和最小值,而message是校驗(yàn)出錯(cuò)時(shí)的信息。例二:expressions = ExpressionValidator(expression = "password=confirm", message = "password must be equles to confirm. password=
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)生安全責(zé)任規(guī)定
- 2025年炸藥、煙火及火工產(chǎn)品項(xiàng)目申請(qǐng)報(bào)告
- 食品配送與包裝技術(shù)研發(fā)合作協(xié)議
- 2025年鉗型表項(xiàng)目申請(qǐng)報(bào)告
- 2025年磁粉離合器項(xiàng)目提案報(bào)告
- 2025年武漢市事業(yè)單位招聘考試綜合類(lèi)專(zhuān)業(yè)能力測(cè)試試卷(財(cái)務(wù)類(lèi))
- 物流運(yùn)輸行業(yè)工作表現(xiàn)證明書(shū)(6篇)
- 一個(gè)特別的節(jié)日記事作文(6篇)
- 2025年儲(chǔ)能技術(shù)多元化在電力系統(tǒng)中的應(yīng)用與市場(chǎng)前景分析報(bào)告
- ?學(xué)前教育信息化在幼兒園家長(zhǎng)工作中的應(yīng)用現(xiàn)狀與改進(jìn)策略
- 農(nóng)業(yè)企業(yè)資產(chǎn)重組方案
- 幼兒園食堂舉一反三自查報(bào)告
- 患者發(fā)生窒息的應(yīng)急
- 《環(huán)氧樹(shù)脂生產(chǎn)工藝》課件
- 冶金員工安全培訓(xùn)
- 合理雅思學(xué)習(xí)計(jì)劃
- 腹股溝疝護(hù)理新進(jìn)展
- 機(jī)修工2025年上半年工作總結(jié)范文
- 食品標(biāo)準(zhǔn)操作規(guī)程
- 《人民法院》課件
- 青海大學(xué)《普通化學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
評(píng)論
0/150
提交評(píng)論