一、原理. 1、 Forward
该图的交互过程如下:① 浏览器访问Servlet1。② Servlet1想让Servlet2对客户端的请求进行响应,于是调用forward()方法,将请求转发给Servlet2进行处理。③ Servlet2对请求做出响应。交互过程可以看出,调用forward()方法,对浏览器来说是透明的,浏览器并不知道为其服务的Servlet已经换成Servlet2了,它只知道发出了一个请求,获得了一个响应。显示的URL始终是原始请求的URL。sendRedirect()方法和forward()方法还有一个区别,那就是sendRedirect()方法不但可以在位于同一主机上的不同Web应用程序之间进行重定向,而且可以将客户端重定向到其他服务器上的Web应用程序资源。
这种方式是在服务器端作的重定向。服务器往client发送数据的过程是这样的:服务器在向客户端发送数据之前,是先将数据输出到缓冲区,然后将缓冲区中数据发送给client端。什么时候将缓冲区里的数据发送给client端呢?
(1)当对来自client的request处理完,并把所有数据输出到缓冲区 (2)当缓冲区满 (3)在程序中调用缓冲区的输出方法out.flush()或response.flushbuffer(),web container才将缓冲区中的数据发送给client。
这种重定向方式是利用服务器端的缓冲区机制,在把缓冲区的数据发送到客户端之前,原来的数据不发送,将执行转向重定向页面,发送重定向页面的数据,重定向调用页的数据将被清除。如果在<JSP:FORWORD>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么这种重定向方式将不起作用,这一点应该特别注意。
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { response.setContentType(“text/html; charset=UTF-8”); ServletContext sc = getServletContext(); RequestDispatcher rd = null; rd = sc.getRequestDispatcher(“/index.jsp”); rd.forward(request, response); }
2、 sendRedirect
交互过程可以看出,调用sendRedirect()方法,实际上是告诉浏览器Servlet2所在的位置,让浏览器重新访问Servlet2。调用sendRedirect()方法,会在响应中设置Location响应报头。要注意的是,这个过程对于用户来说是透明的,浏览器会自动完成新的访问。浏览器的地址栏中,可以看到,显示的URL是重定向之后的URL。该图的交互过程如下:① 浏览器访问Servlet1。② Servlet1想让Servlet2为客户端服务。③ Servlet1调用sendRedirect()方法,将客户端的请求重定向到Servlet2。④ 浏览器访问Servlet2。⑤ Servlet2对客户端的请求做出响应。
这种方式是在客户端作的重定向处理。该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的URL。
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { response.setContentType(“text/html; charset=UTF-8”); response.sendRedirect(“/index.jsp”); } 二、区别 1.response.sendRedirect(url)1)重定向,不转发请求,地址栏的url已改变2)request.getAttribute(“”),request.getParamter(“”)都获取不了 response.sendRedirect(“/studyProject/myforward/end2.jsp?name=tomzhang”);//可以带参数的 例子 end2.jspHtml代码
- <span style=”font-size: medium;”><%@ page language=”java” import=”java.util.*” pageEncoding=”GBK”%>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+”://”+request.getServerName()+”:”+request.getServerPort()+path+”/”;
- %>
- <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
- <html>
- <head>
- <base href=”<%=basePath%>”>
- <title>My JSP ‘end.jsp’ starting page</title>
- <meta http-equiv=”pragma” content=”no-cache”>
- <meta http-equiv=”cache-control” content=”no-cache”>
- <meta http-equiv=”expires” content=”0″>
- <meta http-equiv=”keywords” content=”keyword1,keyword2,keyword3″>
- <meta http-equiv=”description” content=”This is my page”>
- <!–
- <link rel=”stylesheet” type=”text/css” href=”styles.css”>
- –>
- </head>
- <body>
- name:${param.name}, sex:${requestScope.sex}, the end page!
- </body>
- </html>
- </span>
- <span style=”font-size: medium;”> <%@ page language=”java” import=”java.util.*” pageEncoding=”GBK”%>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+”://”+request.getServerName()+”:”+request.getServerPort()+path+”/”;
- %>
- <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
- <html>
- <head>
- <base href=”<%=basePath%>”>
- <title>My JSP ‘first.jsp’ starting page</title>
- <meta http-equiv=”pragma” content=”no-cache”>
- <meta http-equiv=”cache-control” content=”no-cache”>
- <meta http-equiv=”expires” content=”0″>
- <meta http-equiv=”keywords” content=”keyword1,keyword2,keyword3″>
- <meta http-equiv=”description” content=”This is my page”>
- <!–
- <link rel=”stylesheet” type=”text/css” href=”styles.css”>
- –>
- </head>
- <body>
- This is my JSP page. <br>
- <%
- request.setAttribute(“sex”, “man”);
- <span style=”color: #0000ff;”> response.sendRedirect(“/studyProject/myforward/end2.jsp”);//绝对路径</span>
- %>
- </body>
- </html>
- </span>
结果:name:, sex:, the end page! url变成http://localhost:8080/studyProject/myforward/end2.jsp
2.<jsp:forward page=”” />1)请求转发,地址栏的url不变2)可以传递额外的参数<jsp:param name=”” value=””/>3)request.getAttribute(“”);//基于请求的request共享request.getParamter(“”);//请求转发4)等同requestDispatcher.forward(url); <jsp:forward page=”/myforward/end.jsp?age=man”>//可以带参数*使用forward一定要注意url页面的链接,不要使用相对路径;url页面的当前路径其实是第1次请求时的当前路径,所以url页面的链接都应该采用绝对路径!例子:first.jspHtml代码
- <span style=”font-size: medium;”><%@ page language=”java” import=”java.util.*” pageEncoding=”GBK”%>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+”://”+request.getServerName()+”:”+request.getServerPort()+path+”/”;
- %>
- <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
- <html>
- <head>
- <base href=”<%=basePath%>”>
- <title>My JSP ‘first.jsp’ starting page</title>
- <meta http-equiv=”pragma” content=”no-cache”>
- <meta http-equiv=”cache-control” content=”no-cache”>
- <meta http-equiv=”expires” content=”0″>
- <meta http-equiv=”keywords” content=”keyword1,keyword2,keyword3″>
- <meta http-equiv=”description” content=”This is my page”>
- <!–
- <link rel=”stylesheet” type=”text/css” href=”styles.css”>
- –>
- </head>
- <body>
- This is my JSP page. <br>
- <%
- request.setAttribute(“sex”, “man”);
- %>
- <span style=”color: #0000ff;”> <jsp:forward page=”/myforward/end.jsp”></span>
- <jsp:param value=”tomzhang” name=”name”/>
- </jsp:forward>
- </body>
- </html>
- </span>
- <span style=”font-size: medium;”><%@ page language=”java” import=”java.util.*” pageEncoding=”GBK”%>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+”://”+request.getServerName()+”:”+request.getServerPort()+path+”/”;
- %>
- <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
- <html>
- <head>
- <base href=”<%=basePath%>”>
- <title>My JSP ‘end.jsp’ starting page</title>
- <meta http-equiv=”pragma” content=”no-cache”>
- <meta http-equiv=”cache-control” content=”no-cache”>
- <meta http-equiv=”expires” content=”0″>
- <meta http-equiv=”keywords” content=”keyword1,keyword2,keyword3″>
- <meta http-equiv=”description” content=”This is my page”>
- <!–
- <link rel=”stylesheet” type=”text/css” href=”styles.css”>
- –>
- </head>
- <body>
- name:${param.name}, sex:${requestScope.sex}, the end page!
- </body>
- </html>
- </span>
结果:name:tomzhang, sex:man, the end page! url一直保持不变 http://localhost:8080/studyProject/myforward/first.jsp
注:本来转载自51CTO.COM