一、ServletConfig 和 ServletContext 的概念含义创建时期作用范围二、ServletConfig 和 SerlvetContext 代码表示ServletConfigServletContext
一、ServletConfig 和 ServletContext 的概念
我们都知道Servlet是框架的灵魂,学习web框架最底层离不开Servlet的支持,那么Servlet 是什么呢?如何创建一个Servlet 不是本文的重点,相关文章可以参考
谈谈你对Servlet 的理解:
https://blog.csdn.net/qq_39688352/article/details/76794973
含义
ServletConfig :
Servlet的配置对象,容器在初始化的时候通过它传递信息给Servlet
ServletContext :
上下文对象,提供了一系列方法提供Servlet 与 Web容器交互
创建时期
ServletConfig :
在容器初始化Servlet的时候,并为其提供上下文初始化参数的名/值对的引用。
ServletContext :
容器启动的时候,并为其提供Servlet初始化参数的名/值对的引用。
作用范围
ServletContext :
每个JVM中每个Web应用一个ServletContext。
ServletConfig :
每个JVM中每个Web应用的每个Servlet一个ServletConfig。
二、ServletConfig 和 SerlvetContext 代码表示
ServletConfig
ServletConfig 位于javax.servlet
包内, ServletConfig 是一个接口,servlet容器用于在初始化期间将信息传递给servlet的servlet配置对象。
ServletConfig : 用于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"> <!-- 第一个Servlet ServletConfig --> <servlet> <servlet-name>BasicSerlvet</servlet-name> <servlet-class>com.app.servlet.BasicServletConfig</servlet-class> <init-param> <param-name>name1</param-name> <param-value>value1</param-value> </init-param> <init-param> <param-name>name2</param-name> <param-value>value2</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>BasicSerlvet</servlet-name> <url-pattern>/basic</url-pattern> </servlet-mapping> </web-app>
通过访问/basic 这个url,然后拿到servlet-name ,用这个servlet-name 与上面的servlet-name 配置进行匹配,匹配得到servlet-class 的全路径名称即是这个Servlet的地址
使用Java代码如何获取上面的配置信息?先从基本的示例入手,搭建一个Servlet,配置tomcat 并启动起来
Idea 搭建配置Servlet
https://blog.csdn.net/yhao2014/article/details/45740111
public class BasicServletConfig extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 通过getServletConfig 得到 ServletConfig 对象, // 这个getServletConfig 是 GenericServlet中的方法 // 通过查看HttpServlet 可知,HttpServlet 继承于GenericServlet // GenericServlet 实现了Servlet 接口,同时也实现了ServletConfig 接口 ServletConfig servletConfig = getServletConfig(); // -- 获取当前Servlet 中的web.xml 的内容 -- // 获取<servlet-name> 属性 String servletName = servletConfig.getServletName(); System.out.println("当前Servlet 在web.xml中配置的名称:"+ servletName); // String name = servletConfig.getInitParameter("name1"); // System.out.println("name = " + name); // 获取初始化参数,也就是<init-param> // 通过servletConfig.getInitParameterNames() 获取<param-name> Enumeration<String> enumration = servletConfig.getInitParameterNames(); while (enumration.hasMoreElements()){ String element = enumration.nextElement(); String name = servletConfig.getInitParameter(element); System.out.println("name = " + name); } ServletContext context = servletConfig.getServletContext(); System.out.println("context = " + context); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }
也就是说,ServletConfig 其实就是一系列的Serlvet 配置。通过GenericServlet 中的getServletConfig() 能够获取到web.xml中的配置文件。
启动应用程序,访问 http://localhost:8080/basic ,可以看到控制台输出
当前Servlet 在web.xml中配置的名称:BasicSerlvet
name = value2
name = value1
context = org.apache.catalina.core.ApplicationContextFacade@270c1d43
ServletContext
描述完ServletConfig ,下面就来聊一聊ServletContext
,一看后面的Context 就知道这应该是一个Servlet 的上下文环境,其实就是这样。
ServletContext 位于 javax.servlet 包内,是一个接口 ,定义servlet用于与其servlet容器通信的一组方法,例如,获取文件的MIME类型,分派请求或写入日志文件。servletContext对象包含在ServletConfig对象中,Web服务器在初始化servlet时提供servlet。
public interface ServletConfig { String getServletName(); // 获取ServletContext 上下文环境 ServletContext getServletContext(); String getInitParameter(String var1); Enumeration<String> getInitParameterNames(); }
ServletContext 用于XML 配置文件中
<context-param> <param-name>encode</param-name> <param-value>utf-8</param-value> </context-param>
其实也就表示的是ServletContext 的上下文环境
Java 代码表示:
首先建立一个BasicServletContext 类
public class BasicServletContext extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 通过getServletContext 获取ServletContext 的上下文环境对象 // getServletContext() 其实是ServletConfig 中的方法 ServletContext servletContext = getServletContext(); // ServletContext 的作用范围是整个Web应用,也就是说,你在这个Servlet中设置的值 // 在其他Servlet中也能够获取到。 servletContext.setAttribute("name1","value1"); // 获取web.xml中定义的属性 <param-name> String encode = (String)servletContext.getInitParameter("encode"); System.out.println("encode = " + encode); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }
在web.xml
添加一个BasicServletContext 的地址
<servlet-mapping> <servlet-name>BasicContext</servlet-name> <url-pattern>/context</url-pattern> </servlet-mapping>
运行tomcat,访问 http://localhost:8080/context ,可以看到控制台输出
encode = utf-8
再建立一个 BasicServletContext2 ,用于获取BasicServletContext 中设置的值
public class BasicServletContext2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = getServletContext(); // 接收由BasicServletContext 设置的 attribute 参数 String name = (String) servletContext.getAttribute("name1"); System.out.println("name = " + name); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }
web.xml
添加一个对BasicServletContext2的地址,完整的配置如下
<?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"> <!-- 第一个Servlet ServletConfig --> <servlet> <servlet-name>BasicSerlvet</servlet-name> <servlet-class>com.app.servlet.BasicServletConfig</servlet-class> <init-param> <param-name>name1</param-name> <param-value>value1</param-value> </init-param> <init-param> <param-name>name2</param-name> <param-value>value2</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>BasicSerlvet</servlet-name> <url-pattern>/basic</url-pattern> </servlet-mapping> <!-- 第二个Servlet ServletConfig --> <servlet> <servlet-name>BasicContext</servlet-name> <servlet-class>com.app.servlet.BasicServletContext</servlet-class> </servlet> <servlet-mapping> <servlet-name>BasicContext</servlet-name> <url-pattern>/context</url-pattern> </servlet-mapping> <!-- 第三个Servlet ServletConfig--> <servlet> <servlet-name>BasicContext2</servlet-name> <servlet-class>com.app.servlet.BasicServletContext2</servlet-class> </servlet> <servlet-mapping> <servlet-name>BasicContext2</servlet-name> <url-pattern>/context2</url-pattern> </servlet-mapping> <context-param> <param-name>encode</param-name> <param-value>utf-8</param-value> </context-param> </web-app>
运行tomcat, 访问http://localhost:8080/context2 ,发现控制台输出
name = value1
也就是说,BasicServletContext2 获取到了 BasicServletContext 设置的attribute 的值
关于ServletContext 中的方法还有很多,这里就不再详细介绍了,有兴趣的读者可以自行搜索。