ServletContext官方叫Servlet上下文。服务器会为每一个Web应用创建一个ServletContext对象。这个对象全局唯一,而且Web应用 中的所有Servlet都共享这个对象(在整个web应用中只有一个ServletContext对象)。所以叫全局应用程序共享对象。

ServletContext对象的作用

  相对路径转绝对路径

  相对路径的相对点是以web项目的根作为相对点

  • context.getRealPath("path")

    将一个相对路径转换为绝对路径,在文件上传与下载时需要用到该方法做路径的转换。

        //获取ServletContext对象,继承自GenericServlet类
ServletContext servletContext=this.getServletContext();
//将相对路径转换为绝对路径
String realpath=servletContext.getRealPath("image/樱花.jpg");

  获取容器的附加信息

    获取当前Tomcat不同的基本信息

  • servletContext.getServerInfo()

    返回Servlet容器的名称和版本号

  • servletContext.getMajorVersion() 

    返回Servlet容器所支持Servlet的主版本号。

  • servletContext.getMinorVersion()

    返回Servlet容器所支持Servlet的副版本号。

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;
import java.io.PrintWriter; @WebServlet("/getbaseinfo")
public class GetBaseInfo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应编码
resp.setContentType("text/html;charset=utf-8");
//获取响应输出流
PrintWriter pw=resp.getWriter();
//获取servletContext对象
ServletContext servletContext=this.getServletContext(); //获取servlet容器名称和版本号
String serverinfo=servletContext.getServerInfo();
//获取Servlet容器所支持Servlet的主版本号
int major=servletContext.getMajorVersion();
//获取Servlet容器所支持Servlet的副版本号
int minor=servletContext.getEffectiveMinorVersion(); //输出到客户端浏览器
pw.println("容器名称及版本号:"+serverinfo);
pw.println("主版本号:"+major);
pw.println("副版本号:"+minor); pw.flush();
pw.close(); }
}

  读取配置信息

    读取web.xml特定节点所给定的内容

 <!--param-name的名称不能重复-->
 <context-param>
<param-name>key1</param-name>
<param-value>value1</param-value>
</context-param>
<context-param>
<param-name>key2</param-name>
<param-value>value2</param-value>
</context-param>
<context-param>
<param-name>key3</param-name>
<param-value>value3</param-value>
</context-param>
<context-param>
<param-name>key4</param-name>
<param-value>value4</param-value>
</context-param>
  • servletContext.getInitParameter("key")

    读取web.xml文件中标签中的配置信息。

  • servletContext.getInitParameterNames()

    读取web.xml文件中所有param-name标签中的值。

    @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取servletContext对象
ServletContext servletContext=this.getServletContext();
//获取所有<param-name>的值,返回枚举类型
Enumeration<String > en=servletContext.getInitParameterNames();
//遍历所有<param-name>
while (en.hasMoreElements()){
//获取每一个name
String name=en.nextElement();
//根据key获取value
String value=servletContext.getInitParameter(name);
//输出到控制台
System.out.println(name+":"+value);
} }

  全局容器

    当Tomcat启动后,会为当前web应用创建一个ServletContext对象。在一个web应用中,所有的servlet对应同一个ServletContext对象

  •  servletContext.setAttribute("key",ObjectValue)

      向全局容器中存放数据。

  •  servletContext.getAttribute("key")

      从全局容器中获取数据。

  •  servletContext.removeAttribute("key")

      根据key删除全局容器中的value。

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;
import java.io.PrintWriter; @WebServlet("/global")
public class GlobalContarner extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//获取ServletContext对象
ServletContext servletContext=this.getServletContext();
//获取全局容器的数据
String name=(String) servletContext.getAttribute("name");
String id=(String) servletContext.getAttribute("id"); //获取响应输出流
PrintWriter pw=resp.getWriter();
//向客户端浏览器响应数据
pw.println("name:"+name);
pw.println("id"+id); //刷新流
pw.flush();
//输出流
pw.close();
} /**
* 向ServletContext对象中初始化数据
* @throws ServletException
*/
//当Servlet被实例化后,Tomcat会立即调用init()方法,可用该方法向全局容器中添加数据
@Override
public void init() throws ServletException {
ServletContext servletContext=this.getServletContext();
servletContext.setAttribute("name","张三");
servletContext.setAttribute("id","123456");
}
}

ServletContext对象生命周期

1)当容器启动时会创建ServletContext对象并一直缓存该对象

2)容器关闭后该对象生命周期结束

