JavaWeb-Session和ServletContext

目录

一、Session技术

二、Servlet中的doGet方法和doPost方法

三、ServletContext对象


一、Session技术

1.session技术就是将信息存储在服务器上,实现不同servlet之间数据共享的一种技术。

2.session在使用时需要依赖于cookie技术。

3.session技术的使用流程:

(1)将要共享的数据保存在本地的Session对象中。

(2)这个Session对象会生成一个jsessionid。

(3)通过cookie技术将这个jsessionid响应到客户的浏览器中。

(4)下次访问,客户就会带着这个cookie,而服务器拿到这个cookie中的jsessionid后,会自动找到对应的Session对象,取出里面的数据。

4.创建Session对象:

(1)格式:req.getSession()

(2)返回的是一个HttpSession对象。

(3)在Session对象创建之后,会自动生成一个jsessionid,这个jsessionid会交给resp对象,响应给用户浏览器,这个过程是自动的。

(4)注意:如果服务器中没有Session对象,就由tomcat创建一个新的对象,如果有用现有的。

5.往Session对象里面存入值:

(1)HttpSession对象名.setAttribute("key","value")

(2)注意:将数据放入Session对象中时会自动提升为Object类型。

6.从Session对象中获取值:

(1)HttpSession对象名.getAttribute("key")

(2)注意:取值时需要强转为对应的类型,因为这个获取的的类型是Object。

7.强制销毁Session:

(1)HttpSession对象名.invalidate()

8.设置Session的有效期:

(1)HttpSession对象名.setMaxInactiveInterval(具体时间)

(2)这个的单位是分钟。

(3)注意:这个设置只针对当前的工程,在tomcat服务器的conf目录下的web.xml中设置的话是针对的所有工程。

9.Session的原理:

(1)用户使用浏览器第一次向服务器发送请求,服务器在接收到请求后,调用对应的Servlet进行处理。在处理过程中会给用户创建一个session对象(一但创建,就会有一个JSESSIONID),用来存储用户请求处理相关的公共数据,并将此Session对象的JSESSIONID以Cookie的形式存储在浏览器中(临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请求时,请求信息中会附带jSESSIONID,服务器在接收到请求后,调用对应的ServletB进行请求处理,同时根据JSESSIONID返回其对应的Session对象(解析JSESSIONID并通过JSESSIONID找对应Session的是服务器底层来完成)。

10.Session的特点:

(1)Session技术是依赖Cookie技术的服务器端的数据存储技术。

(2)由服务器进行创建。

(3)每个用户独立拥有一个session。

(4)注意:如果存储的动作和取出的动作发生在不同的请求中,存储要先于取出执行;一般用户在登录web项目时会将用户的个人信息存储到Session中,供该用户的其他请求使用。

(5)Session的默认存储时间为30分钟。

  • session的默认存储时间可以在tomcat服务器的conf目录下的web.xml中找到,可以更改

11.总结:

(1)Session只要在不失效的情况下(不关闭浏览器),同一个用户的任意请求,在项目中,Servlet中都是获取的同一个Session对象,Session对象是基于用户的,一个用户一个Session。

(2)Session在整个工程中都是有效的,所以Session又叫上下文对象,上下文对象就是Tomcat服务器中的一个空间,这个空间是一个项目中的公共区域,也就是说在一个web应用程序中所有的Servlet都可以共享这个区域。

12.案例:

(1)ServletA中的代码

java 复制代码
package com.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/servletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //从浏览器提交一个数据a = abc
        String a = req.getParameter("a");
        //创建一个Session对象
        HttpSession session = req.getSession();//如果服务器中没有Session对象,就由tomcat创建一个新的对象,如果有用现有的
        //把a的值放入session对象中
        session.setAttribute("a",a);
        /*
        tomcat会自动完成以下:
        session创建之后,会自动生成一个JsessionId,交给resp对象,响应给用户的浏览器
         */
    }
}

(2)ServletB中的代码

java 复制代码
package com.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/servletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取Session对象
        HttpSession session = req.getSession();//如果服务器中没有Session对象,就由tomcat创建一个新的对象,如果有用现有的
        //从Session中取数据
        String a = (String) session.getAttribute("a");
        System.out.println("在ServletB中从Session中取到了:" + a);
    }
}

(3)ServletC中的代码

java 复制代码
package com.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/servletC")
public class ServletC extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.setMaxInactiveInterval(10);//单位:分钟; 设置Session的失效时间,只针对当前工程有效
        //强制销毁Session
        session.invalidate();
    }
}

二、Servlet中的doGet方法和doPost方法

1.doGet方法用来接收get请求的提交方式。

2.doPost方法用来接收post请求的提交方式。

3.注意:如果有service方法,那么tomcat就不会去调用doGet或者是doPost方法,而是直接调用service方法;如果没有service方法,那么就会根据用户的请求去调用对应的doGet方法或者是doPost方法。

4.开发中推荐使用service方法,并删除其调用父类service方法的代码。

5.案例:

java 复制代码
package com.web.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/test")
public class TestServlet extends HttpServlet {
    //用来接收get请求的提交方式
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
        System.out.println("doGet方法被调用了");
    }

    //用来接收post请求的提交方式
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);
        System.out.println("doPost方法被调用了");
    }

    //开发中推荐使用service方法,并删除super.service(req, resp);
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.service(req, resp);//这里会调用doGet或者doPost
        System.out.println("service方法被调用了");
    }
}

三、ServletContext对象

1.ServletContext对象是tomcat容器的上下文对象,这个对象在一个工程中有且只有一个,可以在不同的用户之间共享数据。

2.创建ServletContext对象:

(1)方法一:this.getServletContext

(2)方法二:req.getSession().getServletContext

(3)方法三:this.getServletConfig.getServletContext

3.往ServletContext对象中存入数据:

(1)ServletContext对象名.setAttribute("key","value")

4.从ServletContext对象中取出数据:

(1)ServletContext对象名.getAttribute("key")

5.删除ServletContext对象中的共享数据:

(1)ServletContext对象名.removeAttribute("key")

6.案例:

(1)ServletA中的代码

java 复制代码
package com.web;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/ServletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*
        创建ServletContext对象,有三种方式
        一个工程中只有一个ServletContext对象
         */
        ServletContext sc1 = this.getServletContext();
        ServletContext sc2 = req.getSession().getServletContext();
        ServletContext sc3 = this.getServletConfig().getServletContext();
        System.out.println(sc1.hashCode());
        System.out.println(sc2.hashCode());
        System.out.println(sc3.hashCode());
        //从输出结果可以看出,输出的是相同的哈希码,说明是同一个对象
        sc1.setAttribute("a","aaa");
        sc2.setAttribute("b","bbb");
    }
}

(2)ServletB中的代码

java 复制代码
package com.web;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/ServletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext sc = this.getServletContext();
        String a = (String) sc.getAttribute("a");
        String b = (String) sc.getAttribute("b");
        System.out.println("a:" + a);
        System.out.println("a:" + b);
    }
}

7.ServletContext对象可以读取web.xml中的数据:

(1)将数据放入web.xml中的context-param标签中,可以通过ServletContext读取。

(2)使用ServletContext对象读取配置文件web.xml中的数据:

  • 格式:ServletContext对象名.getInitParameter("key");
  • 返回值类型是一个String类型

(3)案例:

  • web.xml中的配置信息
XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--当前工程中都有效,配置文件中的信息-->
    <context-param>
        <param-name>flag</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>city</param-name>
        <param-value>beijiing</param-value>
    </context-param>
</web-app>
  • ServletC中的代码
java 复制代码
package com.web;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/ServletC")
public class ServletC extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext sc = this.getServletContext();
        //通过ServletContext从配置文件web.xml中取数据
        String flag = sc.getInitParameter("flag");
        if(flag.equals("true")){
            System.out.println("定期清理缓存数据...");
        }
        String city = sc.getInitParameter("city");
    }
}

8.作用:解决了不同用户的数据共享问题

9.原理:

(1)ServletContext对象由服务器进行创建,一个项目只有一个对象。不管在项目的任意位置进行获取,得到的都是同一个对象,那么不同用户发起的请求获取到的也就是同一个对象了,该对象由访问此项目工程(作用域在整个项目工程中)的所有用户共同拥有。

10.特点:

(1)由服务器创建

  • ServletContext由服务器进行创建,在服务器启动的时候创建,目的:提供一个对象,用于开发者访问tomcat容器的内部数据

(2)用户共享

(3)一个项目只有一个

11.生命周期:服务器启动到服务器关闭。

12.作用域:项目(工程)内。

13.可以使用ServletContext获取到已经部署在项目中web下的资源的绝对路径:

(1)格式:ServletContext对象名.getRealPath();

(2)案例:

java 复制代码
package com.web;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;

@WebServlet("/ServletD")
public class ServletD extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //通过ServletContext获取
        ServletContext sc = this.getServletContext();
        //当前工程的根目录
        String basePath = sc.getRealPath("/");
        File f = new File(basePath, "datas");
        boolean flag = f.mkdir();
        System.out.println("flag:" + flag);
        //传统的方式获取当前工程的存储的路径
        File file = new File("/datas/aa.txt");
        String absolutePath = file.getAbsolutePath();
        System.out.println("absolutePath:" + absolutePath); //E:\Java\apache-tomcat-9.0.41\bin\datas\aa.txt,这个不存在
        System.out.println("basePath:" + basePath);//当前工程的根目录
        String realPath = sc.getRealPath("/datas");
        System.out.println("realPath:" + realPath);
        /*
        ServletContext对象是我们开发者可以与tomcat容器内部打交道的对象
         */
    }
}
相关推荐
MFine17 小时前
Rhythmix(流式数据规则表达式),一行就够了!
java·物联网·数据分析
丰锋ff17 小时前
英一2010年真题学习笔记
笔记
华仔啊18 小时前
面试官问:流量突然暴增100倍,系统怎么扛?我的方案是...
java
一只乔哇噻18 小时前
java后端工程师进修ing(研一版‖day50)
java·开发语言
快码加编~18 小时前
无法解析插件 org.apache.maven.plugins:maven-site-plugin:3.12.1
java·学习·maven·intellij-idea
托比-马奎尔18 小时前
Maven学习
java·学习·maven
znhy@12318 小时前
十一、Maven web项目的构建
java·maven
paopao_wu18 小时前
Spring AI 从入门到实战-目录
java·人工智能·spring
Hello.Reader18 小时前
用 Maven 配置 Flink 从初始化到可部署的完整实践
java·flink·maven
程序员大雄学编程19 小时前
「机器学习笔记2」机器学习系统设计:从理论到实践
人工智能·笔记·机器学习