Servlet相關要點

Servlet(server與applet的縮寫)

1、什麼是Servlet?

servlet與普通的java程序不同,他是運行在web應用服務器上的Java程序,可以對web瀏覽器或其他Http客戶端程序發送的請求進行處理

   ~servlet容器(WEB容器,例如tomcat)是web服務器或者應用程序服務器的一部分,用於在發送請求和響應上提供網絡服務。

   ~servlet是基於servlet容器(servlet引擎)實現的,由容器來實例化和調用Servlet的方法,servlet容器包含和管理servlet的生命週期

servlet不僅約束了服務器如何實現規範,也約束着java web項目的結構

Note:有了servlet之後,用戶通過點擊某個鏈接或者在瀏覽器的地址欄中輸入URL來訪問servlet,web容器接收到請求之後,並不是直接將請求交給servlet,而是先交給servlet容器,servlet容器實例化servlet,調用servlet的一個特定方法對請求進行處理,併產生一個響應,這個響應有servlet容器返回給Web容器,web容器包裝這個響應,以http響應形式發送給瀏覽器

2、servlet的作用?

(1)通信支持:利用容器提供的方法,你能輕鬆的讓 Servlet 與 web 服務器對話,而不用自己建立 serversocket 、監聽某個端口、創建流等。容器知道自己與 web 服務器之間的協議,所以你的 Servlet 不用擔心 web 服務器(如Apache)和你自己的 web 代碼之間的 API ,只需要考慮如何在 Servlet 中實現業務邏輯(如處理一個訂單)。

(2)生命週期管理:Servlet 容器控制着 Servlet 的生與死,它負責加載類、實例化和初始化 Servlet ,調用 Servlet 方法,以及使 Servlet 實例被垃圾回收,有了 Servlet 容器,你不需要太多的考慮資源管理。

(3)多線程支持:容器會自動爲它所接收的每個 Servlet 請求創建一個新的 java 線程。針對用戶的請求,如果 Servlet 已經運行完相應的http服務方法,這個線程就會結束。這並不是說你不需要考慮線程安全性,其實你還會遇到同步問題,不過這樣能使你少做很多工作。

(4)聲明方式實現安全:利用 Servlet 容器,你可以使用 xml 部署描述文件來配置和修改安全性,而不必將其硬編碼寫到 Servlet 類代碼中。

(5)JSP支持(將jsp翻譯爲真正的java代碼):Servlet容器負責將 jsp 代碼翻譯爲真正的 java 代碼。

3、在web容器中,servlet主要經歷的4個階段:

(1)在web容器啓動或者客戶機第一次請求服務時,容器加載servlet,並將其放入servlet實例化池

(2)當實例化結束後,容器將調用Servlet對象的init()方法完成Servlet的初始化操作

(3)容器通過servlet的service()方法處理客戶端請求,在Service()方法中,servlet實例根據不同的http請求作出不同的處理,並在處理之後作出相應的響應

(4)在web容器關閉時,容器調用servlet對象的destroy()方法對資源進行釋放,在調用此方法後該servlet對象就會被垃圾回收器回收

4、servlet爲什麼是單例的?每次訪問請求對象和響應對象都是新的?線程安全問題?

(1)瀏覽器多次對servlet的請求,一般情況下,服務器只創建一個servlet對象,也就是說一旦一個servlet對象被創建,機會駐留在內存中,爲後續請求做服務,直至服務器關閉

(2)每次訪問請求對象,servlet引擎都會創建一個新的HttpServletRequest,請求對象和一個新的HttpServletResponse響應對象,然後將這兩個對象作爲參數傳遞給它調用的Servlet的service()方法,service方法再根據請求方式分別調用doXXX方法。

request對象代表http請求,我們獲取瀏覽器提交過來的數據,就找request,response代表http響應,向瀏覽器輸出數據,找response對象

(3)當多個用戶訪問servlet的時候,服務器會爲每個用戶創建一個線程,當多個用戶併發訪問servlet共享資源的時候就會出現安全問題

原則:

       ①當一個變量需要被多個用戶共享,則應當在訪問該變量的時候,加同步機制Synchronized

       ②如果一個變量不需要共享,則直接在doGet()或者doPost()定義,這樣就不會存在線程問題

5、Get與Post的區別:

(1)Get:

         ①暴露請求信息,不安全

         ②請求信息大小不能超過1kb,上傳信息有限,不可以上傳圖片

         ③請求速度快

(2)Post

         ①隱藏了請求信息,比較安全,但是1也可以通過相關工具訪問到數據

         ②post方式沒有限制請求數據的大小,可以做圖片上傳

6、關於請求中文亂碼的處理

(1)對於post請求,可以設置編碼方式:request.setChatacterEncoding("UTF-8");

注意:必須在獲取第一個參數之前設置,並且該方法只對post方式有效

(2)對於get請求

重新設置Tomcat的編碼方式,修改Tomcat配置文件:Tomcat根目錄/conf/server.xml(修改端口的那一行)設置爲UTF-8

7、Servlet的一些細節問題

(1)一個servlet可以有多個<url-pattern>,可以有多個資源名稱找到當前servlet

(2)配置Servlet可以使用通配符(*)

(3)自定義的servlet中的<servlet-name>不能夠爲default,使用他會導致靜態資源無法被找到,tomcat/config/web.xml文件中配置一個1名字爲default的servlet,該Servlet在負責訪問項目下的靜態資源

(4)可以將servlet的初始化操作向前移,配置<load-on-startup>中的數字,數字越小越先啓動

8、servlet註解

這是Servlet3.0提出的新特性,支持註解配置,大大簡化了工作

本來servlet的配置需要這麼寫

web.xml 中éç½® Servlet

有了註解配置之後,我們就可以這麼做:

也可以省略name,直接寫url爲:@WebServlet("/foreServlet")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章