Servlet学习之ServletConfig和ServletContext
文章目录
- 1.ServletConfig
-
- 1.1 概述
- 1.2 常用方法
- 1.3 部分演示
- 2.ServletContext
-
- 2.1 概述
- 2.2 常用方法
- 2.3 部分演示
- 2.4 关于ServletContext存放的数据
1.ServletConfig
1.1 概述
- ServletConfig是Servlet对象的配置存储对象
- ServletConfig封装了web.xml文件中标签中的配置信息
- 一个Servlet对象对应一个ServletConfig对象。
- Servlet对象和ServletConfig对象都是由服务器创建,默认情况下他们都是用户发出第一次请求的时候被创建
如果我们看一下Servlet接口的源码不难发现,ServletConfig是作为init()方法的参数出现的。
1.2 常用方法
public String getInitParameter(String name); // 通过初始化参数的name获取valuepublic Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的namepublic ServletContext getServletContext(); // 获取ServletContext对象public String getServletName(); // 获取Servlet的name
1.3 部分演示
单单是文字可能不够直接,所以我们使用代码来展示这个ServletConfig到底装了什么玩意。
首先说明一下服务器的环境,我们使用的Tomcat10,该webapp的名字为xmm。
展示一下Servlet的代码:
package com.bjpowernode.javaweb.servlet;import jakarta.servlet.*;import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;public class AServlet extends GenericServlet { @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); //获取该Servlet对象的ServletConfig对象 ServletConfig servletConfig = this.getServletConfig();//使用getInitParameterNames()来获取配置信息的名字 Enumeration<String> initParameterNames = servletConfig.getInitParameterNames(); //遍历容器将其展示在网页上 while (initParameterNames.hasMoreElements()){ String name = initParameterNames.nextElement(); //getInitPatameter(String name)获得配置信息的值 out.print(name +" "+ this.getInitParameter(name) + "
"); } }}
再看一下WebApp的配置文件(web.xml)中关于AServlet的内容:
<servlet><servlet-name>AServlet</servlet-name> <servlet-class>com.bjpowernode.javaweb.servlet.AServlet</servlet-class> <init-param> <param-name>测试数据1</param-name> <param-value>一</param-value> </init-param> <init-param> <param-name>测试数据2</param-name> <param-value>二</param-value> </init-param> <init-param> <param-name>测试数据3</param-name> <param-value>三</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>AServlet</servlet-name> <url-pattern>/a</url-pattern></servlet-mapping>
再接下来我们启动Tomcat服务器,并通过路径启动AServlet中的服务。
页面展示效果:
这样以来ServletConfig中的内容是不是就非常的清晰了。
2.ServletContext
2.1 概述
- 从上面我们可以知道,一个Servlet对象对应一个ServletConfig,而一个WebApp对应一个ServletContext对象。
- ServletContext对象在服务器启动的时候被服务器创建,在服务器关闭的时候被销毁。
- ServletConfig对应的是中的内容,而ServletContext对应的是web.xml中的内容。
2.2 常用方法
public String getInitParameter(String name); // 通过初始化参数的name获取valuepublic Enumeration<String> getInitParameterNames(); // 获取所有的初始化参数的namepublic String getContextPath();// 获取应用的根路径(非常重要),因为在java源代码当中有一些地方可能会需要应用的根路径,这个方法可以动态获取应用的根路径public String getRealPath(String path);// 获取文件的绝对路径(真实路径),参数为相对路径// 这两个方法用来记录日志,日志文件存放在/TOMCAT_HOME/logs目录下public void log(String message);public void log(String message, Throwable t);// Tomcat服务器的logs目录下都有哪些日志文件?// catalina.2021-11-05.log 服务器端的java程序运行的控制台信息。// localhost.2021-11-05.log ServletContext对象的log方法记录的日志信息存储到这个文件中。// localhost_access_log.2021-11-05.txt 访问日志// 存(向ServletContext应用域中存数据)public void setAttribute(String name, Object value); // map.put(k, v)// 取(从ServletContext应用域中取数据)public Object getAttribute(String name); // Object v = map.get(k)// 删(删除ServletContext应用域中的数据)public void removeAttribute(String name); // map.remove(k)
2.3 部分演示
同样的我们用代码来展示ServletContext中的内容:
AServlet:
package com.bjpowernode.javaweb.servlet;import jakarta.servlet.*;import java.io.IOException;import java.io.PrintWriter;import java.util.Enumeration;public class AServlet extends GenericServlet { @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); ServletContext servletContext= this.getServletContext(); Enumeration<String> initParameterNames = servletContext.getInitParameterNames(); while (initParameterNames.hasMoreElements()){ String name = initParameterNames.nextElement(); out.print(name +"
"); } }}
配置文件:
<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"> <servlet> <servlet-name>AServlet</servlet-name> <servlet-class>com.bjpowernode.javaweb.servlet.AServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AServlet</servlet-name> <url-pattern>/a</url-pattern> </servlet-mapping> <context-param> <param-name>测试数据1</param-name> <param-value>一</param-value> </context-param> <context-param> <param-name>测试数据2</param-name> <param-value>二</param-value> </context-param> <context-param> <param-name>测试数据3</param-name> <param-value>三</param-value> </context-param> </web-app>
结果:
这里我们说一下中的配置信息,这里的配置信息是应用级别的,对一个项目中的所有的App都生效。
如果你不想这样,你只是想让这一段配置信息只对一个Servlet对象起作用,那我们只需要把该标签放在即可。
2.4 关于ServletContext存放的数据
首先我们已经知道,ServletContext中的数据是被一整个项目所共享的。那么什么样的数据适合存放在ServletContext呢?答案是:数据量小、所有用户共享、又不修改
- 数据量小:如果数据量比较大的话,太占用堆内存,而且这个对象的生命周期比较长,只有当服务器关闭的时候才会被销毁。
- 所有用户共享的数据:因为Servlet对象只有一个,如果这个数据只对一个对象所享用,那么就会浪费资源。
- 不修改:所有用户共享的数据,如果涉及到修改操作,必然会存在线程并发所带来的安全问题。所以放在ServletContext对象中的数据一般都是只读的。