1. 程式人生 > >Servlet使用註解配置URl提示404錯誤

Servlet使用註解配置URl提示404錯誤

之前配置Servlet作為URL的時候,都是在web.xml中配置的,配置方法大概如下:

如果我有這樣一個Servlet的話:


hello.Java程式碼:

  1. package test;  
  2. import java.io.IOException;  
  3. import java.io.PrintWriter;  
  4. import javax.servlet.ServletException;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8. publicclass hello extends HttpServlet {  
  9.     @Override
  10.     protectedvoid service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {  
  11.         // TODO Auto-generated method stub
  12.         PrintWriter out = arg1.getWriter();  
  13.         out.print("Hello World!");  
  14.         out.close();  
  15.     }  
  16. }  


可以在web.xml中這樣配置:

  1. <servlet>
  2.         <servlet-name>hello</servlet-name><!-- 這裡的name與下面的name一致即可 -->
  3.         <servlet-class>test.hello</servlet-class><!-- 使用到的class檔案 -->
  4.     </servlet>
  5.     <servlet-mapping>
  6.         <servlet-name>hello</
    servlet-name><!-- 與上面的name一致 -->
  7.         <url-pattern>/hello</url-pattern><!-- 所對映的URL -->
  8.     </servlet-mapping>
執行這個Servlet:


但是如果這樣的Servlet多的話,每個都需要配置會很麻煩。

然後今天學到了註解,Servlet3.0之後可以在Servlet中使用註解直接配置URL。

需要在Servlet中匯入 import javax.servlet.annotation.WebServlet;

然後使用@WebServlet("/URlname")

就可以直接配置了,然後通過所輸入的URL可以直接訪問到。

使用註解配置剛才的Servlet程式碼如下:


這裡需要將剛才在web.xml中配置的內容刪除掉(後面會演示如果不刪除的話會出現什麼情況)。

但是這樣直接執行的話,卻提示404資源不存在。


解決的辦法就是將web.xml中的metadate-complete=“true”,修改為false。

修改false之後再次執行即可成功執行。


如果使用了註解之後,還要繼續在web.xml中配置該Servlet的話,會出現如下情況:

web.xml中為該Servlet配置成helloweb。


Servlet中使用註解配置成hellozhujie。


但是執行之後顯示的是helloweb:


很顯然,當web.xml和註解同時存在的時候,使用的是web.xml中所配置的內容,而忽略了註解配置的內容。

為什麼將metadate-complete設定為false,就可以運行了呢?

因為:

Servlet 3.0 的部署描述檔案 web.xml 的頂層標籤 <web-app> 有一個 metadata-complete 屬性,該屬性指定當前的部署描述檔案是否是完全的。如果設定為 true,則容器在部署時將只依賴部署描述檔案,忽略所有的註解(同時也會跳過 web-fragment.xml 的掃描,亦即禁用可插性支援,具體請看後文關於 可插性支援的講解);如果不配置該屬性,或者將其設定為 false,則表示啟用註解支援(和可插性支援)。