Servlet:重定向和请求转发

时间:2022-12-22 13:27:29

一.请求转发
(1)请求转发的特点:

  1. 一次请求,地址栏不发生改变;
  2. 请求参数可以被共享;
  3. 不可以访问服务器外部的资源;
  4. 请求转发之后的代码可以被继续执行,所以要加return;

    示例代码:

@WebServlet("/dis1.sxt")
public class Dispatcher1Servlet extends HttpServlet {

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

System.out.println("Dispatcher1Servlet.service(Hello moto01)");
System.out.println("Dispatcher1Servlet.service()" + req.getParameter("uname"));
//作用域
req.setAttribute("bjsxt", "123456789");
//以最后设置的值
req.setAttribute("bjsxt", "987654321");
//请求转发
req.getRequestDispatcher("dis2.sxt").forward(req, resp);
//请求转发不能外部资源!
//req.getRequestDispatcher("www.baidu.com").forward(req, resp);
return;

//req.getRequestDispatcher("dis2.sxt").forward(req,resp);
//req.getRequestDispatcher("http://www.baidu.com").forward(req, resp);
//System.out.println("Dispatcher1Servlet.service(Hello moto2)");


}

}

二.重定向
(1)重定向的特点:

  1. 重定向使用response:resp.sendRedirect(“http://www.baidu.com“);
  2. 整个过程是两次请求,地址栏会发生改变:(注:下面都以代码中的为例子。例如:redirect.sxt)
    第一次请求访问的是:servlet;
    状态码:302
    location http://www.baidu.com

  3. 第二次请求 http://www.baidu.com

  4. 重定向可以直接访问服务器外部资源也可以访问服务器内部资源
  5. 在使用重定向的时候请求参数不可以共享,如果要使用第一次请求的参数,只能手动的去拼接
  6. 重定向之后的代码可以被继续执行,所以重定向之后一定要return:Cannot call sendRedirect() after the response has been commited
  7. 避免循环重定向,一般要出现这种问题都是因为业务逻辑混乱导致的。

    示例代码:

@WebServlet("/rect.sxt")
public class RectServlet extends HttpServlet {

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("RedirectServlet.service(爱过吗?)");
System.out.println("RedirectServlet.service(爱过吗?)");
//重定向可以是外部资源,也可以是内部资源
//重定向外部资源
//resp.sendRedirect("http://www.baidu.com");
resp.sendRedirect("redi.sxt");
return ;
//System.out.println("RectServlet.service(爱过)");

}

}


@WebServlet("/redi.sxt")
public class RediServlet extends HttpServlet {

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("RediServlet.service(来过吗?)");
//重定向内部资源时:没有获取传递过来的值
System.out.println("RediServlet.service()" + req.getParameter("uname"));
//不可以循环重定向
//resp.sendRedirect("rect.sxt");
return;
}

}