




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、.第五章 Result在探討Result之前,要向大家解釋清楚很容易弄糊涂的兩個概念:返回字符串和返回類型。在前面Action章節(jié),提到返回的字符串有五種,但那不是現(xiàn)在要討論的Result類型,那只是Xwork.xml配置文件中result標(biāo)簽name屬性的值。如下所示:/welcome.jspresult標(biāo)簽還有一個type屬性,但之前并沒有顯式使用過該屬性,即一直使用該標(biāo)簽的默認(rèn)值Dispatcher。在本章中將介紹Result的幾種通用類型,如Dispatcher、Redirect、Chain以及一些其他模塊的幾種返回類型,將介紹Velocity、FreeMark、JasperRepor
2、t三種模塊的返回類型。在介紹他們之前,先帶領(lǐng)讀者看看如何自定義Result,這樣會有助于理解Result的實質(zhì),為以后的學(xué)習(xí)打下基礎(chǔ)。5.1自定義的Result在實現(xiàn)自定義的Result之前,先看看Struts2.0.9中關(guān)于Result的源代碼。Result是一個接口,在xwork-2.0.4.jar中包含了這個類。xwork-2.0.4.jar的源代碼Struts2.0.9中并沒有包括,所以要去opensymphony網(wǎng)站下載xwork-2.0.4-src.zip包,解壓之后,這個類的源代碼文件的路徑就是xwork-2.0.4-srcxwork-2.0.4srcjavacomopensym
3、phonyxwork2Result.java。package com.opensymphony.xwork2;import java.io.Serializable;public interface Result extends Serializable public void execute(ActionInvocation invocation) throws Exception;可以看到,在Result的接口中只定義一個execute()方法,如果讀者想實現(xiàn)自己的Result就必須實現(xiàn)該接口。接下來通過一個例子來看看如何自己創(chuàng)建一個簡單的Result類型。我們給這個Result的類型取名
4、為“test”,通過這個Result類型來告訴Action返回的是何種返回字符串,我們使用一個隨機數(shù)來選擇返回的五個類型中的一種。注意:Result接口中的execute()方法沒有返回類型,因為Result就是執(zhí)行最后的任務(wù),沒有必要再返回其他數(shù)據(jù)了。而Action接口中的execute()方法返回的是String類型。5.1.1實現(xiàn)自定義的Result前面已經(jīng)說過要自定義Result類型,就必須實現(xiàn)Result接口,由于例子比較簡單,只需要在execute()方法中添加幾行代碼。下面是一個完整的ResultType.java文件,它主要功能就是顯示Action返回的類型。ResultTyp
5、e.javapackage example.result;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.Result;SuppressWarnings(serial)public class ResultType implements Result public void execute(ActionInvocation invocation) throws ExceptionString resultCode = invocation.getResultCode();System.
6、out.println(This time of Result code:+resultCode);這個自定義的Result文件是在src的目錄下創(chuàng)建的。看上面的代碼很簡單吧!在這個類里面只實現(xiàn)了一個Result接口中的execute()方法。如果有些函數(shù)讀者不理解,可以去查看相關(guān)文檔。在這里用到的是ActionInvocation這個類,然后調(diào)用里面的getResultCode()方法,這個函數(shù)返回的是在Action中執(zhí)行之后所返回的代碼,即前面提到的五種返回字符串類型之一,接下來是一句簡單的輸出語句。當(dāng)然這只是一個最簡單的自定義Result類型,它不能顯示一個視圖,后面讀者將會看到Stru
7、ts2集成的Result類型,它們的功能將會十分強大,在下一節(jié)讀者將會體會到。其實,Struts2提供的Result類型已經(jīng)夠平時使用了,如果沒有特殊的要求,沒有必要使用自定義Result類型。知道Result的定義后,下面來看看Action的具體代碼。完整的代碼如下所示:TestAction.Javapackage example.result;import java.util.Random;import com.opensymphony.xwork2.ActionSupport;SuppressWarnings(serial)public class TestAction extends
8、ActionSupportpublic String execute() throws Exception/產(chǎn)生一個100以內(nèi)的整數(shù)int random = new Random().nextInt(100); /根據(jù)產(chǎn)生的隨機數(shù),分別返回五種不同的字符串if(random=20)return SUCCESS;else if(random=40)return ERROR;else if(random=60)return LOGIN;else if(random=80)return NONE;elsereturn INPUT;這個文件和ResultType.java是放在同一個目錄下的。這個Ac
9、tion很簡單,它先通過函數(shù)Random().nextInt(100)產(chǎn)生100以內(nèi)的隨機數(shù),然后再通過比較來選擇不同返回類型,最后通過ResultType.java在控制臺上顯示出來。5.1.2配置自己的Result當(dāng)然只有前面兩個文件是不能運行自定義的Result的,需要做相應(yīng)的配置才能使用這個Result類型。Result的配置需要用到兩個文件web.xml和xwork.xml。下面是web.xml的完整代碼:web.xmlweb-app id=WebApp_9 version=2.4 xmlns= xmlns:xsi=/2001/XMLSchema-in
10、stance xsi:schemaLocation= Struts 2 RESULT struts-cleanup org.apache.struts2.dispatcher.ActionContextCleanUp struts-cleanup /* struts2 org.apache.struts2.dispatcher.FilterDispatcher struts2 /* index.html 想使用自定義的Result就要在struts.xml中進行配置,完整的struts.xml如下所示:struts.xml l 在這里可以看到與配置Action的不同之處,上述代碼中加粗部分的代
11、碼是Action配置沒有的。這里用了一個標(biāo)簽,該標(biāo)簽用來標(biāo)志一個Result類型。該標(biāo)簽有三個屬性,一個是name,一個是class,還有就是default。前兩個是必須的,一個指明這個Result類型的名字,一個指出處理這個Result的類是哪個。最后的default屬性只有兩個值,默認(rèn)的情況下是false,即說明這個Result類型不是默認(rèn)的Result類型,使用的時候必須明確指明類型,如所示;若自己賦值為true,如上述代碼所示,可以像這樣使用,無須再指明其返回類型,這也是常用的方式。web.xml,xwork.xml這兩個文件安放的位置跟一般的Action配置是一樣的,最后的目錄結(jié)構(gòu)如
12、圖5-1所示。圖5-1 完整的目錄結(jié)構(gòu)這樣整個自定義的Result就算配置完成了。5.1.3運行測試Result沒有配置返回頁面,那么要怎么樣才能看到結(jié)果和驗證自定義的Result有沒有成功呢?實際上,可以在MyEclipse下面的控制臺視圖中查看運行的結(jié)果。我們打開瀏覽器,輸入http:/localhost:8080/ResultType/test.action,將會出現(xiàn)如圖5-2的畫面。圖5-2 成功的運行界面顯然在瀏覽器中不會有任何顯示,但在MyEclipse的控制臺中會有顯示。多點擊幾次瀏覽器的刷新按鈕,這樣看到的效果會更明顯,如圖5-3所示:圖5-3 控制臺的信息如圖5-3所示,在最
13、下面的五行顯示五種不同的返回類型,這就是這個簡單的Result的功能了??梢钥闯鰜?,自定義Result是很簡單的,如果結(jié)果想要返回一個頁面,就要在定義返回類型的類中增加一個參數(shù)定義,在下面將介紹參數(shù)的作用。而且還要在配置返回結(jié)果的時候加上要返回的頁面,前面所有的例子都是有返回頁面。正如前面所說,根本不需要自己動手去定義Result,Struts2已經(jīng)定義了許多種返回類型,這些返回類型在日常開發(fā)中足夠使用了。這節(jié)的目的主要是想通過一個簡單的Result讓讀者明白整個Result的配置以及運行方式,為后面理解Struts2提供的Result類型打下基礎(chǔ),便于以后的學(xué)習(xí)。5.2常用的Result我們
14、首先了解一下Struts2是在什么地方定義以及配置Result返回類型的。將下載的Struts2.0.9.zip壓縮包解壓之后,在路徑struts-2.0.9-allstruts-2.0.9srccoresrcmainresources下有一個struts-default.xml文件,所有的Result類型都是在這里進行配置,在這里能看到對應(yīng)Result類型的源代碼定義在什么地方。下面是這個文件中關(guān)于Result類型配置部分的代碼:struts-default.xml/*省略語句*/ /*省略語句*/ 從上面的代碼可以明顯看到,它與自己定義的Result類型配置是完全一樣的。文中粗體表示就是各
15、種Struts2定義的Result類型了,至于具體每個類型表示什么,可以參考表5-1,表中列出的也只是一些能用到的部分而并非全部,其他的Result類型請讀者參考Struts2官方文檔。上述配置代碼中,屬性class是各個Result類型對應(yīng)的類文件。在接下來的章節(jié)中,對幾個常用的Result的源代碼進行一些解析,這樣就能進一步了解Result的工作流程以及它的內(nèi)涵。表5-1 Result類型列表Result類型Result對應(yīng)的功能Dispatcher Result用于JSP的整合Redirect Result用于直接跳轉(zhuǎn)到例外的URLChain Result用于 Action Chaini
16、ngXSL Result用于 XML/XSLT 整合HttpHeader Result用于控制特殊的HTTP行為Stream Result用于向瀏覽器返回一個InputStream (一般用于文件下載)PlainText Result用于顯示某個頁面的原始的文本 (例如 jsp, html 等)Redirect Action Result用于直接跳轉(zhuǎn)到另外的actionVelocity Result用于Velocity的整合FreeMarker Result用于FreeMarker的整合JasperReports Result用于JasperReports的整合下面就開始進入探討Result類
17、型之旅了。我們會介紹其中的三種常用Result類型以及其他三種關(guān)于視圖的Result類型。5.2.1 Dispatcher要想真正理解Dispatcher的作用,應(yīng)該首先通過struts-default.xml找到Dispatcher 對應(yīng)的類文件,查看其源代碼。在目錄Struts2-.0.9Struts2-src-.0.9comopensymphonyStruts2dispatcher下可以找到一個ServletDispatcherResult.java文件。下面是截取ServletDispatcherResult.java的部分代碼:ServletDispatcherResult.java
18、/*省略語句*/ public class ServletDispatcherResult extends StrutsResultSupport /*省略語句*/private static final Log log = LogFactory.getLog(ServletDispatcherResult.class);/*省略部分方法*/實現(xiàn)從父類繼承的方法 public void doExecute(String finalLocation, ActionInvocation invocation) throws Exception if (log.isDebugEnabled() lo
19、g.debug(Forwarding to location + finalLocation); PageContext pageContext = ServletActionContext.getPageContext(); if (pageContext != null) pageContext.include(finalLocation); else HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getR
20、esponse(); RequestDispatcher dispatcher = request.getRequestDispatcher(finalLocation); if (dispatcher = null) /給出錯誤的提示信息 response.sendError(404, result + finalLocation + not found); return; if(!response.isCommitted()&(request.getAttribute(javax.servlet.include.servlet_path) = null) /設(shè)置request中元素的值 r
21、equest.setAttribute(struts.view_uri, finalLocation); request.setAttribute(struts.request_uri,request.getRequestURI();dispatcher.forward(request, response); else dispatcher.include(request, response); 在前面自定義Result的時候說過,任何Result類型都需要實現(xiàn)Result接口的execute()方法,但是在此處并未實現(xiàn),為什么呢?在上述代碼中的粗體部分可以看到ServletDispatche
22、rResult類是繼承StrutsResultSupport類的,那再分析一下StrutsResultSupport這個類,在與ServletDispatcherResult.java文件相同目錄下可以找到StrutsResultSupport.java文件,其部分代碼如下:StrutsResultSupport.java/*省略語句*/ /這個類實現(xiàn)了Result接口public abstract class Struts2ResultSupport implements Result, StrutsStatics private static final Log _log = LogFac
23、tory.getLog(Struts2ResultSupport.class); public static final String DEFAULT_PARAM = location; private boolean parse; private boolean encode; private String location; private String lastFinalLocation; /*省略一些方法*/public void setLocation(String location) this.location = location;public String getLastFin
24、alLocation() return lastFinalLocation; public void setParse(boolean parse) this.parse = parse; public void setEncode(boolean encode) this.encode = encode;public void execute(ActionInvocation invocation) throws Exception lastFinalLocation = conditionalParse(location, invocation); doExecute(conditiona
25、lParse(location, invocation), invocation); protected String conditionalParse(String param, ActionInvocation invocation) /*省略語句*/ protected abstract void doExecute(String finalLocation, ActionInvocation invocation) throws Exception;看了StrutsResultSupport.java文件,想必大家就很明白為什么ServletDispatcherResult類沒有實現(xiàn)R
26、esult接口的execute()方法了。文中粗體所示的部分表明StrutsResultSupport類是一個抽象類,在它里面實現(xiàn)了execute()方法,不過它的實現(xiàn)是調(diào)用一個doExecute()方法。在繼承StrutsResultSupport類的時候,只要實現(xiàn)doExecute()方法就能達到對Result接口execute()方法的實現(xiàn)!所以在ServletDispatcherResult.java文件中只有這一個方法。下面來看看Result的參數(shù),就是在配置struts.xml文件時標(biāo)簽對應(yīng)的參數(shù)。在Struts2ResultSupport.java文件中用粗體表示的還有一些代碼:
27、public static final String DEFAULT_PARAM = location;protected boolean parse ;protected String location;這三句代碼就定義了Dispatcher的兩個參數(shù),各自功能如下:n location (默認(rèn)):執(zhí)行后轉(zhuǎn)到的地方(如jsp頁面)。n parse:這個值在構(gòu)造函數(shù)中已經(jīng)默認(rèn)為true。如果設(shè)置為false,location參數(shù)就不會被解析為Ognl表達式。location對應(yīng)的就是自己編寫的頁面的地址,如果要返回一個頁面就得擁有這個參數(shù),否則定義的返回類型就不能返回到指定的頁面。在以后介紹的
28、每一種Result類型的時候,都會有這個DEFAULT_PARAM靜態(tài)字符串變量。這個變量指明location是默認(rèn)的參數(shù),這就讓使用者能夠更方便的使用這種類型。清楚了返回類型怎么實現(xiàn)之后,接下來要考慮如何如在Action中用到它們。首先回顧一下第一個Action的例子,在xwork.xml配置文件里有這些代碼:/*省略語句*/ /*省略語句*/ /welcome.jsp/*省略語句*/ 在struts.xml中將struts-default.xml文件包含進來,就是為了可以使用在struts-default.xml中定義的各種Result類型。再看標(biāo)簽,它只有一個name屬性,沒有type屬
29、性的指定也沒有參數(shù)的指定,為什么可以這樣?它怎么知道選擇何種Result類型?原來在struts-default.xml中是這樣定義Dispatcher的:原來已經(jīng)定義default為true了,而且其他的Result都沒有這個定義。location參數(shù),因為有了默認(rèn)的DEFAULT_PARAM靜態(tài)字符串來表示,所以location參數(shù)也可以不需要顯式表明。那么對于上面的Result標(biāo)簽更完整的配置應(yīng)該是這樣的/welcome.jsp至于parse參數(shù),它是一個布爾型的,默認(rèn)值為true,它是用來解析參數(shù)location的,具體的Ognl部分請參看以后的關(guān)于表達式語言的章節(jié)。弄清楚上述問題之后
30、,現(xiàn)在重點來看ServletDispatcherResult.java中的doExecute()方法,弄清楚它的工作流程。ServletDispatcherResult.java/*省略語句*/ if (log.isDebugEnabled() log.debug(Forwarding to location + finalLocation); PageContext pageContext = ServletActionContext.getPageContext(); if (pageContext != null) pageContext.include(finalLocation);
31、else HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); RequestDispatcher dispatcherrequest.getRequestDispatcher(finalLocation); if (dispatcher = null) /404錯誤代碼對應(yīng)的錯誤信息的輸出 response.sendError(404, result + finalLocation +
32、not found); return; if(!response.isCommitted()&(request.getAttribute(javax.servlet.include.servlet_path) = null) /設(shè)置request中元素的值 request.setAttribute(struts.view_uri, finalLocation); request.setAttribute(struts.request_uri,request.getRequestURI();dispatcher.forward(request, response); else dispatche
33、r.include(request, response); 上面是doExecute()方法的具體實現(xiàn),可以從粗體部分看出這個Result有三種執(zhí)行方式:n 如果在一個JSP的范圍內(nèi)(PageContext對象可用),PageContext的include(String)方法會被調(diào)用。n 如果沒有PageContext對象,并且也不在任何形式的include中(在request的屬性中沒有javax.servlet.include.servlet_path),那么調(diào)用RequestDispatcher的forward方法。n 否則調(diào)用RequestDispatcher的include方法。還可
34、以看到,如果dispatcher=null的話,會返回404代碼錯誤。所以以后在使用Dispatcher的時候遇到404錯誤的時候,就應(yīng)該知道是返回對應(yīng)的頁面地址或者Action找不到的問題。至于具體的類的含義以及方法是干什么的,讀者可以自己去查閱servlet的API文檔。這就是整個Dispatcher Result的流程了。下面用一個流程圖來概括一下,如圖5-4所示。圖5-4 Dispatcher Result的流程這一節(jié)因為是第一次講解Struts2定義的Result類型,所以內(nèi)容比較多。這個小節(jié)對源代碼進行了探討,介紹了參數(shù),執(zhí)行方式等內(nèi)容,讓讀者完全理解Dispatcher Resu
35、lt。后面因為有了這節(jié)的基礎(chǔ),Result的講解將比較簡單了。5.2.2 RedirectRedirect,即重定向,Action如果配置這種返回類型,那么就可以有三種不同的返回效果,分別是返回到頁面、連接到另一個Action、還可以連接到一個網(wǎng)址。有了前面Dispatcher Result的基礎(chǔ),Redirect Result理解起來就比較容易了。讓我們看看Redirect Result的源代碼是如何實現(xiàn)的。首先看Redirect在struts-default.xml中的配置:這就是Redirect在struts-default.xml中的配置,與Dispatcher的不同就是沒有defau
36、lt屬性,通過上一小節(jié)可以知道,Redirect并不是默認(rèn)的,使用的時候必須指明類型屬性type=”redirect”。在ServletDispatcherResult.java文件路徑下可以找到ServletRedirectResult.java文件,其代碼如下:ServletRedirectResult.java/*省略語句*/ public class ServletRedirectResult extends StrutsResultSupport private static final Log log = LogFactory.getLog(ServletRedirectResul
37、t.class);/*省略部分代碼*/ protected boolean prependServletContext = true; public void setPrependServletContext(boolean prependServletContext) this.prependServletContext = prependServletContext; protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception /*省略語句*/ response.s
38、endRedirect(finalLocation); /*省略語句*/ 在這里只是簡單的截取一些代碼片斷,粗體部分顯示了它和Dispatcher一樣都是繼承StrutsResultSupport類的,都實現(xiàn)了doExecute()方法。有興趣的讀者可以把這段完整的源代碼找出來研究一下,在這里就不再贅訴了。同樣,Redirect也有自己的參數(shù)。n location(默認(rèn)):action執(zhí)行后跳轉(zhuǎn)的地址。n parse:這個值在構(gòu)造函數(shù)中已經(jīng)默認(rèn)為true。如果設(shè)置為false,location參數(shù)不會被當(dāng)作Ognl表達式解析。參數(shù)和Dispatcher是一樣的,不過這里的location可以是
39、一般的JSP頁面,可以是一個Action,還可以是一個其他的網(wǎng)址(譬如:)。這就是Redirect被稱為重定向的原因,可以定向到不同的方式。下面通過一個簡單的例子來了解一下Redirect。在一個項目里面定義三個Action,他們的Result的類型都是redirect,但是他們重定向的對象不同,一個為一般的JSP頁面,一個為Action,一個是一個網(wǎng)址URL。可以把本書一開始創(chuàng)建的第一個Action項目拿出來使用,在同一個包中再添加兩個Action,這兩個Action只返回SUCCESS,不做其他事情。下面是三個Action的對應(yīng)源代碼:helloworld.javapackage exam
40、ple;import com.opensymphony.xwork2.ActionSupport;SuppressWarnings(serial)public class helloworld extends ActionSupportpublic String message;public String name;public String execute()if ( name = null | .equals(name)|w.equals(name)message=Blank names or w not allowed;return INPUT;message = hello +name+!n;return SUCCESS;public String getMessage()return mes
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國節(jié)能護眼燈具數(shù)據(jù)監(jiān)測研究報告
- 2025年中國脫脂劑/粉市場調(diào)查研究報告
- 2025年中國耳鼻喉科用鑿項目投資可行性研究報告
- 2025年中國眼影A市場調(diào)查研究報告
- 2025年中國豬鏈球菌活疫苗項目投資可行性研究報告
- 2025年中國焚燒爐鼓引風(fēng)機項目投資可行性研究報告
- 檔案員技師考試試題及答案
- 廉政教育考試試題及答案
- 護理期末考試試題及答案
- 公務(wù)員能源局面試題目及答案
- 廣東省珠海市電工等級低壓電工作業(yè)
- 【國開】2023年春《互換性與技術(shù)測量》形考任務(wù)一二三四參考答案
- 乳品行業(yè)-無菌包裝機培訓(xùn)資料3
- 關(guān)于中國文化遺產(chǎn)北京故宮的資料
- 英語演講知到章節(jié)答案智慧樹2023年哈爾濱工程大學(xué)
- BS EN ISO 15848-1-2015 工業(yè)閥-逸散性排放的測量、試驗和鑒定程序(中文)
- 危險化學(xué)品(柴油)儲運安全管理考試試題及答案
- 法醫(yī)學(xué)智慧樹知到答案章節(jié)測試2023年中南大學(xué)
- 2023年版一級建造師-水利工程實務(wù)電子教材
- 2023年下半年軟件設(shè)計師上午真題及參考答案
- 中華優(yōu)秀傳統(tǒng)文化智慧樹知到答案章節(jié)測試2023年青島黃海學(xué)院
評論
0/150
提交評論