SpringMVC4零配置--web.xml

servlet3.0+規(guī)范后,允許servlet冈涧,filter,listener不必聲明在web.xml中正蛙,而是以硬編碼的方式存在督弓,實現(xiàn)容器的零配置。

ServletContainerInitializer:啟動容器時負責加載相關(guān)配置

package javax.servlet;  
import java.util.Set;  
public interface ServletContainerInitializer {  
 public void onStartup(Set<Class<?>> c, ServletContext ctx)  
        throws ServletException;   
}  
```
容器啟動時會自動掃描當前服務(wù)中`ServletContainerInitializer`的實現(xiàn)類乒验,并調(diào)用其`onStartup`方法愚隧,其參數(shù)`Set<Class<?>> c`,可通過在實現(xiàn)類上聲明注解`javax.servlet.annotation.HandlesTypes(xxx.class)`注解自動注入锻全,`@HandlesTypes`會自動掃描項目中所有的`xxx.class`的實現(xiàn)類狂塘,并將其全部注入`Set`。
 
Spring為其提供了一個實現(xiàn)類:

**SpringServletContainerInitializer**
```
package org.springframework.web;  
import java.lang.reflect.Modifier;  
import java.util.LinkedList;  
import java.util.List;  
import java.util.ServiceLoader;  
import java.util.Set;  
import javax.servlet.ServletContainerInitializer;  
import javax.servlet.ServletContext;  
import javax.servlet.ServletException;  
import javax.servlet.annotation.HandlesTypes;  
import org.springframework.core.annotation.AnnotationAwareOrderComparator;  
@HandlesTypes(WebApplicationInitializer.class)  
public class SpringServletContainerInitializer implements ServletContainerInitializer {  
        @Override  
    public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)  
            throws ServletException {  
  
        List<WebApplicationInitializer> initializers = new LinkedList<WebApplicationInitializer>();  
  
        if (webAppInitializerClasses != null) {  
            for (Class<?> waiClass : webAppInitializerClasses) {  
                // Be defensive: Some servlet containers provide us with invalid classes,  
                // no matter what @HandlesTypes says...  
                if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&  
                        WebApplicationInitializer.class.isAssignableFrom(waiClass)) {  
                    try {  
                        initializers.add((WebApplicationInitializer) waiClass.newInstance());  
                    }  
                    catch (Throwable ex) {  
                        throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);  
                    }  
                }  
            }  
        }  
  
        if (initializers.isEmpty()) {  
            servletContext.log("No Spring WebApplicationInitializer types detected on classpath");  
            return;  
        }  
  
        AnnotationAwareOrderComparator.sort(initializers);  
        servletContext.log("Spring WebApplicationInitializers detected on classpath: " + initializers);  
  
        for (WebApplicationInitializer initializer : initializers) {  
            initializer.onStartup(servletContext);  
        }  
    }  
  
}  
```
 `WebApplicationInitializer`才是需要關(guān)心的接口鳄厌,我們只需要將相應(yīng)的servlet荞胡,filter,listener等硬編碼到該接口的實現(xiàn)類中即可了嚎。
 
##xml配置:
 
```
       <!-- Log4jConfigListener -->  
       <context-param>  
    <param-name>log4jConfigLocation</param-name>  
    <param-value>classpath:config/properties/log4j.properties</param-value>  
       </context-param>  
       <listener>  
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
       </listener>  
  
       <!-- OpenSessionInViewFilter -->  
       <filter>  
    <filter-name>hibernateFilter</filter-name>  
    <filter-class>  
        org.springframework.orm.hibernate4.support.OpenSessionInViewFilter  
    </filter-class>         
       </filter>  
       <filter-mapping>  
    <filter-name>hibernateFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
       </filter-mapping>  
  
       <!-- DemoServlet -->  
       <servlet>  
    <servlet-name>demoServlet</servlet-name>  
    <servlet-class>web.function.servlet.DemoServlet</servlet-class>  
    <load-on-startup>2</load-on-startup>  
       </servlet>  
