1. 程式人生 > >Servlet技術

Servlet技術

wid 工作者線程 就會 處理請求 display 服務器 acl 默認 str

----Servlet是用Java語言編寫的應用到Web服務器端的擴展技術,它先於jsp產生,可以方便地對Web應用中的HTTP請求進行處理。在Java Web程序開發中,Servlet主要用於處理各種業務邏輯,他比jsp更具有業務邏輯層的意義。

一。Servlet基礎

  Servlet是運行在Web服務器端的Java應用程序,Servlet對象主要封裝了對HTTP請求的處理,並且他的運行需要Servlet容器的支持。

  提供了Servlet功能的服務器,叫做Servlet容器,其常見容器有很多,如Tomcat, Jetty, resin, Oracle Application server, WebLogic Server, Glassfish, Websphere, JBoss等。

  1.Servlet體系結構

技術分享圖片

   2.Servlet的生命周期:

    技術分享圖片

      

1) 加載和實例化;在第一次請求Servlet時,Servlet容器將會創建Servlet實例;

2) 初始化;Servlet容器加載完成Servlet之後,必須進行初始化,此時,init方法將被調用;

3) Servlet初始化之後,就處於響應請求的就緒狀態,此時如有客戶端請求發送,就會調用Servlet實例的service()方法,並且根據用戶的請求方式,調用doPost或者doGet方法;

4) 最後,Servlet容器負責將Servlet實例進行銷毀,調用destroy方法實現;

  對於更多的客戶端請求,Server創建新的請求和響應對象,仍然激活此Servlet的service()方法,將這兩個對象作為參數傳遞給它。如此重復以上的循環,但無需再次調用init()方法。

一般Servlet只初始化一次(只有一個對象),當Server不再需要Servlet時(一般當Server關閉時),Server調用Servlet的Destroy()方法。

  

  3.Servlet如何同時處理多個請求?

     Servlet采用多線程來處理多個請求的同時訪問。Servlet容器通過線程池來管理維護服務請求。所謂線程池,相當於數據庫連接池,實際上是等待執行代碼的一組線程,叫做工作者線程。Servlet容器通過一個調度線程來管理工作者線程。
· 當容器收到一個Servlet的訪問請求,調度者線程就從線程池中選出一個工作者線程,將用戶請求傳遞給該線程,然後由該線程處理Servlet的service()方法;
· 當這個線程在執行的時候,容器收到一個新的請求,調度者線程再次從線程池中選出一個新的工作者線程;
· 當容器同時收到對同一個Servlet的多個請求時,那麽Servlet的service方法將在多線程中並發執行。

 註:

1.Servlet容器默認采用單實例多線程的方式來處理請求。這樣減少了產生Servlet實例的開銷,提升了對請求的響應時間;
2.對於Tomcat容器來講,可以在其server.xml中通過<Connector>中設置線程池中的線程數目。

 

4.如何開發線程安全的Servlet?

     Servlet容器采用多線程來處理請求,提高性能的同時也造成了線程安全問題。要開發線程安全的Servlet應該從一下幾個方面進行:
1. 變量的線程安全; 多線程並不共享局部變量,所以我們要盡可能的在Servlet中使用局部變量;
2. 代碼塊的線程安全; 使用同步塊Synchronized,防止可能調用的代碼塊;但是要註意的是,要盡可能得縮小同步代碼的方範圍,不要在service方法和響應方法上直接使用同步,這會嚴重影響性能。
3. 屬性的線程安全; ServletContext,HttpSession,ServletRequest對象中屬性;
4. 使用同步集合; 使用Vector代替ArrayList,使用HashTable代替HashMap;
5. 不要在Servlet中創建自己的線程來完成某個功能; Servlet本身就是多線程的,如果再創建新的線程,將會導致線程執行復雜化,出現線程安全問題;
6. 在多個Servlet中,對外部對象,比如:文件;進行修改操作一定要加鎖,做到互斥訪問;

   

5.總結

     一個servlet就是Java編程語言中的一個類,它被用來擴展服務器的性能,服務器上駐留著可以通過“請求-響應”編程模型來訪問的應用程序。Servlet通過解析http請求,取得客戶端的參數來進行下一步操作。其實簡單來說,servlet就是一個控制器,取參數,調用業務邏輯.

二。Servlet訪問URL映射配置

   由於客戶端是通過URL地址訪問web服務器中的資源,所以Servlet程序若想被外界訪問,必須把servlet程序映射到一個URL地址上,這個工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
  <servlet>元素用於註冊Servlet,它包含有兩個主要的子元素:<servlet-name>和<servlet-class>,分別用於設置Servlet的註冊名稱和Servlet的完整類名。
一個<servlet-mapping>元素用於映射一個已註冊的Servlet的一個對外訪問路徑,它包含有兩個子元素:<servlet-name>和<url-pattern>,分別用於指定Servlet的註冊名稱和Servlet的對外訪問路徑。

  

1   <servlet>
2     <servlet-name>ServletDemo1</servlet-name>
3     <servlet-class>gacl.servlet.study.ServletDemo1</servlet-class>
4   </servlet>
5 
6   <servlet-mapping>
7     <servlet-name>ServletDemo1</servlet-name>
8     <url-pattern>/servlet/ServletDemo1</url-pattern>
9   </servlet-mapping>

  同一個Servlet可以被映射到多個URL上,即多個<servlet-mapping>元素的<servlet-name>子元素的設置值可以是同一個Servlet的註冊名。 例如:

  

 1  <servlet>
 2     <servlet-name>ServletDemo1</servlet-name>
 3     <servlet-class>gacl.servlet.study.ServletDemo1</servlet-class>
 4   </servlet>
 5 
 6   <servlet-mapping>
 7     <servlet-name>ServletDemo1</servlet-name>
 8     <url-pattern>/servlet/ServletDemo1</url-pattern>
 9   </servlet-mapping>
10  <servlet-mapping>
11     <servlet-name>ServletDemo1</servlet-name>
12     <url-pattern>/1.htm</url-pattern>
13   </servlet-mapping>
14    <servlet-mapping>
15     <servlet-name>ServletDemo1</servlet-name>
16     <url-pattern>/2.jsp</url-pattern>
17   </servlet-mapping>
18    <servlet-mapping>
19     <servlet-name>ServletDemo1</servlet-name>
20     <url-pattern>/3.php</url-pattern>
21   </servlet-mapping>
22    <servlet-mapping>
23     <servlet-name>ServletDemo1</servlet-name>
24     <url-pattern>/4.ASPX</url-pattern>
25   </servlet-mapping>

  通過上面的配置,當我們想訪問名稱是ServletDemo1的Servlet,可以使用如下的幾個地址去訪問:

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/servlet/ServletDemo1

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/1.htm

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/2.jsp

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/3.php

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/4.ASPX

  ServletDemo1被映射到了多個URL上。

Servlet技術