XingXingMVC的源代碼和例子代碼 html
今天講forward和redirect的處理.java
在前面的介紹中,用戶提交頁面以後,觸發後臺form類的事件,因爲事件的返回值我都設爲void,所以xingxingmvc將原頁面返回.若是 要返回不一樣的頁面,則可使用forward方式或redirect方式。這兩種方式下都要求form類的事件要有返回值,返回值爲字符串。舉例:web
forward方式:數組
public String btnOK(Map mapRequest,Map mapSession) { //do something. return "forward:../Target.jsp"; }
這裏,返回值是一個字符串,格式爲:"forward:" + 返回頁面的url地址。 瀏覽器
相相似,redirect的返回值也是一個字符串,格式爲:"redirect:" +返回頁面的url地址。服務器
下面開始練習。我仍使用FirstDemo工程做例子,同樣的,web.xml的配置跟前兩天同樣,沒有變化。mvc
開始建立頁面,第一個頁面是forward測試頁面,名稱爲forwardtest.jsp,完整路徑:go/forwardtest.jsp。代碼以下jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <form> <p><label>姓名</label><input type="text" name="txtName"/></p> <p><input type="submit" value="點擊後會返回新頁面的內容" name="btnOK"/></p> </form> <hr/> <%@include file="../bottom.jspf" %> </body> </html>
對應的後臺form類爲forwardtest.java,完整路徑爲forms.go.forwardtest.java。代碼以下:測試
package forms.go; import forms.myBase.DemoBaseForm; import java.util.Map; /** * * @author hicen */ public class forwardtest extends DemoBaseForm { public String btnOK(Map mapRequest,Map mapSession) { String strName = gstr("txtName",mapRequest); mapRequest.put("strName",strName); return "forward:" + "Target.jsp"; } }
目標頁面爲Target.jsp,代碼以下:ui
<%@page import="java.lang.reflect.Array"%> <%@page import="java.util.Enumeration"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>forward目標頁面</title> </head> <body> <hr/> <table> <tr><td>屬性</td><td>值</td></tr> <% Enumeration<String> enu = request.getParameterNames(); while(enu.hasMoreElements()) { String strKey = enu.nextElement(); Object objValue = request.getAttribute(strKey); String strValue=""; if( objValue instanceof Object[]) { strValue = "這是一個數組."; int intArrayLength=Array.getLength(objValue); for(int i=0;i<intArrayLength;i++) { Object o = Array.get(objValue, i); strValuestrValue = strValue +" " + strKey+"["+i+"]='"+ o.toString()+"'"; } } else { strValue = objValue.toString(); } %> <tr><td><%=strKey%></td><td><%=strValue%></td></tr> <% } %> </table> <hr/> <%@include file="../bottom.jspf" %> </body> </html>
打開forwardtest.jsp頁面,在頁面裏輸入:forward測試,如圖
點擊按鈕「點擊後會返回新頁面的內容」,結果以下圖:
從圖中能夠看到,forward後,瀏覽器上的url沒有變,request裏的attribute也都傳過來了,例如,strName的值,這是 在form類中設置的,至關於request.setAttribute("strName","forward測試");有意思的是,request裏 的參數也都帶過來了,這就跟僅僅使用 request.getRequestDispatcher(uri).forward(request,response)不一樣了,後者在 forward時候是沒法將request的參數也都傳過去的,爲何這樣呢,緣由是xingxingmvc包裝了request。具體在之後的代碼分析 中再講。
須要指出的是,目標頁面Target.jsp也有一個後臺form類,在forward方式下,這個form類是不會被調用的。
下面開始講redirect方式。
先給出redirecttest.jsp代碼:
<%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <form> <p><label>姓名</label><input type="text" name="txtName"/></p> <p><input type="submit" value="點擊後會跳轉到新頁面" name="btnOK"/></p> </form> <hr/> <%@include file="../bottom.jspf" %> </body> </html>
這個頁面跟forwardtest頁面相似。
而後給出後臺form類的代碼
package forms.go; import forms.myBase.DemoBaseForm; import java.util.Map; /** * * @author hicen */ public class redirecttest extends DemoBaseForm { public String btnOK(Map mapRequest,Map mapSession) { String strName = gstr("txtName",mapRequest); mapRequest.put("strName",strName); return "redirect:" + "Target.jsp"; } }
這裏的form類,btnOK事件的返回值是字符串,格式爲:"redirect:" +目標頁面url地址。跟forwardtest頁面同樣,返回的目標頁面都是Target.jsp。
Target.jsp也有後臺form類,代碼以下:
package forms.go; import java.util.Map; /** * * @author hicen */ public class Target { /** * 當使用forward輸出頁面時候,目標頁面的form類不會被調用.所以目標頁面的後臺form類onload事件不會被觸發. * 當使用redirect輸出頁面時候,目標頁面的form類會被調用,所以目標頁面的後臺form類的onload事件被觸發. * @param mapRequest * @param mapSession */ public void onLoad(Map mapRequest,Map mapSession) { mapRequest.put("haha", "redirect會觸發目標頁面後臺form類的onload事件"); } }
打開redirecttest.jsp頁面,在頁面輸入:redirect測試,結果以下圖:
點擊按鈕。這時候redirecttest頁面的後臺form類 redirecttest.java會被調用,btnOK事件觸發,接下來xingxingmvc調用 response.sendRedirect(uri),瀏覽器的url地址改變,從新向服務器發請求,Target.jsp頁面的後臺form類 Target.java被調用,onLoad事件被觸發,最後,服務器返回Target.jsp,結果以下圖: