servlet容器

    12.request session application  pageContext(作用范围:jsp页面内)
       这三个对象可以在服务器内部帮我们保存数据以及传递数据.
            类型            对象名
       HttpServletRequest   request
       HttpSession        session
       ServletContext        application
    
    注意:三个容器内部都维护了一个Map集合
       
       request:
         保存数据:设置值
     key必须是String,value是Object类型
     request.setAttribute("key", value);
     取数据:取值
     通过key拿到value值,需要的话可以强转
     Object o = request.getAttribute("key");
    生命周期:request始于浏览器终止于浏览器(浏览器每发出一次http请求都会构建新的request对象)
    request给浏览器传数据是一次性的,只能借助于服务器内部跳转给页面传数据
     作用范围:request的存/取数据只能在一次请求之内起作用.比如服务器内部跳转的时候(因为内部跳转客户端只发一次请求).
     注意:客户端重定向是不行的,因为客户端重定向会发出多个请求.

    
       session:
    
      保存数据和取数据:
         和上面request一模一样的操作,只是对象的名字变化了,上面的加request,而这个叫session.

      如何获得: 获取session对象
      HttpSession session = req.getSession();
    特点:
        http协议是无状态协议(不记录是哪个浏览器访问的),需要服务器给出一种机制(标记)
        用于标记是哪个浏览器访问的
        浏览器访问非静态资源(Servlet,jsp...),服务器会给该浏览器创建一个session对象,
        当前请求回写资源给浏览器的时候会把session的id带给浏览器,浏览器把session的id
        保存到浏览器的cookie中,同时会标记该项目及失效时间,下一次只要访问该项目都会
        把session的id发给服务器
        (session的id在本地以jsessionid的形式出现)
        这种技术叫会话追踪技术
    范围:session存储的都是用户的私人信息
    生命周期:默认的是浏览器和服务器30分钟内没有交互,服务器自动销毁该session对象
    session的创建
    第一次访问非静态资源
    浏览器中有jessionid 服务器session对象销毁
    浏览器中jessionid不存在 服务器

      作用范围:在一个会话之中起作用.一个会话可以包括很多个request请求,
      所以放在session中的数据,可以被多个请求所共享.
     
       
       application:
          保存数据和取数据:
         和上面request也是一模一样的操作

          如何获得:获取application对象
      第一种:ServletContext application=request.getServletContext();
      第二种:ServletContext application=session.getServletContext();
      第三种:ServletContext application=getServletContext();
        或ServletContext application=this.getServletContext();
  作用范围:整个项目在运行期间,只有一个application对象,所以这个对象是所有人所有会员共享的,大家都可以向这个对象里面存值,也可以再拿出来.因为 这个对象一个项目中只有一个.

  作用范围: request<session<application
  (page<request<session<application  这page是之后我们在jsp中要学习的另一个范围,页面范围,只在一个页面中起作用。)


  注意:getParameter("key")方法和getAttribute("key")方法,getParameter是接收客户端传过来的值,getAttribute方法是取到之前调用setAttribute方法保存到这个对象里面的值.

El表达式专门从容器中取内容
语法:
${容器.key}
eg:${requestScope.name}
后台            前台
request            requestScope
HttpSession        sessionScope
ServletContext        applicationScope

  13.会话追踪技术 session cookie
http协议的访问是无状态的访问,就是说当前这次访问是不会知道之前访问的状态的.(http协议的访问是不会帮我们保存访问的记录/痕迹的).
有些我们的访问是不需要知道之前访问的状态的.比如我们访问一些静态的页面,在访问一个校园网站的时候,第一次访问点击了页面中的校园风采,第二次访问点击了学生作品,这俩次访问完全可以没有任何关系,也不需要知道各自访问的状态.
但是有些访问我们是一定要知道之前几次访问的状态的.比如在购物网站的时候,第一次访问点击购买了一个手机,第二次访问点击购买了一个电脑,第三次访问点击购物车结算,这个时候我们就必须知道前俩次访问的时候购买了什么,要不然就没有方法去结算。
所以我们就有了会话追踪技术来解决这个访问无状态的问题

session和cookie
session是保存在服务器端的一个对象.客户端是没有session的.

cookie在客户端和服务器端都会有。但是存在的形式不一样.在客户端cookie是以本地文件(浏览器管理的文件)的形式存在的,在服务器端是以java对象的形式存在.

cookie的作用:和session一样,是用来保存用户访问的信息数据的。但是session是把数据保存在服务器端的内存里面,cookie是把数据保存在客户端的文件里面.


客户端访问服务器的时候,服务器会给这个客户端创建一个会话,也就是一个session对象,服务器端的内存里面同时可能有好多个session对象,分别对应的不同的客户端,每一个session对象都有一个唯一的id值,叫做JSESSIONID。

服务器端给客户端产生一个session对象后,会通过这次访问的response对象把这个session的JSESSIONID的值返回给浏览器,浏览器接收到后会把这个值以一个cookie文件的形式保存起来.

之后,这个浏览器再发生请求到服务器的时候,就会把之前保存在cookie文件中的JSESSIONID的值传给服务器,服务器通过这个JESSIONID的值就能够知道服务器内存中是哪一个session对象和当前这个客户端对应.

这样以来,最后就能到达一个效果,我们客户端的每一次访问,在服务器端都能够拿到相同的一个session对象,从而实现不同请求之间通过相同的session对象进行数据的共享.


如何从服务器端向浏览器写回cookie
    //创建cookie对象
    Cookie c1 = new Cookie("name","tom");
    Cookie c2 = new Cookie("msg","hello");
    //设置cookie的有效时间
    c1.setMaxAge(60*60*24*365);
    c2.setMaxAge(60*60*24*365*10);
    //把cookie放到response里面
    resp.addCookie(c1);
    resp.addCookie(c2);
    
 最后response对象会把cookie带回到浏览器,并又浏览器把cookie对象中的内容保存到对应的一个cookie的文件中。

 注意:如果没有设置cookie生效的时间,那么这个cookie就是会话cookie,当会话结束(关闭浏览器)的时候cookie就是失效了。


 如何在servlet中拿到从浏览器发送过来的cookie文件中的数据
   //从request中拿到一个cookie数组
   //如果没任何cookie数据则返回null
   Cookie[] cookies = req.getCookies();
   //遍历数组 拿出key和value
   for(Cookie c:cookies){
    String key = c.getName();
    String value = c.getValue();
   }

注意:session对象的创建时间。
 

猜你喜欢

转载自blog.csdn.net/bifuguo/article/details/82886818