?? 0128.htm
字號:
<html>
<head>
<title>新時代軟件教程:操作系統 主頁制作 服務器 設計軟件 網絡技術 編程語言 文字編輯</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
<!--
body, table {font-size: 9pt; font-family: 宋體}
a {text-decoration:none}
a:hover {color: red;text-decoration:underline}
.1 {background-color: rgb(245,245,245)}
-->
</style>
</head>
<p align="center"><script src="../../1.js"></script></a>
<p align="center"><big><strong>Lifecycle 方法</strong></big></p>
<div align="right">---摘自互聯網</div>
<br>3.1 重編Init 初始化方法 <br>
<br>
在初始化過程中, servlet應當準備好它要安排的一些資源, 以便這個servlet 能夠接收請求,做到這些可以不用考慮多線程, 因為在servlet初始化是只能是單進程的。 一旦初始化方法完成, servlet就能接收客戶端的請求。 當然如果初始化不能成功,這個方法會扔出throw UnavailableException解釋的. <br>
<br>
初始化方法使用ServletConfig 對象作為參數. 這個方法應該保存這個對象, 以便它能有方法getServletConfig返回. 最簡單的辦法是,搞出一個新類,他的初始化方法數調用super.init. 如果確實這樣做, 你就應當自己保存ServletConfig 對象, 并且自己重編getServletConfig 方法以便它能從新的位置得到對象. <br>
<br>
下面是個初始化方法的例子. 它是來自Survey Servlet的初始化方法, 從一個表單接收輸入然后存儲到文件中,為了存儲survey信息, 它需要一個目錄. 它以初始化參數接收這個目錄. <br>
<br>
<br>
public void init(ServletConfig config)<br>
throws ServletException<br>
{<br>
super.init(config);<br>
<br>
//獲取目錄<br>
resultsDir = getInitParameter("resultsDir");<br>
<br>
//如果沒有目錄, 不處理客戶端<br>
if (resultsDir == null) {<br>
throw new UnavailableException (this,<br>
"Not given a directory to write survey results!");<br>
}<br>
}<br>
<br>
這里的初始化方法調用super.init 方法來管理安排ServletConfig對象. 這個初始化方法也設置了一個字段: resultsDir, 作為初始化參數提供的目錄名. 如果沒有目錄名被提供, 這個 servlet扔出一個不適用的解釋. 如果初始化 方法成功完成,servlet將能處理客戶端請求 <br>
<br>
初始化參數 <br>
<br>
初始化參數的規定是一個服務器方面的規定。如果初始化參數被規定, 都可以用同樣的方法得到: 用 getInitParameter方法. 這個方法將參數名作為自己的參數項. <br>
<br>
3.2 重編Destroy 方法 <br>
<br>
當服務器卸載一個servlet, 它將調用servlet的destroy方法. 這個 destroy方法是與初始化方法相反,同時從內存中釋放servlet. <br>
<br>
并不是所有的調用了初始化init方法是也必須調用destroy方法. <br>
<br>
對于大多數的servlets, 一些初始化的工作必須反做的. 如, 假設有一個servlet,它在初始化時打開一個數據庫連接,他的destroy 方法如下顯示:需要關閉這個連接的 <br>
<br>
<br>
/**<br>
* 關閉數據庫連接<br>
*/<br>
public void destroy() {<br>
try {<br>
con.close();<br>
} catch (SQLException e) {<br>
while(e != null) {<br>
log("SQLException: " + e.getSQLState() + '\t' +<br>
e.getMessage() + '\t' +<br>
e.getErrorCode() + '\t');<br>
e = e.getNextException();<br>
}<br>
} catch (Exception e) {<br>
e.printStackTrace();<br>
}<br>
}<br>
<br>
關于一個Servlet中斷涉及的多線程 <br>
<br>
但一個服務器卸載一個servlet, 它會在所有的service已經完成后調用 destroy. 如果你的操作運行需要很長時間, 但destroy 被調用時還有線程在運行. 這個servlet編寫者有責任確保所有的線程都已經完成; <br>
<br>
長時間運行響應客戶端請求的那些servlet應當保留當前有多少方法在運行的記錄. 他的 long-running 方法應當周期性地輪詢以確保他們能夠繼續運行下去. 如果servlet被destroy方法調用, 那么這個long-running 方法如果必要必須停止工作或清除. <br>
<br>
舉例, 變量serviceCounter用來統計有多少service方法在運行, 變量 shuttingDown顯示這個servlet是否被destory. 每個變量有它自己的獲取方法: <br>
<br>
<br>
public ShutdownExample extends HttpServlet {<br>
private int serviceCounter = 0;<br>
private Boolean shuttingDown;<br>
...<br>
// serviceCounter<br>
protected synchronized void enteringServiceMethod() {<br>
serviceCounter++;<br>
}<br>
protected synchronized void leavingServiceMethod() {<br>
serviceCounter--;<br>
}<br>
protected synchronized int numServices() {<br>
return serviceCounter;<br>
}<br>
//shuttingDown<br>
protected setShuttingDown(Boolean flag) {<br>
shuttingDown = flag;<br>
}<br>
protected Boolean isShuttingDown() {<br>
return shuttingDown;<br>
}<br>
}<br>
<br>
這個service方法每次在它進入時要增加,而在它返回退出時要減少: <br>
<br>
protected void service(HttpServletRequest req, HttpServletResponse resp)<br>
throws ServletException, IOException<br>
{<br>
enteringServiceMethod();<br>
try {<br>
super.service(req, resp);<br>
} finally {<br>
leavingServiceMethod();<br>
}<br>
}<br>
<br>
destroy方法應當檢查serviceCounter, 如果存在長時間方式運行的話, 設置變量shuttingDown . 這個變量將會讓那個正在處理請求的線程知道:該結束了,關閉吧! destroy 方法應當等待這幾個service 方法完成, 這樣就是一個清楚的關閉過程了. <br>
<br>
<br>
public void destroy() {<br>
/* 檢查是否有線程在運行,如果存在,告訴他們stop. */<br>
if (numServices() > 0) {<br>
setShuttingDown(true);<br>
}<br>
<br>
/* 等待他們stop. */<br>
while(numService() > 0) {<br>
try {<br>
thisThread.sleep(interval);<br>
} catch (InterruptedException e) {<br>
}<br>
}<br>
}<br>
<br>
long-running 方法如必要應當檢查這個變量,并且解釋他們的工作: <br>
<br>
public void doPost(...) {<br>
...<br>
for(i = 0; ((i < lotsOfStuffToDo) && !isShuttingDown()); i++) {<br>
try {<br>
partOfLongRunningOperation(i);<br>
} catch (InterruptedException e) {<br>
}<br>
}<br>
}<br>
<br>
3.3 提供關于Servlet的信息<br>
/**<br>
* This is a simple example of an HTTP Servlet. It responds to the GET<br>
* and HEAD methods of the HTTP protocol.<br>
*/<br>
public class SimpleServlet extends HttpServlet { <br>
<br>
...<br>
<br>
public String getServletInfo() {<br>
return "A simple servlet";<br>
}<br>
}
</table>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -