Java Servlet(三):Servlet中ServletConfig对象和ServletContext对象
本文將記錄ServletConfig/ServletContext中提供了哪些方法,及方法的用法。
ServletConfig是一個抽象接口,它是由Servlet容器使用,在一個servlet對象初始化時,Servlet容器傳遞信息給正在初始化的servlet對象。
public abstract interface javax.servlet.ServletConfig {public abstract java.lang.String getServletName();public abstract javax.servlet.ServletContext getServletContext();public abstract java.lang.String getInitParameter(java.lang.String arg0);public abstract java.util.Enumeration getInitParameterNames(); }- getServletName()方法:
用來返回當前servlet在web.xml注冊的servlet-name;
- getServletContext()方法:
獲取servlet上下文信息。
- getInitParameter(String arg0)方法:
根據一個指定的參數名稱,獲取在servlet初始化時傳遞的參數值,而這樣的參數信息往往配置在web.xml。
- getInitParameters()方法:
返回servlet初始化時,傳遞進來的所有參數名稱集合。
為了能了解到ServletConfig相關的使用,我們需要在之前新建的MyServlet001工程中,修改web.xml,在<servlet>節點中添加<init-param>節點:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 5 id="WebApp_ID" version="3.0"> 6 7 <!-- 配置和映射 servlet --> 8 <servlet> 9 <!-- Servlet注冊的名字 --> 10 <servlet-name>helloServlet</servlet-name> 11 <!-- Servlet全類名 --> 12 <servlet-class>com.dx.hello.HelloServlet</servlet-class> 13 14 <!-- 配置Servlet的初始化參數。且節點必須在 load-on-startup節點的前邊 --> 15 <init-param> 16 <param-name>username</param-name> 17 <param-value>user001</param-value> 18 </init-param> 19 <init-param> 20 <param-name>password</param-name> 21 <param-value>123456</param-value> 22 </init-param> 23 24 <!-- 指定servlet被初始化的時機 --> 25 <load-on-startup>-1</load-on-startup> 26 </servlet> 27 <servlet-mapping> 28 <!-- 對應servlet節點下的servlet-name的注冊名字一致 --> 29 <servlet-name>helloServlet</servlet-name> 30 <!-- 映射具體的訪問路徑,其中/代表當前web的根目錄 --> 31 <url-pattern>/hello</url-pattern> 32 </servlet-mapping> 33 34 </web-app>在配置參數時,需要注意事項:
<load-on-startup>節點必須在<init-param>節點的下邊,否則會拋出異常信息,配置不通過。
之后再HelloServlet的init方法中,添加代碼:
1 public void init(ServletConfig config) throws ServletException { 2 System.out.println("init"); 3 4 // 根據ServletConfig的getInitParameter()方法,根據特定初始化參數名稱,獲取對應的初始化參數值。 5 String username = config.getInitParameter("username"); 6 String password = config.getInitParameter("password"); 7 System.out.println("username:" + username); 8 System.out.println("password:" + password); 9 10 // 根據ServletConfig的getInitParameterNames()方法,獲取初始化參數信息。 11 Enumeration<String> names = config.getInitParameterNames(); 12 while (names.hasMoreElements()) { 13 String name = names.nextElement(); 14 String value = config.getInitParameter(name); 15 System.out.println(name + ":" + value); 16 } 17 18 // 獲取Servlet名稱。 19 String servletName = config.getServletName(); 20 System.out.println(servletName); 21 22 ServletContext servletContext = config.getServletContext(); 23 }重新啟動tomcat,并在瀏覽器中輸入地址:http://localhost:8080/MyServlet001/hello,回車,之后查看tomcat服務器輸出信息:
INFO: Server startup in 1262 ms HelloServlet constructor init username:user001 password:123456 username:user001 password:123456 helloServlet service從上邊的輸出信息,及代碼中,就可以理解,getInitParameter(),getInitParameters(),getServletName()的用法。
ServletContext servletContext=config.getServletContext();
這個ServletContext是怎么解釋,有什么用處呢?
我們查看官網對ServletContext的介紹:
public interface?ServletContextDefines a set of methods that a servlet uses to communicate with its servlet container, for example, to get the MIME type of a file, dispatch requests, or write to a log file.
There is one context per "web application" per Java Virtual Machine. (A "web application" is a collection of servlets and content installed under a specific subset of the server's URL namespace such as?/catalog?and possibly installed via a?.war?file.)
In the case of a web application marked "distributed" in its deployment descriptor, there will be one context instance for each virtual machine. In this situation, the context cannot be used as a location to share global information (because the information won't be truly global). Use an external resource like a database instead.
The?ServletContext?object is contained within the?ServletConfig?object, which the Web server provides the servlet when the servlet is initialized.
ServletContext接口:
1、Servlet引擎為每個web應用程序都創建了一個對應的ServletContext對象,ServletContext對象被包含在ServletConfig對象中,調用ServletConfig.getServletContext()方法就可以返回ServletContext對象的引用。
2、由于一個web應用程序中的所有Servlet都共享一個ServletContext對象,所以ServletContext對象被稱之為application對象(web應用程序對象)。
3、功能:
? ? ?獲取web應用程序的初始化參數;
? ? ?記錄日志;
? ? ?application域范圍的屬性;
? ? ?訪問資源文件;
? ? ?獲取虛擬路徑所映射的本地路徑;?
? ? ?web應用程序之間的訪問;
? ? ?ServletContext的其他方法。
- ? ? ?獲取web應用程序的初始化參數;
首先,需要在web.xml中配置應用程序級別(<context-param>)的參數信息;
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 5 id="WebApp_ID" version="3.0"> 6 7 <!-- 配置當前web應用的初始化參數 --> 8 <context-param> 9 <param-name>driver</param-name> 10 <param-value>com.mysql.jdbc.Driver</param-value> 11 </context-param> 12 <context-param> 13 <param-name>jdbcUrl</param-name> 14 <param-value>jdbc:mysql://test</param-value> 15 </context-param> 16 17 <!-- 配置和映射 servlet --> 18 <servlet> 19 <!-- Servlet注冊的名字 --> 20 <servlet-name>helloServlet</servlet-name> 21 <!-- Servlet全類名 --> 22 <servlet-class>com.dx.hello.HelloServlet</servlet-class> 23 24 <!-- 配置Servlet的初始化參數。且節點必須在 load-on-startup節點的前邊 --> 25 <init-param> 26 <param-name>username</param-name> 27 <param-value>user001</param-value> 28 </init-param> 29 <init-param> 30 <param-name>password</param-name> 31 <param-value>123456</param-value> 32 </init-param> 33 34 <!-- 指定servlet被初始化的時機 --> 35 <load-on-startup>-1</load-on-startup> 36 </servlet> 37 <servlet-mapping> 38 <!-- 對應servlet節點下的servlet-name的注冊名字一致 --> 39 <servlet-name>helloServlet</servlet-name> 40 <!-- 映射具體的訪問路徑,其中/代表當前web的根目錄 --> 41 <url-pattern>/hello</url-pattern> 42 </servlet-mapping> 43 44 </web-app>注意:
這里的context-param是應用程級別的初始化參數,<servlet>節點下的<init-param>屬于servlet局部的初始化參數,他們具有作用域范圍不同。
然后,使用:
1 public void init(ServletConfig config) throws ServletException { 2 System.out.println("init"); 3 4 // 根據ServletConfig的getInitParameter()方法,根據特定初始化參數名稱,獲取對應的初始化參數值。 5 String username = config.getInitParameter("username"); 6 String password = config.getInitParameter("password"); 7 System.out.println("username:" + username); 8 System.out.println("password:" + password); 9 10 // 根據ServletConfig的getInitParameterNames()方法,獲取初始化參數信息。 11 Enumeration<String> names = config.getInitParameterNames(); 12 while (names.hasMoreElements()) { 13 String name = names.nextElement(); 14 String value = config.getInitParameter(name); 15 System.out.println(name + ":" + value); 16 } 17 18 // 獲取Servlet名稱。 19 String servletName = config.getServletName(); 20 System.out.println(servletName); 21 22 // 使用getServletContext(),獲取ServletContext對象。 23 ServletContext servletContext = config.getServletContext(); 24 25 // ServletContext獲取初始化參數函數getInitParameter(String arg0) 26 String driver=servletContext.getInitParameter("driver"); 27 String jdbc=servletContext.getInitParameter("jdbc"); 28 System.out.println("driver:"+driver); 29 System.out.println("jdbc:"+jdbc); 30 31 // ServletContext獲取初始化參數集合函數getInitParameterNames() 32 Enumeration<String> names2= servletContext.getInitParameterNames(); 33 while (names2.hasMoreElements()) { 34 String name = names2.nextElement(); 35 String value = servletContext.getInitParameter(name); 36 System.out.println(name + ":" + value); 37 } 38 }查看輸出信息:
HelloServlet constructor init username:user001 password:123456 username:user001 password:123456 helloServlet driver:com.mysql.jdbc.Driver jdbcUrl:jdbc:mysql://test driver:com.mysql.jdbc.Driver jdbcUrl:jdbc:mysql://test service- ? ? ?訪問資源文件(獲取當前web應用的某一個文件對應的輸入流。);
?
- ? ? ?獲取當前web應用的某一個文件,在服務器上的一個絕對路徑
?
- ? ? ?獲取web當前應用的名稱;
?
總結
以上是生活随笔為你收集整理的Java Servlet(三):Servlet中ServletConfig对象和ServletContext对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: window下在同一台机器上安装多个版本
- 下一篇: 细说Http协议