程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java Servlet Programming 讀書筆記 - servlet生命周期

Java Servlet Programming 讀書筆記 - servlet生命周期

編輯:關於JAVA

servlet的生命周期一般為:

1.建立初始化servlet

2.處理從客戶端的零個或多個請求

3.銷毀servlet,gc回收占用內存

每個server可能在如何支持servlet上有不同的方法,但是上述servlet生命周期卻是每個servlet 引擎必須遵守的規則。

實例持久化Instance Persistence:

一個servlet 實例一旦加載,就開始處理對這個servlet的所有請求,換句話說就是一個servlet只生成一個實例。這樣的做法對於性能的提高很有好處,能夠有效地降低系統開銷,而且也能有效實現持久化(例如數據庫連接,cache數據)

import java.io.*;import javax.servlet.*;import Javax.servlet.http.*;public class SimpleCounter extends HttpServlet {int count = 0;public void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException {res.setContentType("text/plain");PrintWriter out = res.getWriter();count++;out.println("Since loading, this servlet has been Accessed " +count + " times.");}}上例是一個簡單的反映servlet持久化的例子,每個請求均增加本地變量count,然後打印顯示。 但是上例存在多線程風險,對於訪問servlet的每個請求都可以看作是一個線程對象,他們均訪問同一個servlet實例,所以會出現並發問題。特別是存在對共享變量的讀寫操作時(例如上例的本地變量count),這種危險性更大。

解決的辦法是增加synchronized塊。

PrintWriter out = res.getWriter();synchronized(this) {count++;out.println("Since loading, this servlet has been Accessed " +count + " times.");}

事實上,server上對每一個servlet的注冊名稱都對應servlet的一個實例,用來訪問servlet的請求名稱決定哪個實例來處理請求,

servlet reloading

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved