SSM中 Spring MVC配置

传统的web.xml配置

web.xml

contextConfigLocation

classpath*:applicationContext.xml

org.springframework.web.context.ContextLoaderListener

encodingFilter

org.springframework.web.filter.CharacterEncodingFilter

encoding

UTF-8

encodingFilter

/*

SpringMVC

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:spring-mvc.xml

SpringMVC

/

spring-mvc.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:beans="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc.xsd

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd">

id="internalResourceViewResolver">

基于java配置的方式

现在JavaConfig配置方式在逐步取代xml配置方式。而WebApplicationInitializer可以看做是Web.xml的替代,它是一个接口。通过实现WebApplicationInitializer,在其中可以添加servlet,listener等,在加载Web项目的时候会加载这个接口实现类,从而起到web.xml相同的作用。

SpittrWebAppInitializer 主配置类

//扩展自Abstrac~Initializer的任意类,都会自动地配置Dispatcher-Servlet和Spring应用上下文

//spring的应用上下文会位于程序的Servlet上下文之中

public class SpittrWebAppInitializer extends

AbstractAnnotationConfigDispatcherServletInitializer {

@Override

protected Class>[] getServletConfigClasses() {

return new Class>[] { WebConfig.class };

}

//映射“/”,表示会使用默认的Servlet

@Override

protected String[] getServletMappings() {

return new String[] { "/" };

}

@Override

protected Class>[] getRootConfigClasses() {

// TODO Auto-generated method stub

return null;

}

@Override

protected Filter[] getServletFilters() {

final CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();

encodingFilter.setEncoding("UTF-8");

encodingFilter.setForceEncoding(true);

return new Filter[] { encodingFilter };

}

}

我们创建的SpittrWebAppInitializer这个类是继承了

AbstractAnnotationConfigDispatcherServletInitializer,其继承关系为:

AbstractAnnotationConfigDispatcherServletInitializer extends AbstractDispatcherServletInitializer extends AbstractContextLoaderInitializer implements WebApplicationInitializer

AbstractDispatcherServletInitializer对DispatcherServlet进行了自动配置和初始化;AbstractContextLoaderInitializer初始化和配置了Spring应用的上下文。因此,任意继承自这个类的类都会通过创建DispatcherServlet和ContextLoaderListener,自动配置DispatcherServlet和Spring应用上下文,但是真正完成配置上下文的是WebApplicationInitializer接口。

WebApplicationInitializer接口

WebApplicationInitializer接口是如何完成配置的呢?其只有一个方法onStartup,看不出什么头绪。但是,在这个包下有另外一个类,SpringServletContainerInitializer。

public interface WebApplicationInitializer {

void onStartup(ServletContext servletContext) throws ServletException;

}

@HandlesTypes(WebApplicationInitializer.class)

public class SpringServletContainerInitializer implements ServletContainerInitializer {

@Override

public void onStartup(Set> webAppInitializerClasses, ServletContext servletContext)

throws ServletException {

List initializers = new LinkedList();

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;

}

servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath");

AnnotationAwareOrderComparator.sort(initializers);

for (WebApplicationInitializer initializer : initializers) {

initializer.onStartup(servletContext);

}

}

}

SpringServletContainerInitializer实现了ServletContainerInitializer接口,其在web容器启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等,servlet规范中通过ServletContainerInitializer实现此功能。每个框架要使用ServletContainerInitializer就必须在对应的jar包的META-INF/services 目录创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer实现类,那么,当web容器启动时就会运行这个初始化器做一些组件内的初始化工作。

一般伴随着ServletContainerInitializer一起使用的还有HandlesTypes注解,通过HandlesTypes可以将HandlesTypes指定的类或者实现该接口的类注入到SpringServletContainerInitializer的onStartup方法作为参数传入。

Tomcat容器的ServletContainerInitializer机制的实现,主要交由Context容器和ContextConfig监听器共同实现,ContextConfig监听器负责在容器启动时读取每个web应用的WEB-INF/lib目录下包含的jar包的META-INF/services/javax.servlet.ServletContainerInitializer,以及web根目录下的META-INF/services/javax.servlet.ServletContainerInitializer,通过反射完成这些ServletContainerInitializer的实例化,然后再设置到Context容器中,最后Context容器启动时就会分别调用每个ServletContainerInitializer的onStartup方法,并将感兴趣的类作为参数传入。

Spring Web中通常会有两种应用上下文,一种是Spring MVC上下文,这种上下文通过DispatcherServlet加载,对应上边的getServletConfigClasses()方法,另一种上下文是spring容器本身的上下文,就要通过ContextLoaderListerner创建,对应的是方法getRootConfigClasses()

WebConfig.java 类

@Configuration //标明了该类是一个配置类并且会将该类作为一个SpringBean添加到IOC容器内

@EnableWebMvc

//通过查看@EnableWebMvc的源码,可以发现该注解就是为了引入一个DelegatingWebMvcConfiguration Java 配置类。并翻看DelegatingWebMvcConfiguration的源码会发现该类似继承于WebMvcConfigurationSupport的类。

@ComponentScan("spitter.web")

public class WebConfig extends WebMvcConfigurerAdapter {

/**

* 配置JSP视图解析器,他会查找jsp文件,在查找的时候

* 他会在视图名称上加一个特定的前缀和后缀

* home的视图——解析成为/WEB-INF/views/home.jsp

* @return

*/

