请求转发和响应重定向
概述
什么是请求转发和响应重定向
-
请求转发和响应重定向是web应用中间接访问项目资源的两种手段,也是Servlet控制页面跳转的两种手段
-
请求转发通过HttpServletRequest实现,响应重定向通过HttpServletResponse实现
-
请求转发生活举例: 张三找李四借钱,李四没有,李四找王五,让王五借给张三
-
响应重定向生活举例:张三找李四借钱,李四没有,李四让张三去找王五,张三自己再去找王五借钱
请求转发
请求转发特点(背诵)
-
请求转发通过HttpServletRequest对象获取请求转发器实现
-
请求转发是服务器内部的行为,对客户端是屏蔽的
-
客户端只发送了一次请求,客户端地址栏不变
-
服务端只产生了一对请求和响应对象,这一对请求和响应对象会继续传递给下一个资源
-
因为全程只有一个HttpServletRequset对象,所以请求参数可以传递,请求域中的数据也可以传递
-
请求转发可以转发给其他Servlet动态资源,也可以转发给一些静态资源以实现页面跳转
-
请求转发可以转发给WEB-INF下受保护的资源
-
请求转发不能转发到本项目以外的外部资源
请求转发测试代码
ServletA
@WebServlet("/servletA")
public class ServletA extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求转发器// 转发给servlet okRequestDispatcher requestDispatcher = req.getRequestDispatcher("servletB");// 转发给一个视图资源 ok//RequestDispatcher requestDispatcher = req.getRequestDispatcher("welcome.html");// 转发给WEB-INF下的资源 ok//RequestDispatcher requestDispatcher = req.getRequestDispatcher("WEB-INF/views/view1.html");// 转发给外部资源 no//RequestDispatcher requestDispatcher = req.getRequestDispatcher("http://www.atguigu.com");// 获取请求参数String username = req.getParameter("username");System.out.println(username);// 向请求域中添加数据req.setAttribute("reqKey","requestMessage");// 做出转发动作requestDispatcher.forward(req,resp);}
}
ServletB
@WebServlet("/servletB")
public class ServletB extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求参数String username = req.getParameter("username");System.out.println(username);// 获取请求域中的数据String reqMessage = (String)req.getAttribute("reqKey");System.out.println(reqMessage);// 做出响应resp.getWriter().write("servletB response"); }
}
响应重定向
响应重定向运行逻辑图
响应重定向特点(背诵)
-
响应重定向通过HttpServletResponse对象的sendRedirect方法实现
-
响应重定向是服务端通过302响应码和路径,告诉客户端自己去找其他资源,是在服务端提示下的,客户端的行为
-
客户端至少发送了两次请求,客户端地址栏是要变化的
-
服务端产生了多对请求和响应对象,且请求和响应对象不会传递给下一个资源
-
因为全程产生了多个HttpServletRequset对象,所以请求参数不可以传递,请求域中的数据也不可以传递
-
重定向可以是其他Servlet动态资源,也可以是一些静态资源以实现页面跳转
-
重定向不可以到给WEB-INF下受保护的资源
-
重定向可以到本项目以外的外部资源
响应重定向测试代码
ServletA
@WebServlet("/servletA")
public class ServletA extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求参数String username = req.getParameter("username");System.out.println(username);// 向请求域中添加数据req.setAttribute("reqKey","requestMessage");// 响应重定向// 重定向到servlet动态资源 OKresp.sendRedirect("servletB");// 重定向到视图静态资源 OK//resp.sendRedirect("welcome.html");// 重定向到WEB-INF下的资源 NO//resp.sendRedirect("WEB-INF/views/view1");// 重定向到外部资源//resp.sendRedirect("http://www.atguigu.com");}
}
ServletB
@WebServlet("/servletB")
public class ServletB extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求参数String username = req.getParameter("username");System.out.println(username);// 获取请求域中的数据String reqMessage = (String)req.getAttribute("reqKey");System.out.println(reqMessage);// 做出响应resp.getWriter().write("servletB response");}
}
打开浏览器,输入以下url测试
http://localhost:8080/web03_war_exploded/servletA?username=atguigu
PS:来源尚硅谷