(五)GenericServlet

/**
 * <p>标题: GenericServlet</p>
 * <p>
 *    功能描述:为了简化Servlet的编写,在javax.servlet包中提供了一个抽象的类GenericServlet,
 *    它给出了除service()方法外的其他4个方法的简单实现。GenericServlet类定义了一个通用的、不依赖于具体协议的Servlet,
 *    它实现了Servlet接口和ServletConfig接口。
 *    如果我们要编写一个通用的Servlet,只需要从GenericServlet类继承,并实现其中的抽象方法service()。
 * </p>
 * <p>创建日期: 2016年1月18日 下午3:19:44</p>
 * <p>作者: 年华</p>
 * <p>版本: 1.0</p>
 */
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private static final String LSTRING_FILE = "javax.servlet.LocalStrings";
    private static ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.LocalStrings");
    private transient ServletConfig config;

    public void destroy() {
    }
    
    //返回名字为name的初始化参数的值,初始化参数在web.xml配置文件中进行配置。如果参数不存在,这个方法将返回null。背后由ServletConfig得来
    public String getInitParameter(String name) {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        }

        return sc.getInitParameter(name);
    }
    //返回Servlet所有初始化参数的名字的枚举集合。如果Servlet没有初始化参数,这个方法将返回一个空的枚举集合。背后由ServletConfig得来
    public Enumeration<String> getInitParameterNames() {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        }

        return sc.getInitParameterNames();
    }

    public ServletConfig getServletConfig() {
        return this.config;
    }
    
    //返回Servlet上下文对象的引用,背后由ServletConfig得来。
    public ServletContext getServletContext() {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        }

        return sc.getServletContext();
    }

    public String getServletInfo() {
        return "";
    }

    //此方法是Servlet接口中init()方法的实现。在这个方法中,首先将ServletConfig对象保存在一个transient实例变量中,然后调用第二个不带参数的init()方法。
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        init();
    }
    //通常我们在编写继承自GenericServlet的Servlet类时,只需要重写不带参数的init()方法就可以了。如果覆盖了第一个init()方法,那么应该在子类的该方法中,包含一句super.init(config)代码的调用。
    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);
    }

    public abstract void service(ServletRequest paramServletRequest, ServletResponse paramServletResponse) throws ServletException, IOException;

    public String getServletName() {
        ServletConfig sc = getServletConfig();
        if (sc == null) {
            throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
        }

        return sc.getServletName();
    }

}
posted @ 2016-01-18 15:41  姩澕  阅读(207)  评论(0编辑  收藏  举报