• 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*方法里判断是否连接是否关闭

  • 相关阅读:
    防御式编程
    Linux磁盘与文件系统管理
    更加抽象
    高质量的子程序
    Linux文件与目录管理
    抽象
    可以工作的类
    Linux的文件权限与目录配置
    条件、循环和其他语句
    软件构建中的设计
  • 原文地址:https://www.cnblogs.com/zhyn-BeHard/p/7016098.html
Copyright © 2020-2023  润新知