XingXingMVC页面跳转处理

点击这里下载XingXingMVC编译好的包

XingXingMVC的源代码和例子代码

今天讲forward和redirect的处理.

在前面的介绍中,用户提交页面之后,触发后台form类的事件,由于事件的返回值我都设为void,因此xingxingmvc将原页面返回.如果要返回不同的页面,则可以使用forward方式或redirect方式。这两种方式下都要求form类的事件要有返回值,返回值为字符串。举例:

forward方式:

public String btnOK(Map mapRequest,Map mapSession)
{
       //do something.
      return "forward:../Target.jsp";
}

这里,返回值是一个字符串,格式为:"forward:" + 返回页面的url地址。

相类似,redirect的返回值也是一个字符串,格式为:"redirect:" +返回页面的url地址。

下面开始练习。我仍使用FirstDemo工程作例子,一样的,web.xml的配置跟前两天一样,没有变化。

开始创建页面,第一个页面是forward测试页面,名称为forwardtest.jsp,完整路径:go/forwardtest.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,代码如下:

<%@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);
                    strValue = 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,结果如下图:

猜你喜欢

转载自hicen.iteye.com/blog/1284313