0%

转发与重定向的区别

域对象:session,requset,page…

域就是区间、范围。

转发的目的地是在同一项目下。之前在requset中存放的变量不会失效。

重定向可以在不同项目下。在request中存放的变量会失效。

往Servlet01请求域中存一个数据,并转发给Servlet02:

1
2
3
4
5
6
7
8
@WebServlet("/Servlet01")
public class Servlet01 extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
request.setAttribute("name","Jack");
request.getRequsetDispatcher("/Servlet02");
}
}

在Servlet02中把刚刚存在Servlet01的数据显示一下试试:

1
2
3
4
5
6
7
8
@WebServlet("/Servlet02")
public class OtherServlet extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = (String) req.getAttribute("name");
resp.getWriter.write(name);
}
}

结果会在页面中显示Jack,这就是在转发时request中的存放变量不会失效。转发前后其实是同一个请求。

如果在Servlet01中使用的是重定向:

1
2
3
4
5
6
7
8
@WebServlet("/Servlet01")
public class Servlet01 extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("name","Jack");
resp.sendRedirect(req.getContextPath() + "/Servlet02");
}
}

则会报空指针异常。因为Write方法不能写空,说明name变量失效了。

转发是requset的方法,重定向是response的方法。在request中定义的变量用response重定向当然会失效。

一个面试题:include(),forward(),sendRedirect()的区别

假设Servlet01转发给Servlet02。

  1. sendRedirect()是请求重定向,会向服务器发送两次请求。

  2. forward()是请求转发。

    只有Servlet02的数据可以相应给客户端。

  3. include()也是请求转发。

    Servlet01和Servlet02的数据都活相应给客户端。

1
2
3
4
5
6
7
8
9
10
11
12
@WebServlet("/Servlet01")
public class Servlet01 extends HttpServlet{
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取一个请求转发对象
RequsetDispatcher rd = request.getRequsetDispatcher("/Servlet02");

//分别用forward和include执行转发
//rd.forward(req, resp);
rd.include(req, resp);
}
}

转发地址栏不会改变,重定向地址栏会改变。