06-javax.servlet.ServletConfig介面
阿新 • • 發佈:2021-08-06
javax.servlet.ServletConfig介面: 1、這是一個介面,是由Apache Tomcat伺服器實現的Servlet規範之一, Tomcat專門寫了一個ServletConfig介面的實現類,其完整的類名為: org.apache.catalina.core.StandardWrapperFacade。 而javax.servlet.Servlet也是一個介面,而我們就是實現該介面的人員。 這裡主要的重點:--明白大家都是面向介面開發,面向介面呼叫的思想。 理解: 面向介面開發,就是實現介面,實現裡面的方法,介面中的方法是公開的,固定的; 面向介面呼叫,不管你是怎麼寫裡面的程式碼,有什麼方法我只需要知道介面的就行了, 而且我都可以用介面型別定義的引用呼叫,因為介面是父類,無論有多少個實現類該引用去調都編譯通過, 都可以呼叫,但執行時呼叫的具體方法由該引用具體的例項化的實現類物件決定。 2、javaweb程式設計師程式設計,面向ServletConfig介面完成呼叫,不需要關係實現類。 不同的webapp放到不同的Web容器所實現的類的類名是不同的,這裡放進的是Tomcat伺服器。 3、Tomcat伺服器就是一個實現了Servlet規範和JSP規範的容器 4、ServletConfig介面中由哪些方法? --String getInitParameter(String name) 該方法表示通過名字name這個key來獲取初始化引數value,ServletConfig物件儲存的是web.xml檔案中的, 所以獲取的是該檔案中初始化引數標籤的value位置的值,具體獲取如下測試 --Enumeration getInitParameterNames() 該方法是獲取所有初始化引數的name,獲取key,返回的是一個集合,測試如下 --ServletContext getServletContext() 該方法是獲取一個ServletContext物件(Servlet物件的上下文),具體分析下章節 --String getServletName() 該方法是獲取xml檔案中<servlet-name>標籤中的值,一般沒啥用,測試如下 5、ServletConfig的作用 從字面以上上理解,ServletConfig就是一個Servlet物件的配置資訊物件, 該物件裡面封裝的是Servlet物件的配置資訊。 而Servlet物件的配置資訊是放到web.xml檔案中的,我們知道該檔案中有個<servlet></servlet>標籤, 每一個這種標籤裡的資訊都被封裝到ServletConfig物件裡面了,就像下面的測試一樣, xml檔案中有兩個servlet標籤,Tomcat生成了兩個資訊配置物件來封裝。 servlet標籤的數量對應ServletConfig物件的數量。 當我們重新整理瀏覽器,點選不同連線,這兩個資訊配置物件的輸出都沒動,原因是init方法只執行一次。 6、業務中可能需要資訊配置物件或者如果我們希望在service方法中用ServletConfig物件。 可以在類中定義一個私有的ServletConfig型別的變數config, 然後在init方法中將接收的資訊配置物件傳進去。 --這樣Servlet介面中返回ServletConfig型別物件的公開的方法getServletConfig() 就將其返回值設定為config,該方法的作用是為了如果以後這個實現類有子類, 子類可以通過該方法獲取其ServletConfig物件。
我們在實現Servlet介面的時候,其中的init方法需要傳入一個ServletConfig型別的物件引數,由於該方法是Web容器啟動,該物件由容器提供,由該容器實現servlet規範中的ServletConfig介面,下面我們實現把引數輸出一下。
建立web專案模組b-ServletConfig,配置號相應環境,編寫兩個Servlet實現類AServlet和BServlet,
兩個實現類中的initial方法中這樣寫,其他方法先不寫
@Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("AServlet's ServletConfig = "+servletConfig.toString()); //AServlet's ServletConfig = org.apache.catalina.core.StandardWrapperFacade@56238272 }
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("BServlet's ServletConfig = "+servletConfig.toString());
//BServlet's ServletConfig = org.apache.catalina.core.StandardWrapperFacade@47eaa5bb
}
寫一個index.html,裡面分別是請求這兩個實現類物件的超連結,啟動Tomcat,分別點選兩個連線輸出如下:
AServlet's ServletConfig = org.apache.catalina.core.StandardWrapperFacade@56238272
BServlet's ServletConfig = org.apache.catalina.core.StandardWrapperFacade@47eaa5bb
將init方法中的區域性變數賦值給一個Servlet實現類的私有ServletConfig型別的成員變數,利用該變數測試ServletConfig介面中每個方法的作用,這裡先在AServlet的servlet標籤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物件-->
<servlet>
<servlet-name>AServlet</servlet-name>
<servlet-class>com.servlet.servletconfig.Aservlet</servlet-class>
<!--初始化引數:被封裝到ServletConfig物件中-->
<init-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mysqlstudy?useSSH=false</param-value>
</init-param>
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>???</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
<!--第二個Servlet物件-->
<servlet>
<servlet-name>BServlet</servlet-name>
<servlet-class>com.servlet.servletconfig.Bservlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BServlet</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
</web-app>
然後AServlet類的service方法中測試 String getInitParameter(String name)方法,service方法中程式碼如下
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//更改輸出格式型別
servletResponse.setContentType("text/html;charset=UTF-8");
//更改輸出位置
PrintWriter out = servletResponse.getWriter();
//獲取ServletConfig物件
ServletConfig config = getServletConfig();
//通過初始化引數的name獲取value
String driver = config.getInitParameter("driver");
String url = config.getInitParameter("url");
String user = config.getInitParameter("user");
String password = config.getInitParameter("password");
out.print("driver="+driver);
out.print("<br>");
out.print("url="+url);
out.print("<br>");
out.print("user="+user);
out.print("<br>");
out.print("password="+password);
}
點選執行Tomcat部署專案,輸入請求顯示結果如下
開始測試 Enumeration getInitParameterNames()方法,程式碼如下
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//更改輸出格式型別
servletResponse.setContentType("text/html;charset=UTF-8");
//更改輸出位置
PrintWriter out = servletResponse.getWriter();
//獲取ServletConfig物件
ServletConfig config = getServletConfig();
//通過初始化引數的name獲取value
// String driver = config.getInitParameter("driver");
// String url = config.getInitParameter("url");
// String user = config.getInitParameter("user");
// String password = config.getInitParameter("password");
// out.print("driver="+driver);
// out.print("<br>");
// out.print("url="+url);
// out.print("<br>");
// out.print("user="+user);
// out.print("<br>");
// out.print("password="+password);
//獲取初始化引數的name
Enumeration<String> names = config.getInitParameterNames();
//遍歷該集合,並通過name呼叫獲取value,雖然該集合物件的遍歷方法名字不一樣,但底層還是一樣的
while (names.hasMoreElements()){
String name = names.nextElement();
String value = config.getInitParameter(name);
out.print(name+" = "+value);
out.print("<br>");
}
}
結果如下,可以知道存進集合中初始化引數name的順序是隨機的
開始測試沒啥卵用的String getServletName()方法,這裡只貼出程式碼,
//獲取Servlet Name
String servletName = config.getServletName();
out.print("<servlet-name>"+servletName+"</servlet-name>");//AServlet
//獲取Servlet上下文的方法
ServletContext application = config.getServletContext();
out.print(application);//org.apache.catalina.core.ApplicationContextFacade@6b2c87d6
最後一個獲取ServletContext物件的方法,程式碼如上。結果如下