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容器内部打交道的对象
         */
    }
}
相关推荐
腻害兔5 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社6 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
克里斯蒂亚诺更新6 小时前
ruoyi角色权限的对应关系
笔记
萧瑟余晖7 小时前
JDK 26 新特性详解
java·开发语言
马优晨7 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
a1117769 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
维天说10 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
破碎的南瓜10 小时前
sqli--sql注入过关笔记(1,2,3,4,5,9)
数据库·笔记·sql
Zane199411 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
你想知道什么?11 小时前
线性回归-学习笔记
笔记·学习·线性回归