先来看一个简单的实例,客户端首先在一个页面输入数据,点击提交后,数据在另一个页面显示。
getDate.jsp
<body>
<form action="<%=request.getContextPath() %>/test" method="post">
用户名:<input type="text" name="userName"><br>
密 码:<input type="password" name="passWord"><br>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
showDate.jsp
您提交的信息为:<br>
用户名:<%=request.getParameter("userName")%><br>
密码:<%=request.getParameter("passWord") %><br>
LoginServlet.java
package cn.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//重定向代码
//请求转发代码
}
}
web.xml配置
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>cn.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
1.如果是重定向代码
地址栏输入http://localhost:8080/Project/02/getDate.jsp
resp.sendRedirect(req.getContextPath()+"/02/showDate.jsp");
输入数据点击提交页面跳转
可见前面提交的数据并没有传递过来,
并且地址栏变为http://localhost:8080/Project/02/showDate.jsp
其实这里有个中间过程:http://localhost:8080/Project/test
2.如果是请求转发代码
String zf = "/02/showDate.jsp";
RequestDispatcher rd = req.getRequestDispatcher(zf);
rd.forward(req, resp);
输入数据点击提交后
可见,参数传递正常并且地址栏变为http://localhost:8080/Project/test
并没有变为http://localhost:8080/Project/02/showDate.jsp
从上面的例子中可以看出重定向涉及两次请求响应,而请求转发只涉及一次请求响应。可以这样理解:A向B要一个东西,B说东西我有但是我没时间,但我可以帮你找到C,你自己去问问C吧,所以A又自己跑去C那儿问C要,但是C有没有这个东西和B没关系,比如上面的例子中几个参数值都为null,这是重定向。另一种情况是A向B要一个东西,B说没时间,我把东西先给给C然后让C给你吧,C的东西是从B那拿到的,就如上面例子中得到的参数值,这就是所谓的请求转发。所以重定向又被称为客户端跳转,而请求转发又被称为服务端跳转。
重定向的发起者和调用者使用各自的request实例和response实例,它们各自属于独立的“请求/响应”过程请求转发的发起者和调用者共享相同的request实例和response实例,它们属于同一个“请求/响应”过程。
重定向与请求转发的其他区别:
1.请求转发只能请求转发给同一个web应用中的其他组件;而重定向还可以重定到其他站点的资源上。
2.重定向访问过程结束后浏览器地址栏的URL会发生改变;请求转发过程结束后地址栏URL地址不变。
关于两者区别也可以参考这个链接内容:
http://blog.youkuaiyun.com/getstudymessages/article/details/6230325