咱們都知道Servlet是框架的靈魂,學習web框架最底層離不開Servlet的支持,那麼Servlet 是什麼呢?如何建立一個Servlet 不是本文的重點,相關文章能夠參考java
談談你對Servlet 的理解: https://blog.csdn.net/qq_39688352/article/details/76794973web
ServletConfig :
Servlet的配置對象,容器在初始化的時候經過它傳遞信息給Servletapache
ServletContext :
上下文對象,提供了一系列方法提供Servlet 與 Web容器交互tomcat
ServletConfig :
在容器初始化Servlet的時候,併爲其提供上下文初始化參數的名/值對的引用。服務器
ServletContext :
容器啓動的時候,併爲其提供Servlet初始化參數的名/值對的引用。app
ServletContext :
每一個JVM中每一個Web應用一個ServletContext。框架
ServletConfig :
每一個JVM中每一個Web應用的每一個Servlet一個ServletConfig。ide
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
描述完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