【struts2】名为dispatcher的ResultType
1)基本使用
名稱為“dispatcher”的ResultType,在struts-default.xml里的配置如下:
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>通過配置可以看出,它對應的實現類是ServletDispatcherResult。
如果采用JSP作為視圖的實現技術,那么這個ResultType是最常用的。在這個ResultType的實現中,調用了javax.servlet.RequestDispatcher類的forward方法,也就是說它相當于是對RequestDispatcher的一個再包裝。
既然是這樣,那么在Servlet中使用RequestDispatcher來進行頁面跳轉的特性,也就自然被“dispatcher”這個ResultType繼承下來了。那么Servlet中的RequestDispatcher,到底有什么特性呢?那就是是通過RequestDispatcher來進行頁面跳轉,將會保持是同一個請求對象。這有什么好處呢?由于是同一個對象,那就意味著有同樣的數據,而請求對象里面數據眾多,在Servlet的request對象里面,典型有如下數據:
- 參數區(parameter),就是用戶在頁面上填寫并提交的數據
- Head區,由瀏覽器在發出請求的時候,自動加入到請求包的數據
- 屬性區(Attribute),由開發人員存儲在屬性區的值,通常是通過request.setAttribute方法、request.getAttribute方法來進行訪問
- cookie區,由瀏覽器在發出請求的時候,自動把相關的Cookie數據通過request傳遞到服務端
好處是不是很大?因此這也是使用Struts2來進行web開發中最常使用的ResultType。
2)特殊用法
在<result>元素的定義中可以使用Action的execute方法運行之后的數據。怎么做呢?一起來看看示例。或許我們都已經習慣于以下這種簡單的<result>配置:
<result name="toWelcome">/s2impl/welcome.jsp</result>里面用于指定jsp位置的字符串都是固定的。如果我們希望這個字符串是活動的,可以根據某些參數值來變化,該怎么做到呢?如果我們在Action中定義一個folder字符串,并在execute中或validate中對它進行賦值,這里我們放到validate中,代碼如下:
package cn.javass.hello.struts2impl.action; import com.opensymphony.xwork2.ActionSupport;public class HelloWorldAction extends ActionSupport { private String account; private String password; private String submitFlag; private String folder; public String execute() throws Exception { this.businessExecute(); return "toWelcome"; } public void validate(){ this.folder = "s2impl"; //放在這里的原因是:validate先與execute執行,如果fieldError里面有值,execute就不執行了if(account==null || account.trim().length()==0){ this.addFieldError("account", this.getText("k1")); } if(password==null || password.trim().length()==0){ this.addFieldError("password", this.getText("k2")); }if(password!=null && !"".equals(password.trim()) && password.trim().length()<6){ this.addFieldError("password", this.getText("k3")); } } /** * 示例方法,表示可以執行業務邏輯處理的方法, */ public void businessExecute(){ System.out.println("用戶輸入的參數為==="+"account="+account+",password="+password+",submitFlag="+submitFlag); }public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getSubmitFlag() {return submitFlag;}public void setSubmitFlag(String submitFlag) {this.submitFlag = submitFlag;}public String getFolder() {return folder;}public void setFolder(String folder) {this.folder = folder;} } View Code那么,在<result>的定義中就可以引用folder這個變量,示例如下:
<package name="helloworld" extends="struts-default"> <action name="helloworldAction" class="cn.javass.hello.struts2impl.action.HelloWorldAction"> <result name="toWelcome" type="dispatcher">/${folder}/welcome.jsp</result> <result name="input">/${folder}/login.jsp</result> </action> </package>這樣配置的結果和前面寫死的路徑效果時完全一樣的。仔細觀察一下你會發現,“${folder}”的寫法跟以前在jsp上寫的el表達式類似,而里面的“folder”是跟Action的屬性相對應的。
3)更完整的配置方式
? 平時我們把result對應的jsp的路徑,直接作為<result>元素中的文本來配置,這是簡化的寫法,實際上對于dispatcher還有兩個參數可以配置,示例如下:
<result name="toWelcome" type="dispatcher"> <param name="location">/s2impl/welcome.jsp</param> <param name="parse">true</param> </result>location參數就是咱們平時寫的下一個jsp的位置,而parse參數決定了location是否可以通過使用OGNL來引用參數,默認為true。其實,前面使用${folder}來引用Action的folder屬性的值的例子,就是使用的OGNL來引用參數。
參考資料:http://www.iteye.com/topic/1124526
轉載于:https://www.cnblogs.com/ningvsban/p/3735025.html
總結
以上是生活随笔為你收集整理的【struts2】名为dispatcher的ResultType的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20款响应式的 HTML5 网页模板【免
- 下一篇: 【转】利用matlab生成随机数函数