XingXingMVC頁面跳轉處理

 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,結果以下圖:

相關文章
相關標籤/搜索