SpringMVC4零配置--web.xml
servlet3.0+规范后,允许servlet,filter,listener不必声明在web.xml中,而是以硬编码的方式存在,实现容器的零配置。
ServletContainerInitializer:启动容器时负责加载相关配置
- package javax.servlet;
 - import java.util.Set;
 - public interface ServletContainerInitializer {
 - public void onStartup(Set<Class<?>> c, ServletContext ctx)
 - throws ServletException;
 - }
 
容器启动时会自动扫描当前服务中ServletContainerInitializer的实现类,并调用其onStartup方法,其参数Set<Class<?>> c,可通过在实现类上声明注解javax.servlet.annotation.HandlesTypes(xxx.class)注解自动注入,@HandlesTypes会自动扫描项目中所有的xxx.class的实现类,并将其全部注入Set。
Spring为其提供了一个实现类:
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才是我们需要关心的接口,我们只需要将相应的servlet,filter,listener等硬编码到该接口的实现类中即可。比如:
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相关配置
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>
 
编码配置:
- @Order(2)
 - public class WebAppSecurityInitializer extends AbstractSecurityWebApplicationInitializer
 - {
 - //servletContext.addListener("org.springframework.security.web.session.HttpSessionEventPublisher");
 - //session监听器
 - @Override
 - protected boolean enableHttpSessionEventPublisher() {
 - return true;
 - }
 - }
 
2)org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer:MVC相关配置,比如加载spring配置文件,声明DispatcherServlet等等,参看下面的对比:
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>
 
编码方式:
- @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】
SpringMVC4零配置--web.xml的更多相关文章
- SpringMVC4零配置--Web上下文配置【MvcConfig】
		
与SpringSecurity的配置类似,spring同样为我们提供了一个实现类WebMvcConfigurationSupport和一个注解@EnableWebMvc以帮助我们减少bean的声明. ...
 - SpringMVC(十四):SpringMVC 与表单提交(post/put/delete的用法);form属性设置encrypt='mutilpart/form-data'时,如何正确配置web.xml才能以put方式提交表单
		
SpringMVC 与表单提交(post/put/delete的用法) 为了迎合Restful风格,提供的接口可能会包含:put.delete提交方式.在springmvc中实现表单以put.dele ...
 - 配置web.xml和glassfish容器实现javaEE表单验证
		
web.xml配置: <!-- 声明用于安全约束的角色 --> <security-role> <role-name>ReimUser</role-name& ...
 - 详解Parcel:快速,零配置web应用打包工具。
		
译者按: 新一代Web应用打包工具Parcel横空出世,快速.零配置的特点让人眼前一亮. 原文: Everything You Need To Know About Parcel: The Blazi ...
 - 在springBoot中配置web.xml中配置的servlet
		
第一种 web.xml (截取的需要转换的) 当拦截到 /socke t时执行该servlet <servlet> <servlet-name>websocket</se ...
 - [从零开始搭网站五]http网站Tomcat配置web.xml和server.xml
		
点击下面连接查看从零开始搭网站全系列 从零开始搭网站 上一章我们在CentOS下搭建了Tomcat,但是还是没有跑起来...那么这一章就把最后的配置给大家放上去. 有两种方式:一种是用 rm -f 给 ...
 - servlet为什么要配置web.xml
		
(1).为Servlet命名: <servlet> <servlet-name>servlet1</servlet-name> <- 这是用于,在serv ...
 - Spring 框架配置web.xml 整合web struts
		
package cn.itcast.e_web; import java.io.IOException; import javax.servlet.ServletContext; import jav ...
 - 按照TomCat版本重新配置web.xml文件
		
在TomCat的目录:C:\Program Files\Apache Software Foundation\Tomcat 9.0_Tomcat9.2\webapps\ROOT\WEB-INF下的we ...
 
随机推荐
- 使用Ruby来实现批量更新AD中字段
			
准备工作 安装需要用到的gem gem install net-ldap gem install roo 准备好要更新的数据,比如exel表: /root/account.xlsx,内容如下 姓名 性 ...
 - Entity Framework 简单查询
			
前言 首先来简单的复习一下如何使用Code First. 第一步还是先建立一个控制台的应用程序,然后通过Nuget添加Entity Framework.那么同时会给packages.config和Ap ...
 - 得到 window.open 新页面中的数据
			
1.htm 页面 单击按 '钮后' 调用window.open方法,开启新窗口 2.htm 想实现---------------------- 在2.htm页面单击按钮 将相应的数据返回到 1. ...
 - ACM/ICPC 之 DFS+SPFA-贪心+最短路(POJ2679)
			
//POJ2679 //DFS+SPFA+邻接表 //只能走每个点费用最小的边,相同则需保证距离最短 //求最小费用及最短距离 //Time:47Ms Memory:900K #include< ...
 - 在桌面程序上和Metro/Modern/Windows store app的交互(相互打开,配置读取)
			
这个标题真是取得我都觉得蛋疼..微软改名狂魔搞得我都不知道要叫哪个好.. 这边记录一下自己的桌面程序跟windows store app交互的过程. 由于某些原因,微软的商店应用的安全沙箱导致很多事情 ...
 - Ansible Ubuntu 安装部署
			
一.安装: $ sudo apt-get install ansible 二.配置: a.基本配置 $ cd /etc/ansible/ $ sudo cp hosts hosts_back 备份一个 ...
 - mac 给某个目录添加权限
			
1 cd 到这个目录的上一层目录 2 sudo chmod -R 777 3 输入密码 4 完成
 - iOS动画效果和实现
			
动画效果提供了状态或页面转换时流畅的用户体验,在iOS系统中,咱们不需要自己编写绘制动画的代码,Core Animation提供了丰富的api来实现你需要的动画效果. UIKit只用UIView来展示 ...
 - zsh 命令提示符 PROMPT
			
使用上zsh后,发现命令提示符显示不了当前的路径,和一般的Linux系统默认提示不一致.配置自己的提示符: 更改配置文件.zshrc,添加配置PROMPT='%m:%. $',重新打开一个窗口生效. ...
 - 浅谈Yii-admin的权限控制
			
说到CMS,最需要有的东西就是权限控制,特别是一些复杂的场景,多用户,多角色,多部门,子父级查看等等.最近在开发一个线下销售的东东,这个系统分为管理员端,省代端,客户端,门店端,销售端, 部门端,部门 ...