天天看點

JavaWeb-Servlet(三)Servlet的一些細節

一、Servlet與線程安全

因為一個類型的Servlet隻有一個執行個體對象,那麼就有可能會顯示出一個servlet同時處理多個請求,那麼servlet是否為線程安全的呢?答案是:“不是線程安全的”。這說明servlet的工作效率很高,但是也存線上程安全問題!

是以我們不應該在servlet中随便的建立成員變量,因為可能會存在一個線程對這個成員變量進行寫操作,另一個線程對這個成員變量進行讀操作。

是以我們盡可能的做到以下幾點:

  • 不要在servlet中建立成員,建立局部變量即可。
  • 可以建立無狀态成員。
  • 可以建立有狀态的成員,但狀态必須為隻讀的。

二、讓伺服器在啟動時就建立Servlet

預設情況下,伺服器會在某個Servlet第一次收到請求時建立它。也可以在web.xml中對Servlet進行配置,是伺服器啟動時就建立Servlet。

<servlet>

标簽中配置

<load-on-startup>

标簽,裡面的值是一個非負的整數,可以在多個servlet中都做這樣的配置,這樣都會在伺服器啟動的時候建立servlet。但是多個servlet都是在啟動時建立,是以用這個值來決定它們之間的順序,數值越小,越先啟動。

JavaWeb-Servlet(三)Servlet的一些細節

三、<url-pattern>

<url-pattern>

<servlet-mapping>

的子元素,用來指定Servlet的通路路徑,即URL。它必須是以“/”開頭。

JavaWeb-Servlet(三)Servlet的一些細節

1)

可以在

<servlet-mapping>

中給出多個

<url-pattern>

,例如:

<servlet-mapping>
	<servlet-name>XXX</servlet-name>
	<url-pattern>/AServlet</url-pattern>
	<url-pattern>/BServlet</url-pattern>
</servlet-mapping>
           

那麼這說明一個servlet綁定了多個URL,這樣無論通路/AServlet還是/BServlet,通路的都是同一個servlet。

2)

還可以在

<url-pattern>

中使用通配符,所謂通配符就是星号“ * ”,星号可以比對任何的URL字首或者字尾,使用通配符可以命名一個servlet綁定一組URL,例如:

  • <url-pattern>/Servlet/*</url-pattern>

    :/Servlet/a、/Servlet/b,都比對/Servlet/*;
  • <url-pattern>*.do</url-pattern>

    :/abc/def/ghi.do、/a.do,都比對*.do;
  • <url-pattern>/*</url-pattern>

    :比對所有URL。

請注意,通配符要麼為字首,要麼為字尾,不能出現在URL中間位置,也不能隻有通配符。例如:

/*.do

就是錯誤的,因為星号出現在URL的中間位置上了。

*.*

也是不對的,因為一個URL中最多隻能出現一個通配符。

注意,通配符是一種模糊比對URL 的方式,如果存在更具體的<url-pattern>,那麼通路路徑會去比對具體的<url-pattern>。

四、web.xml檔案的繼承

每個完整的JavaWeb應用中都需要有web.xml,但是我們不知道所有的web.xml檔案都有一個共同的父檔案,它在Tomcat的conf/web.xml路徑。在這個檔案裡面的内容,相當于寫在了每個項目的web.xml中。

  • DefaultServlet

    其中有兩段:

    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
               
    <servlet-mapping>
    	<servlet-name>default</servlet-name>
    	<url-pattern>/</url-pattern>
    </servlet-mapping>
               
    我們可以看到,它的路徑資訊是“/”,它的優先級最低,也就是當一個請求沒有任何servlet處理的時候,它就會處理,也就是顯示404頁面。
  • jspServlet
    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>fork</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>xpoweredBy</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>
               
    這個servlet會響應我們的請求,把動态資源轉換成靜态資源。然後響應給浏覽器。
  • session的過期時間
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
               

session的過期時間為30分鐘。

  • mine-mapping
    JavaWeb-Servlet(三)Servlet的一些細節
    後面大段大段的mine-mapping是各種檔案擴充名對應的mime類型。

end.