目录
- 为什么需要Servlet之间的交互?
- Web之间跳转和信息共享
- 请求转发
- URL重定向
- Servlet三大作用域对象
跳转到目录 Web组件(Servlet/JSP)的交互:
- Web组件之间的跳转,数据共享.
跳转到目录
Web组件之间的跳转方式- 请求转发(forward)
- URL重定向(redirect)
- 请求包含(include)
跳转到目录 从Servlet1,请求转发到Servlet2. Servlet1完成一部分功能,再跳转到Servlet2继续完成剩下的功能.
-
语法: request.getRequestDispatcher(String path).forward(request,response) 参数: path,表示跳转的目标的路径(资源的名称)
注意:
不要忘了forward -
特点:
- 浏览器的地址栏不发生改变.
- 请求转发只发送一个请求
- 共享同一个请求中的数据
- 最终响应给浏览器的由Servlet2来决定
- 请求转发不能跨域访问,只能跳转到当前应用中的资源
- 请求转发可以访问WEB-INF目录中的资源
跳转到目录
- 语法: response.sendRedirect(String url); 参数: url,表示目标资源地址
- 特点:
- 浏览器地址栏发生改变.
- URL重定向发了两次请求.
- 因为URL重定向是两次独立的请求,所以不共享请求中的数据
- 最终响应给浏览器的由Servlet2来决定(把目标地址拷贝到浏览器地址栏,回车即可)
- URL重定向能跨域访问,可以访问其他应用中的资源.
- URL重定向不能访问WEB-INF目录中的资源.
跳转到目录 目的: 共享数据
- request 类型: HttpServletReuqest 每一次请求都是一个新的request对象,如果在Web组件之间需要共享同一个请求中的数据,只能使用请求转发
- session 类型: HttpSession 每一次会话都是一个新的session对象,如果需要在一次会话中的多个请求之间需要共享数据,只能使用session.
- application 类型: ServletContext 应用对象,Tomcat启动到Tomcat关闭,表示一个应用,在一个应用中有且只有一个application对象,作用于整个Web应用,可以实现多次会话之间的数据共享
作用域对象如何共享数据:
- 设置作用域中的共享数据.
作用域对象.setAttribute(String name, Object value);
- 获取作用域中的共享数据
Objcet value = 作用域对象.getAttribute(String name);
- 删除作用域中的指定的共享数据.
作用域对象.removeAttribute(String name);
注意: 在哪个作用域中设置共享数据,就只能从该作用域中取出数据.
- Demo ScopeServlet.java
ResultServlet.java@WebServlet("/scope") public class ScopeServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // request: Integer numInRequest = (Integer) req.getAttribute("NUM_IN_REQUEST"); if (numInRequest == null){ req.setAttribute("NUM_IN_REQUEST", 1); } else { req.setAttribute("NUM_IN_REQUEST", numInRequest + 1); } // session: Integer numInSession = (Integer) req.getSession().getAttribute("NUM_IN_SESSION"); if (numInSession == null){ req.getSession().setAttribute("NUM_IN_SESSION", 1); } else { req.getSession().setAttribute("NUM_IN_SESSION", numInSession + 1); } // application: Integer numInApp = (Integer) req.getServletContext().getAttribute("NUM_IN_APP"); if (numInApp == null){ req.getServletContext().setAttribute("NUM_IN_APP", 1); } else { req.getServletContext().setAttribute("NUM_IN_APP", numInApp + 1); } // 请求转发 req.getRequestDispatcher("/result").forward(req, resp); } }
@WebServlet("/result") public class ResultServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); PrintWriter out = resp.getWriter(); out.println("session=" + req.getSession().getAttribute("NUM_IN_SESSION")); out.println("request=" +req.getAttribute("NUM_IN_REQUEST")); out.println("application=" +req.getServletContext().getAttribute("NUM_IN_APP")); } }