今天讲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,结果如下图: