一、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 的值
參考:
http://www.importnew.com/21506.html
https://jokerlinisty.iteye.com/blog/2194190