servlet的构造器与init方法


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的时候只会调用无参的构造函数
据此自己编写不带参数的构造函数,实验结果显示可以的!

1    public void init(ServletConfig config) throws ServletException
2    {
3            System.out.println("初始化初始化init");
4    }
5    public ViewMessageServlet()
6    {
7            System.out.println("构造构造constructor");
8    }

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

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

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

优质内容筛选与推荐>>
1、英文诗歌New Song Cafe吉他教学
2、免费申请基于飞腾硬件平台上的麒麟云试用!
3、直流电机基本系统模型
4、《大型网站技术架构》学习笔记-02架构篇
5、可任意自定义的UITableViewCell(转)


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn