GenericServlet类的两个init方法理解

继承GenericServlet类的两个init方法理解

有参数的init方法
该方法是servlet的生命周期中调用初始化使用的,被tomcat调用

GenericServlet的init的源码是
public void init (ServletConfig config) throw ServletException {
//config获取配置信息的参数,在这里对配置信息初始化
this config;
init();
}
Void init()   //无参的init方法
{}

调用过程

Config封装了该servlet的一些配置信息,tomcat默认调用的是含参init方法,如果调用的是无参的init方法就会造成空指针异常(因为需要通过init给属性config赋值),然后可以调用getServletContext(),获取config的值;那么无参方法init的作用是方便对init的重写。
实际上GenericServlet继承于Servlet接口,而Servlet接口提供的初始化方法只有一个public void init(ServletConfig config),(Servlet接口才是最底层的接口实现),而init()是为了覆写的,默认的init(config)调用init(),还有就是对config赋值
补充:重写init(ServletConfig config),没有写super.init(config),在内部不会报错,但是由于没有设置config所以当servlet对象调用getServletConfig()时返回null,进而无法获取其他的配置信息。 解决方法就是在含参的init方法中调用super.init(config)

代码示例:
@WebServlet(
displayName = "UserServlet" , //描述
name = "text1", //servlet名称
urlPatterns = { "/ServletDemo1" }, //url
initParams = { @WebInitParam(name = "username", value = "张三") }
)//初始化参数
public class text1 extends GenericServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {
		super.init(config);  //关键代码,避免空指针发生
		System.out.print("init");
	}
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
response.getOutputStream().write("继承于GenericServlet!".getBytes());
System.out.println();
System.out.println(getServletConfig());//将config输出到控制台上
ServletConfig con=this.getServletConfig();
System.out.println(con.getServletName());//将服务器的名称输出到控制台上

运行情况如下
1… 在没有调用super. init(config)时
在这里插入图片描述
2. 调用super. init(config)时
在这里插入图片描述
根据上面的运行示例,也就很容易理解,当我们根据需要,需要重写init方法时,注意重写无参的init方法,我想这也是为了供开发者使用,而专门写了两个init的原因吧。
总结一下GenericServlet类继承并实现了那些方法:

GenericServlet是Servlet接口的实现类,但它是一个抽象类,它唯一的抽象方法就是service()方法
  GenericServlet实现了Servlet方法:
  * 实现了String getServletInfo()方法
  * 实现了void destory()方法,空实现
  * 实现了void init(ServletConfig)方法,用来保存ServletConfig参数
  * 实现了ServletConfig getServletConfig()方法

  GenericServlet实现了ServletConfig接口:
  * 实现了ServletContext getServletContext()方法
  * 实现了String getInitParameter()方法
  * 实现了String getServletName()方法
  * 实现了Enumeration getInitParameterNames()方法

  GenericServlet添加了init()方法:
  * 该方法会被init(ServletConfig)方法调用
  * 如果希望对Servlet进行初始化,那么应该覆盖init()方法,而不是init(ServletConfig)方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值