servlet中的请求转发和重定向都是对资源的请求,以前对这两者的区分比较模糊,于是查阅了一些资料,再结合一两个实例,终于在脑海里有了比较明确的区分。
请求转发:
request.getRequsetDispatcher().forward(requset,response),是一种服务器行为,转发时request对象会被保存,也就是说被转发到的另外一个servlet或其他资源中的request对象,跟请求转发的request是通一个对象。又由于这个过程是服务端行为,所以客户端的地址栏不会发生改变。
重定向
response.sendRedirect(url),是一种客户端行为,实际上期间发生的是两次请求,前一次的请求request对象不会作保存,且地址栏地址会发生改变。
现在来看看一个例子:
假设TestServlet是要请求的资源
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Test servlet is showing!");
System.out.println("my name is : "+ request.getAttribute("name"));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
请求转发servlet:TestForwardServlet
@WebServlet("/TestForwardServlet")
public class TestForwardServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public TestForwardServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("forward servlet is showing!");
request.setAttribute("name", "licha");
System.out.println("my name is : "+request.getAttribute("name"));
request.getRequestDispatcher("/TestServlet").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
重定向servlet:TestRedirectServlet
@WebServlet("/TestRedirectServlet")
public class TestRedirectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("redirect servlet is showing!");
request.setAttribute("name", "John");
System.out.println("my name is : "+request.getAttribute("name"));
response.sendRedirect("TestServlet");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
启动tomcat服务器,先试一下请求转发,在地址栏输入http://localhost:8080/TestSpringmvc/TestForwardServlet ,控制台的输出为:
再试一下重定向的例子,在地址栏输入:http://localhost:8080/TestSpringmvc/TestRedirectServlet ,控制台输入为:
可见,两者主要体现有两点不同:
1、转发的地址栏url还是原来的http://localhost:8080/TestSpringmvc/TestForwardServlet ,而重定向的地址栏url变成http://localhost:8080/TestSpringmvc/TestServlet 。
2、TestForwardServlet 中request对象中的属性name跟TestServlet中的一样,说明TestForwardServlet 中的request对象被保存并传到TestServlet。对比之下TestRedirectServlet 中request对象中的属性name并没有传到TestServlet中,因为TestServlet的request对象name属性为null。