Web學習日記_12:GenericServlet

1,GenericServlet概述
GenericServlet是Servlet接口的實現類,我們可以通過繼承GenericServlet來編寫自己的Servlet。
下面是GenericServlet類的源代碼:GenericServlet.java

public abstract class GenericServlet implements Servlet, ServletConfig,
        java.io.Serializable {
    private static final long serialVersionUID = 1L;
    private transient ServletConfig config;
    public GenericServlet() {}
    @Override
    public void destroy() {}
    @Override
    public String getInitParameter(String name) {
        return getServletConfig().getInitParameter(name);
    }
    @Override
    public Enumeration<String> getInitParameterNames() {
        return getServletConfig().getInitParameterNames();
    }
    @Override
    public ServletConfig getServletConfig() {
        return config;
    }
    @Override
    public ServletContext getServletContext() {
        return getServletConfig().getServletContext();
    }
    @Override
    public String getServletInfo() {
        return "";
    }
    @Override
	
	/*
	實現了Servlet的init(ServletConfig)方法,把參數config賦給了
        本類的成員config,然後再調用本類自己的無參的init()方法。
	*/
    public void init (ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }
	/*
	這個方法是GenericServlet自己的方法,而不是從Servlet繼承下來的。當我們
    自定義Servlet時,如果想完成初始化作用就不要再重複init(ServletConfig)方
    法了,而是應該去重寫init()方法。因爲在GenericServlet中的init(ServletConfig)
    方法中保存了ServletConfig對象,如果覆蓋了保存ServletConfig的代碼,那麼就不
    能再使用ServletConfig了。
	*/
    public void init () throws ServletException {}
    public void log(String msg) {
        getServletContext().log(getServletName() + ": " + msg);
    }
    public void log(String message, Throwable t) {
        getServletContext().log(getServletName() + ": " + message, t);
    }
    @Override
    public abstract void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException;
    @Override
    public String getServletName() {
        return config.getServletName();
    }
}

2 GenericServlet的init()方法
     在GenericServlet中,定義了一個ServletConfig config實例變量,並在init(ServletConfig)方法中把參數ServletConfig賦給了實例變量。然後在該類的很多方法中使用了實例變量config。  如果子類覆蓋了GenericServlet的init(StringConfig)方法this.config=config這一條語句就 會被覆蓋了,也就是說GenericServlet的實例變量config的值爲null,那麼所有依賴config的方法都不能使 用了。如果真的希望完成一些初始化操作,那麼去覆蓋GenericServlet提供的init()方法,它是沒有參數 的init()方法,它會init(ServletConfig)方法中被調用。 
3 實現了ServletConfig接口
GenericServlet還實現了ServletConfig接口,所以可以直接調用getInitParameter()、getServletContext()等ServletConfig的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章