Spring MVC 基于代碼的Servlet容器初始化

2018-07-26 14:46 更新

在Servlet 3.0以上的環(huán)境下,你可以通過編程的方式來配置Servlet容器了。你可以完全放棄web.xml,也可以兩種配置方式同時(shí)使用。以下是一個(gè)注冊DispatcherServlet的例子:

import org.springframework.web.WebApplicationInitializer;

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) {
        XmlWebApplicationContext appContext = new XmlWebApplicationContext();
        appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");

        ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet(appContext));
        registration.setLoadOnStartup(1);
        registration.addMapping("/");
    }

}

Spring MVC提供了一個(gè)WebApplicationInitializer接口,實(shí)現(xiàn)這個(gè)接口能保證你的配置能自動(dòng)被檢測到并應(yīng)用于Servlet 3容器的初始化中。WebApplicationInitializer有一個(gè)實(shí)現(xiàn),是一個(gè)抽象的基類,名字叫AbstractDispatcherServletInitializer。有了它,要配置DispatcherServlet將變得更簡單,你只需要覆寫相應(yīng)的方法,在其中提供servlet映射、DispatcherServlet所需配置的位置即可:

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { MyWebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}

以上的例子適用于使用基于Java配置的Spring應(yīng)用。如果你使用的是基于XML的Spring配置方式,那么請直接繼承AbstractDispatcherServletInitializer這個(gè)類:

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }

    @Override
    protected WebApplicationContext createServletApplicationContext() {
        XmlWebApplicationContext cxt = new XmlWebApplicationContext();
        cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
        return cxt;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

}

AbstractDispatcherServletInitializer同樣也提供了便捷的方式來添加過濾器Filter實(shí)例并使他們自動(dòng)被映射到DispatcherServlet下:

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    // ...

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] { new HiddenHttpMethodFilter(), new CharacterEncodingFilter() };
    }

}

每個(gè)過濾器被添加時(shí),默認(rèn)的名稱都基于其類類型決定,并且它們會(huì)被自動(dòng)地映射到DispatcherServlet下。

關(guān)于異步支持,AbstractDispatcherServletInitializer的保護(hù)方法isAsyncSupported提供了一個(gè)集中的地方來開關(guān)DispatcherServlet上的這個(gè)配置,它會(huì)對所有映射到這個(gè)分發(fā)器上的過濾器生效。默認(rèn)情況下,這個(gè)標(biāo)志被設(shè)為true。

最后,如果你需要對DispatcherServlet做進(jìn)一步的定制,你可以覆寫createDispatcherServlet這個(gè)方法。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)