@Bean

public ViewResolver viewResolver(){

InternalResourceViewResolver resolver=

new InternalResourceViewResolver();

resolver.setPrefix("/WEB-INF/views/");

resolver.setSuffix(".jsp");

resolver.setExposeContextBeansAsAttributes(true);

return resolver;

}

/**

* 通过调用enable方法,我们要求DispatcherServelet将

* 对静态资源的请求转发到Servlet容器中的默认的Servlet上,

* 不是DispatcherServelet本身处理

* @param configurer

*/

public void configureDefaultServleHandling(DefaultServletHandlerConfigurer configurer){

configurer.enable();

}

}

WebConfig中的配置其实就是对应web.xml中spring-mvc.xml的配置。@EnableWebMvc注解内部使用了@Import(DelegatingWebMvcConfiguration.class),其作用是会把WebMvcConfigurationSupport当成配置文件来用,将其中所有标识有@Bean注解的方法配置成bean,这就成了Spring mvc的默认配置。

@Configuration

public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {

private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

@Autowired(required = false)

public void setConfigurers(List configurers) {

if (!CollectionUtils.isEmpty(configurers)) {

this.configurers.addWebMvcConfigurers(configurers);

}

}

....//省略其他方法

}

DelegatingWebMvcConfiguration继承了WebMvcConfigurationSupport类,其setConfigurers()方法在覆盖父类的方法之前,它会寻找容器中所有的WebMvcConfigurer实现类,将所有WebMvcConfigurer实现类中的配置组合起来,组成一个超级配置(WebMvcConfigurerAdapter是WebMvcConfigurer的实现类)。这样,WebMvcConfigurationSupport中的bean发布时,就会把这所有配置都带上了。

WebMvcConfigurer接口提供的功能如下表所示:

配置接口

接口说明

configurePathMatch

配置HandlerMapping路径匹配参数

configureContentNegotiation

配置路径到请求内容类型转换的相关参数,如.pdf结尾的请求解析成PDF类型或者其它等

configureAsyncSupport

配置异步请求处理相关参数

configureDefaultServletHandling

配置是否需要以下功能:如果一个请求没有被任何Handler处理,那是否使用DefaultServletHttpRequestHandler来进行处理?

addFormatters

增加额外的Converter和Formatter

addInterceptors

增加拦截器

addResourceHandlers

增加处理静态资源的Handler

addCorsMappings

配置跨域请求相关参数

addViewControllers

使用特殊的Controller来处理指定的URL请求;

configureViewResolvers

配置将Controller返回的视图名称转换成视图的视图解析器; 以便进行视图渲染

addArgumentResolvers

添加支持个性化配置Controller的方法参数类型的Resolver。

addReturnValueHandlers

添加支持个性化处理Controller返回数据类型的处理器;

configureMessageConverters

配置消息转换器;

extendMessageConverters

扩展消息转换器

configureHandlerExceptionResolvers

配置异常处理器

extendHandlerExceptionResolvers

扩展异常处理器

注意:

spring-webmvc 从5.0开始已经废除了WebMvcConfigurerAdapter类,对于spring mvc的配置可以通过直接实现WebMvcConfigurer接口来实现。

public class WebConfig implements WebMvcConfigurer

Spring boot

在spring boot中通过WebMvcAutoConfiguration自动配置类已经将配置的大部分工作完成了,可以简单的认为,WebMvcAutoConfiguration完成了之前SpittrWebAppInitializer和WebConfig的工作,提供适用于多数应用的自动配置功能。自动配置添加了以下特性:

引入ContentNegotiatingViewResolver和BeanNameViewResolver beans。

对静态资源的支持,包括对WebJars的支持。

自动注册Converter,GenericConverter,Formatter beans。

对HttpMessageConverters的支持。

自动注册MessageCodeResolver。

一般情况下是不需要改动mvc的配置的,但是如果需要添加其他mvc配置,有两种方法:

全面弃用spring boot的自动配置

直接继承WebMvcConfigurationSupport在扩展的类中重写父类的方法

使用注解@Configuration + @EnableWebMvc,并继承WebMvcConfigurationAdapter,重写父类的方法

