javaweb基礎第十四課:ServletConfig介面
阿新 • • 發佈:2018-12-31
這節課我們來講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" -->