哈尔滨网站建设网络优化,东莞网络推广策略,加盟企业网站建设目的,广告设计制作图片servlet3.0规范后#xff0c;允许servlet#xff0c;filter#xff0c;listener不必声明在web.xml中#xff0c;而是以硬编码的方式存在#xff0c;实现容器的零配置。 ServletContainerInitializer#xff1a;启动容器时负责加载相关配置 Java代码 package javax.servl… servlet3.0规范后允许servletfilterlistener不必声明在web.xml中而是以硬编码的方式存在实现容器的零配置。 ServletContainerInitializer启动容器时负责加载相关配置 Java代码 package javax.servlet; import java.util.Set; public interface ServletContainerInitializer { public void onStartup(SetClass? c, ServletContext ctx) throws ServletException; } 容器启动时会自动扫描当前服务中ServletContainerInitializer的实现类并调用其onStartup方法其参数SetClass? c可通过在实现类上声明注解javax.servlet.annotation.HandlesTypes(xxx.class)注解自动注入HandlesTypes会自动扫描项目中所有的xxx.class的实现类并将其全部注入Set。 Spring为其提供了一个实现类 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(SetClass? webAppInitializerClasses, ServletContext servletContext) throws ServletException { ListWebApplicationInitializer initializers new LinkedListWebApplicationInitializer(); 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才是我们需要关心的接口我们只需要将相应的servletfilterlistener等硬编码到该接口的实现类中即可。比如 xml配置 Xml代码 !-- Log4jConfigListener -- context-param param-namelog4jConfigLocation/param-name param-valueclasspath:config/properties/log4j.properties/param-value /context-param listener listener-classorg.springframework.web.util.Log4jConfigListener/listener-class /listener !-- OpenSessionInViewFilter -- filter filter-namehibernateFilter/filter-name filter-class org.springframework.orm.hibernate4.support.OpenSessionInViewFilter /filter-class /filter filter-mapping filter-namehibernateFilter/filter-name url-pattern/*/url-pattern /filter-mapping !-- DemoServlet -- servlet servlet-namedemoServlet/servlet-name servlet-classweb.function.servlet.DemoServlet/servlet-class load-on-startup2/load-on-startup /servlet servlet-mapping servlet-namedemoServlet/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的抽象类我们只需要继承并按需修改即可比如 1org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer SpringSecurity相关配置 xml配置 Xml代码 listener listener-classorg.springframework.security.web.session.HttpSessionEventPublisher/listener-class /listener filter filter-namespringSecurityFilterChain/filter-name filter-classorg.springframework.web.filter.DelegatingFilterProxy/filter-class /filter filter-mapping filter-namespringSecurityFilterChain/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监听器 Override protected boolean enableHttpSessionEventPublisher() { return true; } } 2org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializerMVC相关配置比如加载spring配置文件声明DispatcherServlet等等参看下面的对比 xml配置 Xml代码 context-param param-namecontextConfigLocation/param-name param-value classpath:config/context/applicationContext-AppConfig.xml, classpath:config/context/applicationContext-SpringSecurityConfig.xml /param-value /context-param listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener filter filter-nameSet Character Encoding/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter filter-mapping filter-nameSet Character Encoding/filter-name url-pattern/*/url-pattern /filter-mapping servlet servlet-namewebmvc/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-valueclasspath:config/context/applicationContext-MvcConfig.xml/param-value /init-param load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namewebmvc/servlet-name url-pattern//url-pattern /servlet-mapping 编码方式 Java代码 Order(3) //spring DispatcherServlet的配置,其它servlet和监听器等需要额外声明用Order注解设定启动顺序 public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { /* * DispatcherServlet的映射路径 */ Override protected String[] getServletMappings() { return new String[]{/}; } /* * 应用上下文除web部分 */ SuppressWarnings({ unchecked, rawtypes }) Override protected Class[] getRootConfigClasses() { //加载配置文件类这里与上面的xml配置是对应的需要使用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}; } } SpringMVC4零配置 代码下载 SpringMVC4零配置--web.xml SpringMVC4零配置--应用上下文配置【AppConfig】 SpringMVC4零配置--SpringSecurity相关配置【SpringSecurityConfig】 SpringMVC4零配置--Web上下文配置【MvcConfig】 转载于:https://www.cnblogs.com/hyl8218/p/6128191.html