Servlet基礎知識

ykun 10年前發布 | 29K 次閱讀 Servlet Java開發

1.F:\apache-tomcat-7.0.54\apache-tomcat-7.0.54\conf  下面的content.xml文件有個        <WatchedResource>WEB-INF/web.xml</WatchedResource>可以實時監測WEB-INF下web.xml的改動,因此不用重新發布工程。

2.Servlet是一個供其他Java程序(Servlet引擎)調用的Java類,他不能獨立運行,它的運行完全由Servlet引擎來控制和調度。

3.針對客戶端的多次Servlet請求,通常情況下,服務器只會創建一個Servlet實例對象,即Servlet實例對象一旦創建,它就會駐留在內存中,為后續的其他請求服務,直至web容器退出,servlet實例對象才會銷毀。

4.在Servlet的整個生命周期內,Servlet的init方法只會被調用一次。而對一個Servlet的每次訪問請求都導致Servlet引擎調用一次servlet的service方法。對于每次訪問請求,Servlet引擎都會創建一個新的HttpServletRequest請求對象和一個新的HttpServletResponse響應對象,然后將這兩個對象作為參數傳遞給它調用的Servlet的service方法,該方法再根據請求方式分別調用doGet方法或doPost方法。

5.缺省Servlet
  5.1.如果某個Servlet的映射路徑僅僅為一個正斜杠(/),那么這個Servlet就成為當前Web應用程序的缺省Servlet。
  5.2.凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它們的訪問請求都將交給缺省Servlet處理,也就是說,缺省Servlet用于處理所有其他Servlet都不處理的訪問請求。
  5.3.在<tomcat的安裝目錄>\conf\web.xml文件中,注冊了一個名稱為org.apache.catalina.servlets.DefaultServlet的Servlet,并將這個Servlet設置為了缺省Servlet。
  5.4.當訪問Tomcat服務器中的某個靜態HTML文件和圖片時,實際上是在訪問這個缺省Servlet。

6.Servlet的注冊與運行
  6.1.Servlet程序必須通過Servlet引擎來啟動運行,并且儲存目錄有特殊要求,通常需要存儲在<WEB應用程序目錄>\WEB-INF\classes\目錄中。如果這個Servlet程序有包名,那么在這個目錄下面還要有包名對應的目錄結構。
  6.2.Servlet程序必須在WEB應用程序的web.xml文件中進行注冊和映射其訪問路徑,才可以被Servlet引擎加載和被外界訪問。
  6.3.一個<servlet>元素用于注冊一個Servlet,它包含有兩個主要的子元素:<servlet-name>和<servlet-class>,分別用于設置Servlet的注冊名稱和Servlet的完整類名(包括包名)。
  6.4.一個<servlet-mapping>元素用于映射一個已注冊的Servlet的一個對外訪問路徑,它包含有兩個子元素:<servlet-name>和<url-pattern>,分別用于指定Servlet的注冊名稱和Servlet的對外訪問路徑。
  6.5.同一個Servlet可以被映射到多個URL上,即多個<servlet-mapping>元素的<servlet-name>子元素的設置值可以是同一個Servlet的注冊名。

7.Servlet激活器
Tomcat的examples應用程序中的例子Servlet的訪問路徑: http://localhost:8080/examples/servlet/<Servlet完整類名&gt;
比如在當前web目錄的web.xml中有如下信息:
<servlet-mapping>
    <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/</url-pattern>
</servlet-mapping>

但是我們在這個xml文件到處也找不到<servlet-name>等于invoker的<servlet>,這是因為在</tomcat的安裝目錄>\conf\Web.xml文件中還有一個Web.xml的全局配置信息,在這個xml文件中有這些記錄:
<servlet>
    <servlet-name>invoker</servlet-name>
        <servlet-class>
              org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <load-on-startup>2</load-on-startup>
</servlet>

這個注冊名為invoker的Servlet是在全局Web.xml文件中設置的。這個注冊名為invoker的Servlet的作用就是去激活和調用其他Servlet,所以被成為“Servlet激活器”,它被設置為隨tomcast服務器啟動時加載(通過<load-on-startup>),由于Servlet激活器將把url總的額外路徑信息(映射url中的“
”部分所匹配的內容)當做某個Servlet的類名去調用,所以每個web應用程序中為Servlet激活器所訪問的訪問路徑可以各不相同,但是必須以“/”結尾。
這樣,即使某個Servlet沒有在Web.xml文件中進行注冊,我們只需要把Servlet激活器所映射的訪問路徑中的通配符“
”換成這個Servlet的完整類名,就可以通過Servlet激活器來調用它。
格式就是這樣: http://localhost:8080/examples/servlet/<Servlet完整類名&gt;

8.Response
  8.1.getOutputStream和getWriter方法分別用于得到輸出二進制數據、輸出文本數據的ServletOutputStream 、Printwriter對象。
  8.2.getOutputStream和getWriter方法互相排斥,調用其中的任何一方發后就不能調用另一方法,在一個Serlet里調用一方法,轉發后的Servlet中也不能出現另一個方法。
  8.3.Servlet程序向ServletOutputStream或PrintWriter對象中寫入的數據將被Servlet引擎從response里面獲取,Servlet引擎將這些數據當作響應消息的正文,然后再與響應狀態行和各響應頭組合后輸出到客戶端
  8.4.Servlet的service方法結束后,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對象是否已經調用過close犯法,如果沒有,Servlet引擎將調用close方法關閉輸出流對象。

9.forward細節
  9.1.forward方法用于請求轉發到RequestDispatcher對象封裝的資源。
  9.2.如果在調用forward方法之前,在Servlet程序中寫入的部分內容已經被真正地傳送到了客戶端,forward方法將拋出IllegalStateException異常。
  9.3.如果在調用forward方法之前向Servlet引擎的緩沖區(response)中寫入內容,只要寫入到緩沖區的內容還沒有被真正地輸出到客戶端,forward方法就可以被正常執行,原來寫入到輸出緩沖區中的內容將被清空,但是,已寫入到HttpServletResponse對象中的響應頭字段信息保持有效。

10.Cookie
  10.1.一個Cookie只能標識一種信息,它至少含有一個標識信息的名稱(Name)和設置值(Value)。
  10.2.一個WEB站點可以給一個WEB瀏覽器發送多個Cookie,一個WEB瀏覽器也可以存儲多個WEB站點提供的Cookie
  10.3.瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。
  10.4.如果創建了一個cookie,并將他發送到瀏覽器,默認情況下它是一個會話級別的cookie(即存儲在瀏覽器的內存中),用戶推出瀏覽器之后即被刪除。若希望瀏覽器將該cookie存儲在磁盤上,則需要使用maxAge,并給出一個以秒為單位的時間。將最大時效設為0則是命令瀏覽器刪除該cookie。
  10.5.注意,刪除cookie時,path必須一致,否則不會刪除

 本文由用戶 ykun 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!