有关servlet中init和构造函数

[/code]1>servlet的生命周期由容器管理。当Servlet被调用时,Servlet容器将会调用该Servlet的默认构造函数(default constructor),然后建立一个Servlet实体,那么能不能自己写构造函数呢
Can we use the constructor, instead of init(), to initialize servlet?

- Yes , of course you can use the constructor instead of init(). There’s nothing to stop you. But you shouldn’t. The original reason for init() was that ancient versions of Java couldn’t dynamically invoke constructors with arguments, so there was no way to give the constructur a ServletConfig. That no longer applies, but servlet containers still will only call your no-arg constructor. So you won’t have access to a ServletConfig or ServletContext.
这里说由于旧版本的java不支持调用带参数的构造,所以一般的实现都是只调用无参的,但我认为不一定就是为了保持前兼容,带参数的构造都是开发者自己写的,容器如何判断该用怎样的值来赋值来调用,除非再搞个规范,或者强制使用注解,这样又无法向前兼容了,所以调用无参的构造去实例化应该是个准则吧,不管目的是什么,事实只有一个,容器实例化servlet的时候只会调用无参的构造函数

2>容器实例化servlet的时候只会调用无参的构造函数
据此自己编写不带参数的构造函数,实验结果显示可以的!
[code="java"]
public void init(ServletConfig config) throws ServletException
{
System.out.println("初始化初始化init");
}
public ViewMessageServlet()
{
System.out.println("构造构造constructor");
}

控制台信息
构造构造constructor
初始化初始化init

3>同时可以知道,servlet实例化是先调用构造函数(无论是默认还是自己编写),然后再进行初始化的,这个过程很容易理解,没有构造一个实例怎么调用它的init呢!

4>再次试验还发现,一个servlet实例化之后,在服务器关闭或者手动调用destroy,或者超时(这个时间可以设置)前,servlet是不会调用destroy,所以一般多次访问servlet这个过程,init和构造函数只调用一次,本人开始在构造函数里面创建连接数据库,在另一个方法里又关闭了,这样容易使得后来的数据库操作出错。目前解决方法是:写一openConnection方法,执行数据库操作的每个方法开始判断servlet成员connection是否关闭(isclosed)是则调用openConnection方法,或者直接在openC*方法里判断是否连接是否关闭
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值