1. 程式人生 > 其它 >06-javax.servlet.ServletConfig介面

06-javax.servlet.ServletConfig介面

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物件的方法,程式碼如上。結果如下