您当前的位置: 首页 >  servlet

white camel

暂无认证

  • 2浏览

    0关注

    442博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Servlet——Web之间跳转和信息共享、三大作用域对象

white camel 发布时间:2020-01-27 19:33:36 ,浏览量:2

目录
  • 为什么需要Servlet之间的交互?
  • Web之间跳转和信息共享
    • 请求转发
    • URL重定向
  • Servlet三大作用域对象
为什么需要Servlet之间的交互?

跳转到目录 Web组件(Servlet/JSP)的交互:

  • Web组件之间的跳转,数据共享. 在这里插入图片描述
Web之间的跳转和信息共享

跳转到目录

Web组件之间的跳转方式
  • 请求转发(forward)
  • URL重定向(redirect)
  • 请求包含(include)
请求转发

跳转到目录 从Servlet1,请求转发到Servlet2. Servlet1完成一部分功能,再跳转到Servlet2继续完成剩下的功能.

  • 语法: request.getRequestDispatcher(String path).forward(request,response) 参数: path,表示跳转的目标的路径(资源的名称) 注意: 不要忘了forward

  • 特点:

  1. 浏览器的地址栏不发生改变.
  2. 请求转发只发送一个请求
  3. 共享同一个请求中的数据
  4. 最终响应给浏览器的由Servlet2来决定
  5. 请求转发不能跨域访问,只能跳转到当前应用中的资源
  6. 请求转发可以访问WEB-INF目录中的资源 在这里插入图片描述
URL重定向

跳转到目录

  • 语法: response.sendRedirect(String url); 参数: url,表示目标资源地址
  • 特点:
  1. 浏览器地址栏发生改变.
  2. URL重定向发了两次请求.
  3. 因为URL重定向是两次独立的请求,所以不共享请求中的数据
  4. 最终响应给浏览器的由Servlet2来决定(把目标地址拷贝到浏览器地址栏,回车即可)
  5. URL重定向能跨域访问,可以访问其他应用中的资源.
  6. URL重定向不能访问WEB-INF目录中的资源. 在这里插入图片描述
Servlet三大作用域对象

跳转到目录 目的: 共享数据

  • request 类型: HttpServletReuqest 每一次请求都是一个新的request对象,如果在Web组件之间需要共享同一个请求中的数据,只能使用请求转发
  • session 类型: HttpSession 每一次会话都是一个新的session对象,如果需要在一次会话中的多个请求之间需要共享数据,只能使用session.
  • application 类型: ServletContext 应用对象,Tomcat启动到Tomcat关闭,表示一个应用,在一个应用中有且只有一个application对象,作用于整个Web应用,可以实现多次会话之间的数据共享

作用域对象如何共享数据:

  1. 设置作用域中的共享数据. 作用域对象.setAttribute(String name, Object value);
  2. 获取作用域中的共享数据 Objcet value = 作用域对象.getAttribute(String name);
  3. 删除作用域中的指定的共享数据. 作用域对象.removeAttribute(String name);

注意: 在哪个作用域中设置共享数据,就只能从该作用域中取出数据. 在这里插入图片描述

  • Demo ScopeServlet.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);
        }
    }
    
    ResultServlet.java
    @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"));
        }
    }
    
关注
打赏
1661428283
查看更多评论
立即登录/注册

微信扫码登录

0.0389s