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,结果以下图:

相关文章
相关标签/搜索