1.Servlet是什么?(來自百度,知道的可以忽略本段)
Servlet是sun公司提供的一門用於開發動態web資源的技術。
Sun公司在其API中提供了一個servlet接口,用戶若想用發一個動態web資源(即開發一個Java程序向瀏覽器輸出數據),需要完成以下2個步驟:
1、編寫一個Java類,實現servlet接口。
2、把開發好的Java類部署到web服務器中。
按照一種約定俗成的稱呼習慣,通常我們也把實現了servlet接口的java程序,稱之為Servlet
2.Servlet的工作流程?
Servlet程序是Web服務器調用,web服務器接到客戶端的Servlet請求后:
1.web服務器首先檢查是否裝載並創建了該Servlet的實例對象,如果是執行4,否則執行2,
2.裝載並創建Servlet的一個實例對象,並調用init()方法
4.創建一個封裝http請求信息的HttpServletRequest對象和響應的HttpServletResponse對象,
5.web程序停止之前,調用Servlet的destroy()方法,卸載Servlet。
3.使用Servlet注意的幾個問題?
因為我們是通過url訪問web服務器中的資源,Servlet若想被外界訪問,必須映射到url地址上,這個工作
在web.xml文件中使用<servlet>元素和<servlet-mapping>元素中完成。
4 缺省Servlet
如果<servlet-mapping>元素的<url-pattern>中的映射路徑僅為(/),那么這個Servlet就是缺省的Servlet,用於
處理其他Servlet都不處理的訪問請求.
5.Servlet的線程安全問題
當多個客戶端並發訪問同一個Servlet,web服務器會為每一個客戶端的訪問請求創建一個線程,
並調用service()方法,因此service方法內如果訪問了同一個資源,就可能引發線程安全問題。
public class ServletDemo3 extends HttpServlet { 12 13 int i=1; 14 public void doGet(HttpServletRequest request, HttpServletResponse response) 15 throws ServletException, IOException { 16 /** 17 * 加了synchronized后,並發訪問i時就不存在線程安全問題了, 18 * 為什么加了synchronized后就沒有線程安全問題了呢? 19 * 假如現在有一個線程訪問Servlet對象,那么它就先拿到了Servlet對象的那把鎖 20 * 等到它執行完之后才會把鎖還給Servlet對象,由於是它先拿到了Servlet對象的那把鎖, 21 * 所以當有別的線程來訪問這個Servlet對象時,由於鎖已經被之前的線程拿走了,后面的線程只能排隊等候了 22 * 23 */ 24 synchronized (this) {//在java中,每一個對象都有一把鎖,這里的this指的就是Servlet對象 25 i++; 26 try { 27 Thread.sleep(1000*4); 28 } catch (InterruptedException e) { 29 e.printStackTrace(); 30 } 31 response.getWriter().write(i+""); 32 } 33 34 } 35 36 public void doPost(HttpServletRequest request, HttpServletResponse response) 37 throws ServletException, IOException { 38 doGet(request, response); 39 } 40 41 }
這種做法是給每個Servlet對象加了一把鎖,假如有9999個人同時訪問一個Servlet,那么就得按先后順序排序,不適應。
由於時間關系,筆者參閱了下面的部分內容,在此表示感謝,也請大家踴躍指正幫助更多的想學習servlet的孩子:
http://www.cnblogs.com/xdp-gacl/p/3760336.html