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*方法里判斷是否連接是否關閉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM