Servlet3-Cookie、Session、ServletContext、ServletConfig

Cookie技术: 会话数据保存在浏览器客户端。
Session技术: 会话数据保存在服务器端。(域对象)

Cookie技术

作用:解决了发送的不同请求的数据共享问题
使用:
  Cookie的创建和存储
    //创建Cookie对象
      Cookie c=new Cookie(String name, String value);
    //设置cookie(可选)
      //设置有效期
      c.setMaxAge(int seconds);
    //设置有效路径
      c.setPath(String uri)
    //响应Cookie信息给客户端
      resp.addCookie(c);
  Cookie的获取
    //获取Cookie信息数组
      Cookie[] cks=req.getCookies();
    //遍历数组获取Cookie信息
      使用for循环遍历即可,示例:
        if(cks!=null){
          for(Cookie c:cks){
            String name=c.getName();
            String value=c.getValue();
            System.out.println(name+":"+value);
          }
        }
注意:
  一个Cookie对象存储一条数据。多条数据,可以多创建几个Cookie对象进行存储。
特点:
  浏览器端的数据存储技术。
  存储的数据声明在服务器端。
  临时存储:存储在浏览器的运行内存中,浏览器关闭即失效。
  定时存储:设置了Cookie的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息。
  默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径

 1 protected void service(HttpServletRequest req, HttpServletResponse resp)
 2         throws ServletException, IOException {
 3     //设置请求编码格式
 4     req.setCharacterEncoding("utf-8");
 5     //设置响应编码格式
 6     resp.setContentType("text/html;charset=utf-8");
 7     //获取请求信息
 8     
 9     //处理请求信息
10     //响应处理结果
11         //使用Cookie进行浏览器端的数据存储
12             //创建Cookie对象
13             Cookie c=new Cookie("mouse", "thinkpad");
14             Cookie c2=new Cookie("key", "bjsxt");
15             //设置Cookie
16                 //设置Cookie的有效期
17                 c2.setMaxAge(3*24*3600);
18                 //设置有效路径
19                 c2.setPath("/cookie/gc");
20             //响应Cookie信息
21             resp.addCookie(c);
22             resp.addCookie(c2);
23         //直接响应
24             resp.getWriter().write("Cookie学习");
25         //请求转发
26         //重定向
27 }

Session技术

问题:
  一个用户的不同请求处理的数据共享怎么办?
解决:
  使用session技术
原理:
  用户第一次访问服务器,服务器会创建一个session对象给此用户,并将该session对象的JSESSIONID使用Cookie技术存储到浏览器中,保证用户的其他请求能够获取到同一个session对象,也保证了不同请求能够获取到共享的数据。
特点:
  存储在服务器端
  服务器进行创建
  依赖Cookie技术
  一次会话
  默认存储时间是30分钟
作用:
  解决了一个用户不同请求处理的数据共享问题
使用:
  创建session对象/获取session对象
    HttpSession hs=req.getSession();
    如果请求中拥有session的标识符也就是JSESSIONID,则返回其对应的session对象
    如果请求中没有session的标识符也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID作为cookie数据存储到浏览器内存中。
    如果session对象是失效了,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中。
  设置session存储时间
    hs.setMaxInactiveInterval(int seconds);以秒为单位
    注意:
      在指定的时间内session对象没有被使用则销毁,如果使用了则重新计时。
    全局设置session的有效时长:
      在web.xml文件中,设置
      <!-- 配置session的有效时长:以分为单位 -->
      <session-config>
        <session-timeout>1</session-timeout>
      </session-config>
  设置session强制失效
    hs.invalidate();
  存储和获取数据
    存储:hs.setAttribute(String name,Object value);
    获取:hs.getAttribute(String name) 返回的数据类型为Object
    注意:
      存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行。
    使用时机:
      一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。
  总结:
    session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下。用户的任意请求在处理时都能获取到同一个session对象。
  作用域:
    一次会话
    在JSESSIONID和SESSION对象不失效的情况下为整个项目内。
  session失效处理:
    将用户请求中的JSESSIONID和后台获取到的SESSION对象的JSESSIONID进行比对,如果一致则session没有失效,如果不一致则证明session失效了。重定向到登录页面,让用户重新登录。
