请求转发
- 请求转发是通过HttpServletRequest对象实现的
- 请求转发是服务器内部行为,对客户端是屏蔽的
- 客户端只产生了一次请求,服务端只产生了一对request和response对象
- 客户端的地址栏是不变的
- 请求的参数是可以继续传递的
- 目标资源可以是Servlet、静态资源,也可以是WEB-INF下的受保护的资源;不可以是外部资源
@WebServlet("/servlet1")
public class ServletTest1 extends HttpServlet {
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
RequestDispatcher requestDispatcher = req.getRequestDispatcher("servlet2");
requestDispatcher.forward(req, resp);
}
}
@WebServlet("/servlet2")
public class ServletTest2 extends HttpServletRequest {
public void service(HttpServletRequest req, HttpServletResponse resp) {
System.out.println("servlet2执行了");
}
}
响应重定向(推荐)
- 响应重定向是通过HttpServletReaponse对象实现的
- 响应重定向是在服务端通过302响应码和location路径,告诉客户端自己重定向到目标资源,是在服务端提示下的,客户端的行为
- 客户端的地址栏是变化的,客户端至少发送了两次请求
- 请求产生了多次,后端就会有多个request和response对象,所以请求中的参数不能自动传递
- 目标资源可以是Servlet、静态资源、外部资源;不可以是WEB-INF下的受保护资源
@WebServlet("/servlet1")
public class ServletTest1 extends HttpServlet {
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("bbb");
resp.sendRedirect("aaa.html");
resp.sendRedirect("https://www.baidu.com");
}
}
@WebServlet("/servlet2")
public class ServletTest2 extends HttpServlet {
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet2执行了");
}
}