歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Servlet原理與生命周期

Servlet原理與生命周期

日期:2017/3/1 9:53:18   编辑:Linux編程

Servlet何時被實例化?何時又被銷毀?

·加載: 默認情況下,如果沒有在web.xml中配置自動裝入(load-on-startup),那麼當客戶端第一次請求Servlet時,web服務器
才對Servlet類加載到內存並進行實例化,如果配置了自動裝入,那麼在tomcat啟動時就進行加載實例化。(一個周期內
只實例化一次,即服務器裡只有一個該Servlet類的實例化對象)

·初始化:Servlet被實例化後接著就會調用從父類繼承來的初始化方法init()對Servlet類進行初始化。(初始化一次)
·服務:初始化之後就是等待被調用 service()方法(能夠多次被調用)
|-為什麼調用的是service方法,那寫doGet doPost有啥用?
可以這麼認為:service方法會自動區分調用哪個doXxx方法。所以一般不會覆寫service
方法。 (覆寫了沒有自己實現區分調用哪個doXxx方法的話,那些doGet這些就沒用了)
|-服務器裡只有一個對象,那麼怎麼解決多個請求?排隊等待?
Servlet中采用的是多線程的處理方式,在tomcat內部有一個線程池,提前准備了若干線程,每一個請求分配一個線
程來處理,但注意每個線程訪問的是同一個Servlet對象。
·銷毀:銷毀正常也只有一次,web服務器關閉時會調用destroy()方法自動銷毀,如果長時間不使用也會被自動銷毀。

為什麼修改了Servlet,編譯並覆蓋了硬盤上的class文件,但是訪問還是原來那個?
Tomcat啟動後在加載階段Servlet類加載到內存中,當這個Servlet沒有被銷毀時一直存在內存的,以後的請求都直接從內存中取得,所以修改完Servlet後,單單覆蓋硬盤上的類是不行的,要麼重啟服務器,要麼修改web.xml(如果tomcat發現某一個工程的web.xml有改變,tomcat會將這個工程所有東西重新部署)

Servlet裡取得其他常用對象及使用

1.request和 response 在doGet doPost方法中已經自動傳進來了,直接使用
|- request response的編碼設置
request.setCharacterEncoding("UTF-8");//設定接收請求內容的編碼,UTF-8支持中文
response.setCharacterEncoding("UTF-8");//設定返回內容的編碼,UTF-8支持中文
response.setContentType("text/html");//指定返回的內容是文本以及html格式
|-頁面跳轉
response.sendRedirect("index.html");


2.session(在服務器內存中寫入一個變量)
HttpSessionsession=request.getSession();//在服務器內存中為當前浏覽器開辟一個空間
//如果浏覽器關閉,那麼session會被注銷
session.setAttribute("username",”surong”);//往服務器內存中寫入一個變量
String a=(String)session.getAttribute("username");//在服務器內存中查找username變量
session.removeAttribute("username");//刪除內存中的username變量
session.invalidate();//直接將當前浏覽器的session銷毀
3.out.println輸出頁面內容


response.setCharacterEncoding("UTF-8");//設定返回內容的編碼,UTF-8支持中文
response.setContentType("text/html");//指定返回的內容是文本以及html格式
PrintWriter out = response.getWriter(); //獲取一個輸出流
out.println("<HTML>\n"+
"<HEAD><TITLE>Hello</TITLE></HEAD>\n"+
"<BODYBGCOLOR=\"#FDF5E6\">\n" +
"<H1>Hello,"+username+",你的密碼是: "+password+"</H1>\n" +
"</BODY></HTML>");

Copyright © Linux教程網 All Rights Reserved