Servlet笔记——(2.2.2)继承GenericServlet

本文详细介绍了GenericServlet类作为Servlet接口的实现方式,展示了如何通过继承GenericServlet来自定义Servlet。重点讲解了init(ServletConfig)和init()方法的区别及使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GenericServlet类是Servlet接口的实现类,我们也可以通过继承GenericServlet来编写自己的Servlet。下面是GenericServlet类的源代码:

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();
    }

/*无参的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() {
        returnconfig.getServletName();
   }
}

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

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值