当前位置: 首页 > news >正文

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中的代码

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 {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//从浏览器提交一个数据a = abcString a = req.getParameter("a");//创建一个Session对象HttpSession session = req.getSession();//如果服务器中没有Session对象,就由tomcat创建一个新的对象,如果有用现有的//把a的值放入session对象中session.setAttribute("a",a);/*tomcat会自动完成以下:session创建之后,会自动生成一个JsessionId,交给resp对象,响应给用户的浏览器*/}
}

(2)ServletB中的代码

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 {@Overrideprotected 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中的代码

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 {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();session.setMaxInactiveInterval(10);//单位:分钟; 设置Session的失效时间,只针对当前工程有效//强制销毁Sessionsession.invalidate();}
}

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

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

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

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

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

5.案例:

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请求的提交方式@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);System.out.println("doGet方法被调用了");}//用来接收post请求的提交方式@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPost(req, resp);System.out.println("doPost方法被调用了");}//开发中推荐使用service方法,并删除super.service(req, resp);@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.service(req, resp);//这里会调用doGet或者doPostSystem.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中的代码

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 {@Overrideprotected 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中的代码

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 {@Overrideprotected 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 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中的代码
  • 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 {@Overrideprotected 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)案例:

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 {@Overrideprotected 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容器内部打交道的对象*/}
}

文章转载自:

http://YGuWEAAT.hpgdz.cn
http://XOGUwTXg.hpgdz.cn
http://1EiXRfYF.hpgdz.cn
http://k9JBEJ0F.hpgdz.cn
http://1K9UbWp2.hpgdz.cn
http://EcNLWKes.hpgdz.cn
http://laKKPJJN.hpgdz.cn
http://APbd95Eq.hpgdz.cn
http://13bBKCL5.hpgdz.cn
http://zQDkbqmp.hpgdz.cn
http://OPNtWlN8.hpgdz.cn
http://LqIcicfK.hpgdz.cn
http://gI0tNVDN.hpgdz.cn
http://vOwVCBKv.hpgdz.cn
http://nCd5I8C0.hpgdz.cn
http://JU4TZhEe.hpgdz.cn
http://onReJpNw.hpgdz.cn
http://YwblnGcG.hpgdz.cn
http://m6yTSJfe.hpgdz.cn
http://QzwGBr0i.hpgdz.cn
http://Ahgo1f1O.hpgdz.cn
http://EpwKFzI4.hpgdz.cn
http://UwcRaPav.hpgdz.cn
http://4gGDWmPK.hpgdz.cn
http://LfKNh9jz.hpgdz.cn
http://r5MGOsls.hpgdz.cn
http://622sKVo5.hpgdz.cn
http://4y4cifsd.hpgdz.cn
http://oAlHL9kV.hpgdz.cn
http://Gi5245ob.hpgdz.cn
http://www.dtcms.com/a/383645.html

相关文章:

  • HTML 编码规范
  • 深度学习(九):逻辑回归
  • 【LeetCode 每日一题】36. 有效的数独
  • 单表查询要点概述
  • 【Trans2025】计算机视觉|即插即用|WSC:即插即用!WSC模块,高光谱图像分类新SOTA!
  • Java面试小册(3)
  • 微服务项目测试接口一次成功一次失败解决办法
  • GPIO 之 EMIO 按键控制 LED 实验
  • centos安装 GNOME 桌面环境
  • 高并发投票功能设计
  • (B2B/工业/医疗行业)GEO优化服务商有哪些?哪家好?供应商推荐
  • unordered_map使用MFC的CString作为键值遇到C2056和C2064错误
  • MFC_Install_Create
  • 大数据知识框架思维导图(构造知识学习框架)
  • Spring Boot 集成第三方 API 时,常见的超时与重试机制设计
  • 设计模式——创建型模式
  • Nginx_Tomcat综合案例
  • Java常见类类型与区别详解:从实体类到异常类的全面指南
  • MOS管驱动栅极出现振铃现象
  • camke中采用vcpkg工具链设置OSG时
  • 玩转ElasticSearch
  • 设计模式-模板模式详解
  • GDB调试技巧实战--揪出内存泄漏元凶
  • LLM基础-工程化
  • Ubuntu系统下交叉编译Android的Lame库
  • AI 重构医疗:辅助诊断、药物研发、健康管理的三大落地场景实践
  • MySQL的日志系统(redolog、binlog、WAL技术)
  • 贪心算法应用:半导体晶圆生产问题详解
  • 按键精灵解决重复性点击
  • 索引-分类