- 请求转发:浏览器只发送一次请求,URL不变。
- 实现原理:由ServletContext在后端实现,会去调用/error对应的servlet的doGet/doPost方法。(通过方法调用实现)
this.getServletContext().getRequestDispatcher("/error").forward(req,resp);
// 常用的是request
req.getRequestDispatcher("/error").forward(req, resp);
- 重定向:浏览器发送两次请求,URL改变。
- index.jsp:提交之后,访问/login(Web.xml中映射为RedirectServlet)
- RedirectServlet:处理来自form表单的请求。(第二个代码段就是重定向的原理)
-
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username + ":" +password);
resp.sendRedirect("/response/success.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
-
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username + ":" +password);
// resp.sendRedirect("/response/success.jsp");
resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
resp.setHeader("Location", "/response/success.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
- 实现原理:由Tomcat解析HttpServletResponse设置的Status Code和Location。浏览器发现状态码是302时,就知道是重定向,然后重新向Location给定的URL发送请求(相当于JS的window.location)
![](https://img-blog.csdnimg.cn/16415e765616454893ca1e83e2935e71.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6bK46bG8LUQ=,size_20,color_FFFFFF,t_70,g_se,x_16)