<servlet-mapping>  
    <servlet-name>demoServlet</servlet-name>  
    <url-pattern>/demo_servlet</url-pattern>  
</servlet-mapping>  
```
 編碼配置:
 
 
```
@Order(1)  
public class CommonInitializer implements WebApplicationInitializer{  
  
    @Override  
    public void onStartup(ServletContext servletContext)  
            throws ServletException {  
          
        //Log4jConfigListener  
        servletContext.setInitParameter("log4jConfigLocation", "classpath:config/properties/log4j.properties");  
        servletContext.addListener(Log4jConfigListener.class);  
          
          
        //OpenSessionInViewFilter  
        OpenSessionInViewFilter hibernateSessionInViewFilter = new OpenSessionInViewFilter();  
        FilterRegistration.Dynamic filterRegistration = servletContext.addFilter(  
                "hibernateFilter", hibernateSessionInViewFilter);  
        filterRegistration.addMappingForUrlPatterns(  
                EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE), false, "/");  
          
          
        //DemoServlet  
        DemoServlet demoServlet = new DemoServlet();  
        ServletRegistration.Dynamic dynamic = servletContext.addServlet(  
                "demoServlet", demoServlet);  
        dynamic.setLoadOnStartup(2);  
        dynamic.addMapping("/demo_servlet");  
                  
          
    }  
  
      
}  
```
 
Spring為我們提供了一些WebApplicationInitializer的抽象類泪漂,我們只需要繼承并按需修改即可,比如:
**1)****org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer : SpringSecurity相關(guān)配置**
 
xml配置:
 
Xml代碼 [圖片上傳中歪泳。萝勤。。(5)]

       <listener>  
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>  
</listener>  
  
       <filter>  
    <filter-name>springSecurityFilterChain</filter-name>  
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
</filter>  
  
       <filter-mapping>  
    <filter-name>springSecurityFilterChain</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>  

 
 
編碼配置:
 
Java代碼 ![收藏代碼](http://upload-images.jianshu.io/upload_images/722827-4df61b8bc98d9733.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)

@Order(2)  
public class WebAppSecurityInitializer  extends AbstractSecurityWebApplicationInitializer   
{  
    //servletContext.addListener("org.springframework.security.web.session.HttpSessionEventPublisher");  
    //session監(jiān)聽器  
    @Override  
    protected boolean enableHttpSessionEventPublisher() {  
        return true;  
    }  
}  

 
**2)org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer:MVC相關(guān)配置呐伞,比如加載spring配置文件敌卓,聲明****DispatcherServlet等等,參看下面的對比:**
xml配置:
 
Xml代碼 [圖片上傳中荸哟。假哎。瞬捕。(7)]

       <context-param>  
    <param-name>contextConfigLocation</param-name>  
    <param-value>  
    classpath:config/context/applicationContext-AppConfig.xml,  
    classpath:config/context/applicationContext-SpringSecurityConfig.xml  
        </param-value>  
</context-param>  
  
       <listener>  
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
</listener>  
  
       <filter>  
    <filter-name>Set Character Encoding</filter-name>  
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
    <init-param>  
        <param-name>encoding</param-name>  
        <param-value>UTF-8</param-value>  
    </init-param>  
    <init-param>  
        <param-name>forceEncoding</param-name>  
        <param-value>true</param-value>  
    </init-param>  
</filter>  
  
       <filter-mapping>  
    <filter-name>Set Character Encoding</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>  
  
       <servlet>  
    <servlet-name>webmvc</servlet-name>  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    <init-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>classpath:config/context/applicationContext-MvcConfig.xml</param-value>  
    </init-param>  
    <load-on-startup>1</load-on-startup>  
</servlet>  
  
<servlet-mapping>  
    <servlet-name>webmvc</servlet-name>  
    <url-pattern>/</url-pattern>  
</servlet-mapping>  

編碼方式:
 
 
Java代碼 [圖片上傳中。舵抹。肪虎。(8)]

@Order(3)  
//spring DispatcherServlet的配置,其它servlet和監(jiān)聽器等需要額外聲明,用@Order注解設(shè)定啟動順序  
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {  
    /* 
      * DispatcherServlet的映射路徑 
      */  
    @Override  
    protected String[] getServletMappings() {  
        return new String[]{"/"};  
    }  
   
    /* 
      * 應(yīng)用上下文惧蛹,除web部分 
      */  
    @SuppressWarnings({ "unchecked", "rawtypes" })  
    @Override  
    protected Class[] getRootConfigClasses() {  
        //加載配置文件類扇救,這里與上面的xml配置是對應(yīng)的,需要使用@Configuration注解進行標注香嗓,稍后介紹  
        return new Class[] {AppConfig.class, SpringSecurityConfig.class};  
    }  
   
    /* 
      * web上下文 
      */  
    @SuppressWarnings({ "unchecked", "rawtypes" })  
    @Override  
    protected Class[] getServletConfigClasses() {  
        return new Class[] {MvcConfig.class};  
    }  
   
    /* 
      * 注冊過濾器迅腔,映射路徑與DispatcherServlet一致,路徑不一致的過濾器需要注冊到另外的WebApplicationInitializer中 
      */  
    @Override  
    protected Filter[] getServletFilters() {  
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();  
        characterEncodingFilter.setEncoding("UTF-8");  
        characterEncodingFilter.setForceEncoding(true);  
        return new Filter[] {characterEncodingFilter};  
    }     
  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末靠娱,一起剝皮案震驚了整個濱河市沧烈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌像云,老刑警劉巖锌雀,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異迅诬,居然都是意外死亡腋逆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門侈贷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惩歉,“玉大人,你說我怎么就攤上這事俏蛮〕虐觯” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵嫁蛇,是天一觀的道長锨并。 經(jīng)常有香客問我,道長睬棚,這世上最難降的妖魔是什么蹦疑? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任见秤,我火速辦了婚禮留夜,結(jié)果婚禮上撬碟,老公的妹妹穿的比我還像新娘。我一直安慰自己底靠,他們只是感情好害晦,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般壹瘟。 火紅的嫁衣襯著肌膚如雪鲫剿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天稻轨,我揣著相機與錄音灵莲,去河邊找鬼。 笑死殴俱,一個胖子當著我的面吹牛政冻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播线欲,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼明场,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了李丰?” 一聲冷哼從身側(cè)響起苦锨,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嫌套,沒想到半個月后逆屡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體圾旨,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡踱讨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了砍的。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痹筛。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖廓鞠,靈堂內(nèi)的尸體忽然破棺而出帚稠,到底是詐尸還是另有隱情,我是刑警寧澤床佳,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布滋早,位于F島的核電站,受9級特大地震影響砌们,放射性物質(zhì)發(fā)生泄漏杆麸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一浪感、第九天 我趴在偏房一處隱蔽的房頂上張望昔头。 院中可真熱鬧,春花似錦影兽、人聲如沸揭斧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讹开。三九已至盅视,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旦万,已是汗流浹背左冬。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纸型,地道東北人拇砰。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像狰腌,于是被迫代替她去往敵國和親除破。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理琼腔,服務(wù)發(fā)現(xiàn)瑰枫,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,810評論 6 342
  • servlet3.0+規(guī)范后丹莲,允許servlet光坝,filter,listener不必聲明在web.xml中甥材,而是以...
    lovePython閱讀 6,767評論 1 5
  • spring官方文檔:http://docs.spring.io/spring/docs/current/spri...
    牛馬風情閱讀 1,672評論 0 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法盯另,類相關(guān)的語法,內(nèi)部類的語法洲赵,繼承相關(guān)的語法鸳惯,異常的語法,線程的語...
    子非魚_t_閱讀 31,631評論 18 399