域对象: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。
sendRedirect()是请求重定向,会向服务器发送两次请求。
forward()是请求转发。
只有Servlet02的数据可以相应给客户端。
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"); rd.include(req, resp); } }
|
转发地址栏不会改变,重定向地址栏会改变。