3)由于ServletContext对象的生命周期非常长,所以在使用全局容器时不建议存放业务数据。如果在ServletContext对象中存放了业务数据,同时也在database中存放了相同的数据,当database做了修改而ServletContext对象中的数据没有及时同步的话便会出现“张冠李戴”的风险

servlet中的ServletContext对象的更多相关文章

  1. 重温Servlet学习笔记--servletContext对象

    一个项目中只有一个ServletContext对象,我们可以在多个servlet中获取这个唯一的对象,使用它可以给多个servlet传递数据,我们通常成servletContext为上下文对象.这个对 ...

  2. Servlet中的request对象、重定向和转发的差别(6)

    1.这里所说的request对象指的是HttpServletRequest对象,它代表client的请求,当client通过HTTP协议訪问server时.HTTP请求头中的全部信息都封装在这个对象中 ...

  3. Servlet学习(二)——ServletContext对象

    1.什么是ServletContext对象 ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象内部封装是该web应用的信息,一个web应用只有一个S ...

  4. Java EE javax.servlet中的ServletContext接口

    ServletContext接口 public interface ServletContext (https://docs.oracle.com/javaee/7/api/javax/servlet ...

  5. servlet中的ServletConfig对象

    ServletConfig对象对应web.xml文件中的<servlet>节点.当Tomcat初始化一个Servlet时,会创建ServletConfig对象,并将该Servlet的配置信 ...

  6. [原创]java WEB学习笔记05:Servlet中的ServletConfig对象

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. servlet中的HttpServletResponse对象

    当有多个客户端浏览器去请求Tomcat时,Tomcat会为每一个客户端浏览器创建一对独立的HttpServletRequest与HttpServletResponse对象 HttpServletRes ...

  8. servlet中的HttpServletRequest对象

    HttpServletRequest对象表示客户端浏览器发起的请求,当客户端浏览器通过HTTP协议访问服务器时,Tomcat会将HTTP请求中的所有信息解析并封装在HttpServletRequest ...

  9. spring中得到servletContext对象方法

    1.spring得到servletContext,这个和session没有什么关系,上下文可以说是一个session容器,一个上下文可以有多个会话session 在web.xml中有以下配置后.加入s ...

随机推荐

  1. 60天shell脚本计划-3/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年2月6日 --修改时间:2021年2月10日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在 ...

  2. c++ stringstream 实现字符串与int之间的转换

    #include <iostream> #include <sstream> using namespace std; int main() { //string转int st ...

  3. Python:格式化字符串的几种方式

    1.% 'abc%s'%'123' 'abc123' 'abc%s%s'%('123','456') 'abc123456' 当变量v是一个Tuple.List且其中元素数量和字符串中%数量相同时,可 ...

  4. Java递归与基础复习

    Day01-基础复习,递归 1.递归 定义:指在当前方法内调用自己,即函数内部调用本函数 分类: 直接递归和间接递归 直接递归成为方法自身调用自己 间接递归可以A方法调用B方法,B方法调用C方法,C方 ...

  5. Vue 源码解读(10)—— 编译器 之 生成渲染函数

    前言 这篇文章是 Vue 编译器的最后一部分,前两部分分别是:Vue 源码解读(8)-- 编译器 之 解析.Vue 源码解读(9)-- 编译器 之 优化. 从 HTML 模版字符串开始,解析所有标签以 ...

  6. JZ-045-扑克牌顺子

    扑克牌顺子 题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的 ...

  7. LOTO新型号支持串口蓝牙示波器

    LOTO串口/蓝牙示波器面世 LOTO一直专注在虚拟示波器领域,以USB虚拟示波器为基础,扩展了很多功能模块,可以把Windows示波器,信号源,逻辑分析仪,频谱分析,数据记录,安卓手机平板支持,隔离 ...

  8. CF1386C口胡

    自己在物理课上编了一道题,大概就是这题把删除区间的边改为保留区间的边...都不觉得判断短路和判断二分图有点儿像吗 题意:给定一张无向图,每次暂时删除一个区间内的边,问删除后这个区间是否为二分图. 首先 ...

  9. MySQL报错 SQL ERROR:1064 ,SQLState:42000

    使用mysql新增数据时报错,具体信息如图所示: 错误原因: 所建的表中 表名或字段名与数据库关键字冲突 解决办法 可以根据报错信息,查看错误的具体位置,找到数据库中对应的字段,查询是否与关键字(不分 ...

  10. 使用ABP SignalR重构消息服务(一)

    使用ABP SignalR重构消息服务 最近协助蟹老板升级新框架,维护基础设施服务,目前已经稳了. 早上蟹老板看到我进入公司,马上就叫停我,说我为什么左脚先进公司,你这样会让我很难做耶,这样把我给你一 ...