• servlet内置对象(传递数据)


    一个servlet向另一个servlet发送数据,可以将数据放置在一个容器中(io、数据库、servlet的内置对象),servlet的内置对象成本最小。

    一共有三个内置对象。

    名字 类型
    request HttpServletRequest
    session HttpSession
    application ServletContext

    1.Request对象

      1.1获取方式:

        在doGet(HttpServletRequest req,HttpServletResponse resp)或者doPost(HttpServletRequest req,HttpServletResponse resp)方法参数中,可以直接使用该对象。

      1.2存取数据方式:

        存放数据:req.setAttribute("key",value); key都是String类型 value值为任意类型,相同key值得数据会被覆盖。一定要先存数据再转发。

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //生命周期为一次请求
            request.setAttribute("name", "梁伟");
            request.setAttribute("name", "摩西");
            request.setAttribute("age", 15);
            request.getRequestDispatcher("/r2").forward(request, response);
        }

        取数据:req.getAttribute("key");

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object msg = request.getAttribute("name");
        Object age = request.getAttribute("age");
        System.out.println(msg);
        System.out.println(age);
        }

        删除数据:req.removeAttribute("key");

      1.2生命周期:

        客户端每次发请求,服务器端就会创建一个新的request对象,本次访问结束后,该request对象就会被销毁,因此生命周期为一次请求。

      1.3作用范围:使用request存取数据只能在一次请求内起作用。比如服务器内部跳转的时候(因为服务器内部跳转客户端只发一次请求)。 浏览器中的url不变代表一次请求。

        客户端重定向是不行的,因为客户端重定向会发出多个请求(多个request对象),一个请求结束,下一个请求是获取不到上一个请求的数据的。

    2.session(是存在服务器 端的一个对象) 默认30分钟自动销毁,一般把登录的信息放在session中,保护了信息安全。

      2.1获取方式:

        HttpSession session = request.getSession();

        HttpSession session = request.getSession(false);

        HttpSession session = request.getSession(true);

        无参或者参数为true代表request有对应的session,那么就返回这个session,没有就创建一个。

        如果参数为false,代表request有对应的session则返回这个session,没有就返回null。

        存储数据的方式和request对象的方式一样,都是调用setAttribute(参数1,参数2)、getAttribute(参数1)方法。

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
            HttpSession session = request.getSession();
            session.setAttribute("name", "tom");
            session.setAttribute("name2", "jery");
            session.setAttribute("nam3", new Person());
            
            // 销毁session对象
            //session.invalidate();
            //session.setMaxInactiveInterval(5);
            response.sendRedirect(request.getContextPath() + "/session2");
        }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
            
            HttpSession session = request.getSession(false);
            System.out.println(session.getAttribute("name"));
        }

           chrome浏览器向服务器发送数据,发送时会携带JSESSIONID(请求头中),发送完成时,服务器会调用getSession方法根据ISEESIONID查找对应的session对象(有则直接使用,没有就创建),此时并没有session对象,所以会创建session对象,HttpSession session = req.getSession();创建完后往session里存了数据,接下来发生了重定向,tomcat会把请求返回给浏览器,并携带session对应的JSESSIONID,浏览器会存储该id,当下一次访问时会携带这个id,通过id查找对应的session对象,发现可以找到session对象(所以不需要再去创建)此时这个session对象就是session2,这两个session是同一个session对象,当使用火狐直接访问sessionn2时并不能拿到数据,是因为火狐浏览器也有自己唯一的JSESSIONID,当他访问session2时,这个id并不能找到对应的session对象,所有便会重新创建一个session对象,session3,此时session3中并没有任何数据,所以访问不到数据。

      2.2生命周期:

        session创建:第一次调用该方法 request.getSession()创建session对象。

        session销毁:

          session.invalidate();

          session如果自动超时的话,也会被销毁,默认时间是30分钟

          超时时间可以在代码或者web.xml中设置

    // session超时时间是指:客户端不与服务器进行交互的时间
    //在代码中设置:
    session.setMaxInactiveInterval(5);  //单位是秒
    // 在web.xml中设置 1分钟超时,负数或者0为不限制时间
    <session-config><session-timeout>1</session-timeout></session-config>

      2.3作用范围:

        在一个会话中起作用,一个会话可以包括多个request请求,所以可以放在session中被多个request请求所共享。

        tomcat服务器正常关闭时,tomcat会把session对象序列化到本地文件中,如果非正常关闭,将不会序列化到本地。若要实现序列化,那么session里面的数据必须实现序列化接口。

    3.application

      3.1获取方式

        

    request.getServletContext();
    this.getServletContext();
    request.getSession().getServletContext();
    this.getServletConfig().getServletContext();
    // 注意:无论哪一种方式,拿到的都是同一个application对象

      3.2存取数据方式:

        删除、存取数据和session一样。

      3.3生命周期:

        整个项目在运行期间,只有一个application对象,所以这个对象是所有用户共享的,大家都可以向这个对象里面存数据,也可以再拿出来.因为这个对象一个项目中只有一个。

  • 相关阅读:
    R语言实战实现基于用户的简单的推荐系统(数量较少)
    MapReduce计数器
    MapReduce的Shuffle过程介绍
    R语言两种方式求指定日期所在月的天数
    ggplot2作图详解:入门函数qplot
    R语言中的数据处理包dplyr、tidyr笔记
    Metronic_下拉列表Select2插件的使用
    Linux_使用Linux之安装jdk 7
    HttpClient_HttpClient 4.3.6 HTTP状态管理
    HttpClient_HttpClient 对 cookie的处理
  • 原文地址:https://www.cnblogs.com/jamers-rz/p/13817043.html
Copyright © 2020-2023  润新知