注意:
  JSESSIONID存储在了Cookie的临时存储空间中,浏览器关闭即失效。
 1 protected void service(HttpServletRequest req, HttpServletResponse resp)
 2         throws ServletException, IOException {
 3     //设置请求编码格式
 4     req.setCharacterEncoding("utf-8");
 5     //设置响应编码格式
 6     resp.setContentType("text/html;charset=utf-8");
 7     //获取请求信息
 8         String name="张三";
 9     //处理请求信息
10         //创建session对象
11         HttpSession hs=req.getSession();
12         //设置session的存储时间
13             //hs.setMaxInactiveInterval(5);
14         System.out.println(hs.getId());
15         //设置session强制失效
16             //hs.invalidate();
17         //存储数据
18             hs.setAttribute("name",name);
19     //响应处理结果
20         //直接响应
21         resp.getWriter().write("session学习");
22         //请求转发
23         //重定向
24 }
1 protected void service(HttpServletRequest req, HttpServletResponse resp)
2         throws ServletException, IOException {
3     HttpSession hs=req.getSession();
4     System.out.println("SessionServlet2.service()"+hs.getAttribute("name"));
5 }

cookie特点:
 1)会话数据保存在浏览器端
 2)会话数据只能是字符串类型,不能保存中文的
 3)会话数据容量有限制,一个cookie不能超过4kb,一个站点20个cookie
 4)不适合存在敏感数据,数据存放不安全。
session特点:
 1)会话数据保存在服务器端
 2)会话数据任意类型
 3)会话数据容量无限制
 4)相对安全

ServletContext对象(Servlet上下文对象)

问题:
  不同的用户使用相同的数据
解决:
  ServletContext对象
特点:
  服务器创建
  用户共享
  一个项目只有一个
作用域:
  整个项目内
生命周期:
  服务器启动到服务器关闭
使用:
  获取ServletContext对象
    //第一种方式:
      ServletContext sc=this.getServletContext();
    //第二种方式:
      ServletContext sc2=this.getServletConfig().getServletContext();
    //第三种方式:
      ServletContext sc3=req.getSession().getServletContext();
  使用ServletContext对象完成数据共享
    //数据存储
      sc.setAttribute(String name, Object value);
    //数据获取
      sc.getAttribute("str") 返回的是Object类型
    注意:
      不同的用户可以给ServletContext对象进行数据的存取。
      获取的数据不存在返回null。
  获取项目中web.xml文件中的全局配置数据
    sc.getInitParameter(String name); 根据键的名字返回web.xml中配置的全局数据的值,返回String类型。
      如果数据不存在返回null。
    sc.getInitParameterNames();返回键名的枚举
    配置方式:注意一组<context-param>标签只能存储一组键值对数据,多组可以声明多个 <context-param>进行存储。
      在<servlet>上,在<web-app>下:
      <context-param>
        <param-name>name</param-name>
        <param-value>zhangsan</param-value>
      </context-param>
      作用:将静态数据和代码进行解耦。
  获取web应用的上下文路径
    String path=sc.getContextPath();
    获取web应用上下路径。也就是部署到tomcat服务器上运行的web应用名称。
    例:重定向:resp.sendRedirect("/login/main");  写成:resp.sendRedirect(sc.getContextPath()+"/main");
  获取项目webroot下的资源的绝对路径。
    String path=sc.getRealPath(String path); 
    获取的路径为项目根目录,path参数为项目根目录中的路径
  获取webroot下的资源的流对象
    InputStream is = sc.getResourceAsStream(String path);
    注意:
      此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器获取。
      path参数为项目根目录中的路径
  获取webroot下的资源的URL
    URL url = sc.getResource(String path);
    能获取一个URL,不能构造输入流。

 1 protected void service(HttpServletRequest req, HttpServletResponse resp)
 2         throws ServletException, IOException {
 3     //获取ServletContext对象
 4         //第一种方式:
 5         ServletContext sc=this.getServletContext();
 6         //第二种方式:
 7         ServletContext sc2=this.getServletConfig().getServletContext();
 8         //第三种方式:
 9         ServletContext sc3=req.getSession().getServletContext();
10         System.out.println(sc==sc2);
11         System.out.println(sc==sc3);
12     //使用ServletContext对象完成数据共享
13         //数据存储
14         sc.setAttribute("str", "ServletContext对象学习");
15     //获取项目web.xml的全局配置数据
16         String str = sc.getInitParameter("name2");
17         System.out.println("全局配置参数:"+str);
18     //获取项目根目录下的资源的绝对路径
19         //String path="D:\\apache-tomcat-7.0.56\\webapps\\sc\\doc\\1.txt";
20         String path=sc.getRealPath("/doc/1.txt");
21         System.out.println(path);
22     //获取项目根目录下资源的流对象
23         InputStream is = sc.getResourceAsStream("/doc/1.txt");
24 
25 }
1 protected void service(HttpServletRequest req, HttpServletResponse resp)
2         throws ServletException, IOException {
3     //创建ServletContext对象
4         ServletContext sc=this.getServletContext();
5     //获取数据
6         System.out.println("ServletContextServlet2.service()"+sc.getAttribute("str"));
7 }

