1. 程式人生 > >eclipes建立一個web專案web.xml不能自動更新的原因(web.xml和@WebServlet的作用)

eclipes建立一個web專案web.xml不能自動更新的原因(web.xml和@WebServlet的作用)

在eclipse中建立一個Web專案的時候,雖然有web.xml生成,但是再新增Servlet類檔案的時候總是看不見web.xml的更新,所以異常的鬱悶!上網查了查,原來我們在建立Web專案的時候,會彈出一個對話方塊,“Dynamic web module version”這個選項預設成了3.0,按照老規範,應該是在eclipse的WebContent \ WEB-INF \ 目錄下建立web.xml的。而新規範是可以不用web.xml的,如tomcat 7.0就支援新規範,這樣相關的servlet配置會以註解的形式直接寫到程式碼裡面了,比如@WebServlet。 當然如果你用老的專案匯入,可以選擇Dynamic web module version這個選項設成2.5,這樣web.xml就會自動更新了。 


 


@WebServlet(“/HW”)的含義:


 


@WebServlet(“/HW”)//預設設定的是urlPatterns屬性


public class HelloServlet extends HttpServlet {


只要在Servlet上設定@WebServlet標註,容器就會自動讀取當中的資訊。上面的@WebServlet告訴容器,如果請求的URL是“/HW”,則由HelloServlet的例項提供服務。可以使用@WebServlet提供更多資訊。
@WebServlet(
    name="Hello",
    urlPatterns={"/HW"}
)


上面的@WebServlet告知容器,HelloServlet這個Servlet的名稱是Hello,這是由name屬性指定的,而如果客戶端請求的URL是/HW,則由具Hello名稱的Servlet來處理,這是由urlPatterns屬性來指定的。在Java EE相關應用程式中使用標註時,可以記得的是,沒有設定的屬性通常會有預設值。例如,若沒有設定@WebServlet的name屬性,預設值會是Servlet的類完整名稱。


 


注意:Tomcat中, 如果web.xml和@WebServlet屬性都設定了,那麼對不起,@WebServlet


中的urlPatterns屬性就不起作用了!(可以將web.xml從WEB-INF目錄中移走,或者刪除


這樣@WebServlet中的urlPatterns屬性值就可以使用了!)

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

編寫好Servlet之後,接下來要告訴Web容器有關於這個Servlet的一些資訊。在Servlet 
3.0中,可以使用標註(Annotation)來告知容器哪些Servlet會提供服務以及額外資訊。例如在HelloServlet.java中:
@WebServlet("/hello.view")
public class HelloServlet extends HttpServlet {
只要在Servlet上設定@WebServlet標註,容器就會自動讀取當中的資訊。上面的@WebServlet告訴容器,如果請求的URL是“/hello.view”,則由HelloServlet的例項提供服務。可以使用@WebServlet提供更多資訊。
@WebServlet(
    name="Hello",
    urlPatterns={"/hello.view"},
    loadOnStartup=1
)
public class HelloServlet extends HttpServlet {
上面的@WebServlet告知容器,HelloServlet這個Servlet的名稱是Hello,這是由name屬性指定的,而如果客戶端請求的
URL是/hello.view,則由具Hello名稱的Servlet來處理,這是由urlPatterns屬性來指定的。在Java 
EE相關應用程式中使用標註時,可以記得的是,沒有設定的屬性通常會有預設值。例如,若沒有設定@WebServlet的name屬性,預設值會是
Servlet的類完整名稱。
當應用程式啟動後,事實上並沒有建立所有的Servlet例項。容器會在首次請求需要某個Servlet服務時,才
將對應的Servlet類例項化、進行初始化操作,然後再處理請求。這意味著第一次請求該Servlet的客戶端,必須等待Servlet類例項化、進行
初始動作所必須花費的時間,才真正得到請求的處理。
如果希望應用程式啟動時,就先將Servlet類載入、例項化並做好初始化動作,則可以使用
loadOnStartup設定。設定大於0的值(預設值為-1),表示啟動應用程式後就要初始化Servlet(而不是例項化幾個Servlet)。數
字代表了Servlet的初始順序,容器必須保證有較小數字的Servlet先初始化,在使用標註的情況下,如果有多個Servlet在設定
loadOnStartup時使用了相同的數字,則容器實現廠商可以自行決定要如何載入哪個Servlet。