多个servlet之间的跳转有两种方式:
-
请求转发:request.getRequestDispatcher(“转发路径”).forward(request, response);
-
响应重定向:response.sendRedirect("转发路径 ");
请求转发:
@WebServlet("/direct/login") // @WebServlet注解相当于web.xml文件
public class CheckLoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if(1 == 1){
// 请求转发
request.getRequestDispatcher("/direct/index").forward(request,response);
}
}
}
@WebServlet("/direct/index") // @WebServlet注解相当于web.xml文件
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("<h1>This is index page</h1>");
}
}
请求转发原理:
-
请求转发是服务器跳转,浏览器只产生一次请求
-
请求转发语句:request.getRequestDispatcher().forward()
请求转发执行流程:浏览器发送一个请求到tomcat服务器,tomcat中CheckLoginServlet
对请求进行处理,当CheckLoginServlet中调用了request.getRequestDispatcher().forward()
方法后,就会将该请求(HttpServletRequest对象)原封不动的发送给IndexServlet
,当indexServlet处理完该请求后产生的响应,将响应的结果返回给浏览器。这里我们可以看到浏览器地址栏的URL地址没有发生变化,证明浏览器只产生了一次请求。
响应重定向转发:
@WebServlet("/direct/login") // @WebServlet注解相当于web.xml文件
public class CheckLoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if(1 == 1){
// 响应重定向
response.sendRedirect("/direct/index");
}
}
}
@WebServlet("/direct/index") // @WebServlet注解相当于web.xml文件
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("<h1>This is index page</h1>");
}
}
响应重定向原理:
-
响应重定向是浏览器端跳转,会产生两次请求
-
响应重定向语句:response.sendRedirect()
响应重定向执行流程:浏览器发送一个请求到tomcat服务器,tomcat中CheckLoginServlet
对请求进行处理,当CheckLoginServlet中调用了response.sendRedirect()
方法后,会马上返回一个响应给浏览器。然后浏览器会重写发送一个请求给IndexServlet
,(注意这个请求和浏览器发送的第一个请求没有任何关联),当indexServlet处理完该请求后产生的响应,将响应的结果返回给浏览器。这里我们可以看到浏览器地址栏的URL地址发生了变化,证明浏览器产生了两次请求。