zl程序教程

您现在的位置是:首页 >  其它

当前栏目

GenericServlet介绍

介绍
2023-06-13 09:12:34 时间

一、GenericServlet概述

GenericServlet是Servlet接口的实现类,我们可以通过继承GenericServlet来编写自己的Servlet。

自己定义的增强Servlet实现类

public class BServlet implements Servlet {
	private ServletConfig config;	
	/*
	 * 需要就写,不需要就不写
	 */
	@Override
	public void destroy() {
		System.out.println("啊~我要死了!");
	}

	/*
	 * 请放心,这个方法一定会在init()方法之后被调用!
	 * init()被调用后,本类的成员this.config已经有值了!
	 */
	@Override
	public ServletConfig getServletConfig() {
		return this.config;
	}

	/*
	 * 没有用的东西,爱实现不实现
	 */
	@Override
	public String getServletInfo() {
		return "我是一个快乐的Servlet";
	}

	/*
	 * 由Tomcat来调用,并且只调用一次
	 * 它是这些方法中第一个被调用的,它会在构造器之后马上被调用!
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		// 把tomcat传递的Servletconfig赋值给本类的一个成员,其实就是把它保存起来,方便在其他方法中使用!
		this.config = config;
		init();
	}
	
	/*
	 * 这个方法是本类自己定义的!不是Servlet接口中的方法
	 */
	public void init() {
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException {
		/*
		 * 这里是否可以使用ServletConfig的成员呢?
		 */
		System.out.println("每次处理请求都会被调用!");
	}
	
	public ServletContext getServletContext() {
		return config.getServletContext();
	}
	
	public String getServletName() {
		return config.getServletName();
	}
	
	public String getInitParameter(String name) {
		return config.getInitParameter(name);
	}
}

下面是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 "";
    }
    /*
    实现了Servlet的init(ServletConfig)方法,把参数config赋给了本类的成员		config,然后再调用本类自己的无参的init()方法。
    */        
    @Override
    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();
    }
}

二 GenericServlet的init()方法

在GenericServlet中,定义了一个ServletConfig config实例变量,并在init(ServletConfig)方法中把参数ServletConfig赋给了实例变量。然后在该类的很多方法中使用了实例变量config。

如果子类覆盖了GenericServlet的init(StringConfig)方法,那么this.config=config这一条语句就会被覆盖了,也就是说GenericServlet的实例变量config的值为null,那么所有依赖config的方法都不能使用了。如果真的希望完成一些初始化操作,那么去覆盖GenericServlet提供的init()方法,它是没有参数的init()方法,它会在init(ServletConfig)方法中被调用。

三、实现了ServletConfig接口

GenericServlet还实现了ServletConfig接口,所以可以直接调用getInitParameter()、getServletContext()等ServletConfig的方法。