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