ServletConfig对象

问题:
  如何获取在web.xml中给每个servlet单独配置的数据呢?
解决:
  使用ServletConfig对象
注意:ServletConfig对象是在创建完servlet对象之后,被创建出来。然后通过有参数的init方法传递到servlet中。 一个网站中存在多个ServletConfig对象,一个ServletConfig对象就封存了一个Servlet的配置信息。
使用:
  获取ServletConfig对象
  获取web.xml中的配置数据
    在<servlet>中添加:
    <init-param>
      <param-name>config</param-name>
      <param-value>utf-8</param-value>
    </init-param>

1 protected void service(HttpServletRequest req, HttpServletResponse resp)
2         throws ServletException, IOException {
3     //获取ServletConfig对象
4     ServletConfig sc=this.getServletConfig();
5     //获取web.xml中的配置数据
6     String code=sc.getInitParameter("config");
7     System.out.println(code);
8 }

web.xml文件使用

作用:
  存储项目相关的配置信息,保护 Servlet。解耦一些数据对程序的依赖。
使用位置:
  每个 Web 项目中
  Tomcat 服务器中(在服务器目录 conf 目录中)
区别:
  Web 项目下的 web.xml 文件为局部配置,针对本项目的位置。
  Tomcat 下的 web.xml 文件为全局配置,配置公共信息。
内容(核心组件):
  全局上下文配置(全局配置参数)
  Servlet 配置
  过滤器配置
  监听器配置
加载顺序:
  Web 容器会按 ServletContext -> context-param -> listener ->filter-> servlet 这个顺序加载组件,这些元素可配置在 web.xml文件中的任意位置。
加载时机:
  服务器启动时。

server.xml文件使用

Server.xml 文件核心组件:

<Server> 
    <Service> 
        <Connector/> 
        <Connector/> 
        <Engine> 
            <Host> 
                <Context/> 
            </Host> 
        </Engine> 
    </Service>
</Server>

热部署: <Context path="/Pet" reloadable="true" docBase="F:/PetWeb" />
  path: 项目访问路径
  docBase: 项目路径。/开头的是实际路径,没有/开头的为相对路径,相对于webapps
  reloadable: 开启热更新,热部署

猜你喜欢

转载自www.cnblogs.com/sunny-sml/p/12514688.html