servlet中的ServletContext对象
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对象中的数据没有及时同步的话便会出现“张冠李戴”的风险
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理