在spring boot自动配置的基础上添加部分配置

继承WebMvcConfigurationAdapter,在扩展的类中重写父类的方法

注意:

spring boot 从2.0使用spring-webmvc 5.0因此继承WebMvcConfigurationAdapter需要替换为实现WebMvcConfigurer接口

public class WebConfig implements WebMvcConfigurer

java 方式配置ssm,关于SSM以及Spring boot中对于Spring MVC配置的问题相关推荐

  1. Spring Boot中的一些常用配置介绍!

    这篇教程将为你介绍Spring Boot 中的一些常用配置,比如:自定义 Banner.配置日志.关闭特定的自动配置等. 自定义Banner 在 Spring Boot 启动的时候会有一个默认的启动图 ...

  2. Spring Boot中的application.properties配置简介(二)

    Spring Boot中的application.properties配置简介(二)   根据上文的介绍,我们已经对Spring Boot中的application.properties配置有了一定的 ...

  3. Spring boot中使用Spring Security的记住我 remember-me功能

    Spring boot中使用Spring Security的记住我 remember-me功能 问题描述:Spring security新手,在登录时加上记住我功能,需要使用框架自带的记住我. 记住的 ...

  4. 徒手解密 Spring Boot 中的 Starter自动化配置黑魔法

    我们使用 Spring Boot,基本上都是沉醉在它 Stater 的方便之中.Starter 为我们带来了众多的自动化配置,有了这些自动化配置,我们可以不费吹灰之力就能搭建一个生产级开发环境,有的小 ...

  5. Spring Boot中使用MyBatis注解配置详解

    之前在Spring Boot中整合MyBatis时,采用了注解的配置方式,相信很多人还是比较喜欢这种优雅的方式的,也收到不少读者朋友的反馈和问题,主要集中于针对各种场景下注解如何使用,下面就对几种常见 ...

  6. webbrowser中localhost和发布的地址_004、Spring Boot中的项目属性配置

    我们知道,在项目中,很多时候需要用到一些配置的信息,这些信息可能在测试环境和生产环境下会有不同的配置,后面根据实际业务情况有可能还会做修改,针对这种情况,我们不能将这些配置在代码中写死,最好就是写到配 ...

  7. Spring Boot中使用Spring Security进行安全控制

    我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache ...

  8. Spring Boot 中使用 @Transactional 注解配置事务管理

    From: https://blog.csdn.net/nextyu/article/details/78669997 事务管理是应用系统开发中必不可少的一部分.Spring 为事务管理提供了丰富的功 ...

  9. 在 Spring Boot 中使用 Spring AOP 和 AspectJ 来测量方法的执行时间

    原文链接:https://dzone.com/articles/logging-average-method-execution-times-via-aspectj 作者:Murat Derman 译 ...

最新文章

  1. python这个软件学会能做什么工作-万万没想到,学会Python即使不做程序员都能月入过万!...
  2. 发布管理——保证变更有序与有质的进行
  3. .NET 6新特性试用 | 最小Web API
  4. python10的因数_十五道Python小案例,学会这些,Python基础已过关!
  5. 常用31个Java机器学习、深度学习、自然语言处理学习库工具
  6. python之numpy之方差numpy.var
  7. 网络管理(课程总结3)Week12 澳大利亚维多利亚大学VIT1104 Computer Networks
  8. 磁共振指纹压缩感知框架
  9. 视打击微软 力挺国产红旗Linux
  10. Symbian OS应用编程图形篇之架构
  11. 反映个把月才退了个零头 ——消费者投诉旅游平台退款难
  12. 云计算有哪些?云计算排排坐,拿去不谢
  13. 《白夜行》《幻夜》读后感
  14. 英语作文计算机国际会议开幕词,学术会议发言稿 英文(精选多篇)
  15. 洛谷p2655 2038年问题 普及/提高- 模拟
  16. 用Java实现图书管理系统
  17. 杭电4510—小Q系列故事—为什么时光不能倒流
  18. 记openssh升级,telnet安装(环境CentOS 7.9。 晗旧版本的不同补充)
  19. SNMP 企业节点(Private Enterprise OID)大全及申请
  20. 三、鼎捷T100总账管理之日常会计业务管理篇

热门文章

  1. 编写自定义的AssertJ断言
  2. java中文件处理之图片_在Java 7中处理文件
  3. 十大最常见的Java性能问题
  4. 仍不切换到Java 8的6个理由
  5. Java字符串的十大问题
  6. Apache Server和JMeter调试
  7. Hadoop + Amazon EC2 –更新的教程
  8. 使用JMSTester对JMS层进行基准测试
  9. IBM JVM调整– gencon GC策略
  10. 编写Play 2的模块,第2部分:拦截器