一.请求转发
(1)请求转发的特点:
- 一次请求,地址栏不发生改变;
- 请求参数可以被共享;
- 不可以访问服务器外部的资源;
-
请求转发之后的代码可以被继续执行,所以要加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)重定向的特点:
- 重定向使用response:resp.sendRedirect(“http://www.baidu.com“);
整个过程是两次请求,地址栏会发生改变:(注:下面都以代码中的为例子。例如:redirect.sxt)
第一次请求访问的是:servlet;
状态码:302
location http://www.baidu.com第二次请求 http://www.baidu.com
- 重定向可以直接访问服务器外部资源也可以访问服务器内部资源
- 在使用重定向的时候请求参数不可以共享,如果要使用第一次请求的参数,只能手动的去拼接
- 重定向之后的代码可以被继续执行,所以重定向之后一定要return:Cannot call sendRedirect() after the response has been commited
-
避免循环重定向,一般要出现这种问题都是因为业务逻辑混乱导致的。
示例代码:
@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;
}
}