日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringMVC4零配置--web.xml

發(fā)布時(shí)間:2023/12/9 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringMVC4零配置--web.xml 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

ServletContainerInitializer:啟動(dòng)容器時(shí)負(fù)責(zé)加載相關(guān)配置

Java代碼 ?
  • package?javax.servlet;??
  • import?java.util.Set;??
  • public?interface?ServletContainerInitializer?{??
  • ?public?void?onStartup(Set<Class<?>>?c,?ServletContext?ctx)??
  • ????????throws?ServletException;???
  • }??
  • ?容器啟動(dòng)時(shí)會(huì)自動(dòng)掃描當(dāng)前服務(wù)中ServletContainerInitializer的實(shí)現(xiàn)類,并調(diào)用其onStartup方法,其參數(shù)Set<Class<?>> c,可通過在實(shí)現(xiàn)類上聲明注解javax.servlet.annotation.HandlesTypes(xxx.class)注解自動(dòng)注入,@HandlesTypes會(huì)自動(dòng)掃描項(xiàng)目中所有的xxx.class的實(shí)現(xiàn)類,并將其全部注入Set。

    ?

    Spring為其提供了一個(gè)實(shí)現(xiàn)類:

    SpringServletContainerInitializer

    ?

    Java代碼 ?
  • 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等硬編碼到該接口的實(shí)現(xiàn)類中即可。比如:

    ?

    xml配置:

    ?

    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>??
  • ?編碼配置:

    ?

    ?

    Java代碼 ?
  • @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代碼 ?
  • ???????<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代碼 ?
  • @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等等,參看下面的對(duì)比:

    xml配置:

    ?

    Xml代碼 ?
  • ???????<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代碼 ?
  • @Order(3)??
  • //spring?DispatcherServlet的配置,其它servlet和監(jiān)聽器等需要額外聲明,用@Order注解設(shè)定啟動(dòng)順序??
  • public?class?WebInitializer?extends?AbstractAnnotationConfigDispatcherServletInitializer?{??
  • ????/*?
  • ??????*?DispatcherServlet的映射路徑?
  • ??????*/??
  • ????@Override??
  • ????protected?String[]?getServletMappings()?{??
  • ????????return?new?String[]{"/"};??
  • ????}??
  • ???
  • ????/*?
  • ??????*?應(yīng)用上下文,除web部分?
  • ??????*/??
  • ????@SuppressWarnings({?"unchecked",?"rawtypes"?})??
  • ????@Override??
  • ????protected?Class[]?getRootConfigClasses()?{??
  • ????????//加載配置文件類,這里與上面的xml配置是對(duì)應(yīng)的,需要使用@Configuration注解進(jìn)行標(biāo)注,稍后介紹??
  • ????????return?new?Class[]?{AppConfig.class,?SpringSecurityConfig.class};??
  • ????}??
  • ???
  • ????/*?
  • ??????*?web上下文?
  • ??????*/??
  • ????@SuppressWarnings({?"unchecked",?"rawtypes"?})??
  • ????@Override??
  • ????protected?Class[]?getServletConfigClasses()?{??
  • ????????return?new?Class[]?{MvcConfig.class};??
  • ????}??
  • ???
  • ????/*?
  • ??????*?注冊(cè)過濾器,映射路徑與DispatcherServlet一致,路徑不一致的過濾器需要注冊(cè)到另外的WebApplicationInitializer中?
  • ??????*/??
  • ????@Override??
  • ????protected?Filter[]?getServletFilters()?{??
  • ????????CharacterEncodingFilter?characterEncodingFilter?=?new?CharacterEncodingFilter();??
  • ????????characterEncodingFilter.setEncoding("UTF-8");??
  • ????????characterEncodingFilter.setForceEncoding(true);??
  • ????????return?new?Filter[]?{characterEncodingFilter};??
  • ????}?????
  • ??
  • }??
  • ?

    ?

    ?

    SpringMVC4零配置?:代碼下載

    SpringMVC4零配置--web.xml

    SpringMVC4零配置--應(yīng)用上下文配置【AppConfig】

    SpringMVC4零配置--SpringSecurity相關(guān)配置【SpringSecurityConfig】

    SpringMVC4零配置--Web上下文配置【MvcConfig】

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/hyl8218/p/6128191.html

    總結(jié)

    以上是生活随笔為你收集整理的SpringMVC4零配置--web.xml的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。