Java Web基礎知識之Servlet容器初始化(無web.xml)__html5

來源:互聯網
上載者:User

在之前典型的Java Web程式中,部署描述符web.xml是必不可少的,在這裡我們需要配置各種組件,包括Servlet、Filter和Listener等,如果使用過SpringMVC的話,應該會對在web.xml中配置org.springframework.web.servlet.DispatcherServlet十分熟悉。但是對於所有的設定檔都有的一個通病就是只有在程式部署的時候,一些配置項問題才能被發現,而不能在程式編譯開發階段就發現。所以如果通過編程的方法來設定配置項則是一個最好的選擇,我們完全可以拋棄web.xml這個部署描述符,而是換用從Servlet 3.0中提出的一個介面javax.servlet.ServletContainerInitializer來完成Servlet容器的初始化,該介面的作用是當Web應用啟動時,通知一些實作類別來執行一些要求的Servlet、Filter和Listener等的編程註冊。 一、介面說明

ServletContainerInitializer介面細節:

其中只有一個方法onStartup(...) ,在執行任何ServletContext監聽器之前,由Servlet容器調用這個方法,該方法的主要作用是註冊Web對象;

實現ServletContainerInitializer的類必須使用@HandleTypes註解進行標註,以便聲明onStartup(...)可以處理這個類的執行個體,所有該類、包括它的子類都會被傳遞給其中的Set<Class<?>> c欄位,如果沒有這個註解,或者在該註解中使用的類不存在或沒有相應的子類,則會傳遞給該參數一個null值;

這個介面被設計在jar檔案中使用,而無法直接在war包中直接使用,而是通過在jar中完成定義,然後將jar包作為Java Web的依賴包,該介面的實作類別會通過Java的SPI的註冊查詢機制被發現;

如果要使用這個類,需要一個中繼資料檔案來說明如何定位該介面的實作類別,該文字檔在META-INF/services檔案夾下,這個文字檔的名稱為javax.servlet.ServletContainerInitializer ,其中的內容是該介面的實作類別的全限定名;

二、編程實現 1、構建jar依賴包

首先搭建依賴包工程,這裡使用Maven管理工程,依賴項只需要一個,如下:

<dependency>    <groupId>javax.servlet</groupId>    <artifactId>javax.servlet-api</artifactId>    <version>3.1.0</version>    <scope>provided</scope></dependency>
1

Maven項目目錄如下:

其中ServletContainerInitializer的實作類別為com.demo.CustomServletContainerInitializer,為了在jar中加入META-INF/services檔案夾,只需要將該檔案夾直接放到maven的資源檔夾resources下即可,在打包的時候就會在jar中實現該檔案夾,並包括之前的檔案;

可以看出META-INF/services檔案夾中的文字檔名為javax.servlet.ServletContainerInitializer ,其中的內容為com.demo.CustomServletContainerInitializer ,為該介面的實作類別;

在CustomServletContainerInitializer 中的實現如下:

@HandlesTypes({HttpServlet.class})public class CustomServletContainerInitializer implements ServletContainerInitializer {    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {        for(Class<?> clazz: c){            System.out.println(clazz.getName());        }    }}
1

該實作類別在Java Web應用啟動時,會調用該方法,傳遞HttpServlet類以及其子類。 2、構建Java Web程式

Java Web程式的工程目錄如下:

在工程中必須有webapp這個目錄,如果沒有則會導致異常java.lang.IllegalArgumentException: Document base ... src\main\webapp does not exist or is not a readable directory

這裡我們定義一個Servlet類TestServlet ,通過使用註解@javax.servlet.annotation.WebServlet 來標識這個Servlet ,代碼如下:

@WebServlet(urlPatterns = "/testServlet", name = "testServlet")public class TestServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        Writer writer = resp.getWriter();        writer.write("do get");    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        Writer writer = resp.getWriter();        writer.write("do post");    }}
1

這個註解是在應用啟動的時候被容器處理,並且都對應的servlet也可以通過相應的URL來訪問;

在程式啟動的過程中,會發現傳遞進來很多的servlet子類和Filter的實作類別,如下:

其中也包括我們自訂的一個TestServlet。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.