1. 程式人生 > >javaweb基礎第十四課:ServletConfig介面

javaweb基礎第十四課:ServletConfig介面

  這節課我們來講ServletConfig介面

 

  在講ServletConfig之前我們先來說下Servlet,來看看HttpServlet類

public abstract class HttpServlet extends GenericServlet

  可以看到,HttpServlet類是繼承自GenericServlet類

 

  再來看看GenericServlet類

public abstract class GenericServlet implements Servlet, ServletConfig
, Serializable

  我們發現了一個很神奇的事情,那就是GenericServlet實現了ServletConfig介面,也就是說GenericServlet物件本身就是一個ServletConfig物件,然後,HttpServlet又繼承了GenericServlet,我們自定義的Servlet又繼承了HttpServlet,所以,我們自定義的Servlet其實也是一個ServletConfig

 

  那麼,ServletConfig到底是什麼呢?

public interface ServletConfig {

    

    
//獲取servlet名稱,就是在web.xml裡配置的servlet-name     String getServletName();     //獲取ServletContext物件     ServletContext getServletContext();     //獲取初始化引數,就是在web.xml的servlet標籤裡的init-param子標籤的內容     String getInitParameter(String name)
;     //獲取初始化引數的引數名的集合     Enumeration<String> getInitParameterNames(); }

 

如何獲取Servlet對應的ServletConfig呢?

先來看看Servlet介面

public interface Servlet {

    void init(ServletConfig var1) throws ServletException;



//獲取該servlet對應的ServletConfig物件

    ServletConfig getServletConfig();



    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;



    String getServletInfo();



    void destroy();

}

所以,servlet只需要呼叫自身的getServletConfig()方法就可以獲取到ServletConfig物件

 

package com.servlet;



import javax.servlet.ServletConfig;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.util.Enumeration;



/**

 * 用於講解ServletConfif介面的Servlet類

 */

public class ServletConfigTeachServlet extends HttpServlet {



    /*

        web.xml中的配置

    <servlet>

        <servlet-name>ServletConfigTeachServlet</servlet-name>

        <servlet-class>com.servlet.ServletConfigTeachServlet</servlet-class>

        <init-param>

            <param-name>name</param-name>

            <param-value>xiaoye</param-value>

        </init-param>

        <init-param>

            <param-name>age</param-name>

            <param-value>20</param-value>

        </init-param>

    </servlet>



    <servlet-mapping>

        <servlet-name>ServletConfigTeachServlet</servlet-name>

        <url-pattern>/servletConfig</url-pattern>

    </servlet-mapping>

     */

    

    @Override

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("ServletConfigTeachServlet起作用啦");

        ServletConfig servletConfig = this.getServletConfig();



        String servletName = servletConfig.getServletName();

        System.out.println("servlet-name: " + servletName);

        // servlet-name: ServletConfigTeachServlet



        Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();

        while (initParameterNames.hasMoreElements())

        {

            String paramName = initParameterNames.nextElement();

            String paramValue = servletConfig.getInitParameter(paramName);

            System.out.println("init-param: " + paramName + " -> " + paramValue);

        }

        /*

           init-param: name -> xiaoye

           init-param: age -> 20

         */



        //這個就演示下,下節課講ServletContext物件

        ServletContext servletContext = servletConfig.getServletContext();



    }

}

 

 

<!--

    這裡有個問題,ServletConfigTeachServlet和LifeCycleTeachServlet都可以匹配到/servletConfig請求

    那麼,請問當/servletConfig請求到來時,誰起作用?

    A. 只有ServletConfigTeachServlet起作用

    B. 只有LifeCycleTeachServlet起作用

    C. LifeCycleTeachServlet先起作用,ServletConfigTeachServlet後起作用

    D. ServletConfigTeachServlet先起作用,LifeCycleTeachServlet後起作用



    大家猜一下

    OK,驗證下

    答案是A

    大家可能會奇怪,為什麼答案是A啊,“LifeCycleTeachServlet起作用啦”也輸出了啊

    因為,請求路徑是: "http://localhost:8080/favicon.ico",並不是/servletConfig請求



    結論:

        一個請求只可能被分發給一個Servlet,匹配規則: 具體優先於模糊,/servletConfig肯定比/具體吧



    來試下其他請求,比如/123

    LifeCycleTeachServlet起作用啦

    請求過來啦

    請求路徑是: "http://localhost:8080/123"

    LifeCycleTeachServlet起作用啦

    請求過來啦

    請求路徑是: "http://localhost:8080/favicon.ico"



-->