Spring Web MVC框架学习之配置Spring Web MVC

这一篇文章讲的是Spring Web MVC各部分的配置方法,包括Java代码配置和XML文件配置以及MVC命名空间的使用方法。

启用MVC Java配置和XML命名空间

默认配置

要启用MVC Java配置(@Controller等各种注解)和XML命名空间,如果使用的是Java配置,在配置类上再添加@EnableWebMvc注解即可。

@Configuration
@EnableWebMvc
public class WebAppConfig {

}

如果使用XML配置文件的话,添加下面一行即可。

<mvc:annotation-driven/>

不论使用哪种方式,都会在Spring中注册一些组件来提供最基本的MVC功能。这些功能在文档中说的很清楚。我简单翻译了一下:

上面的配置会注册一个RequestMappingHandlerMapping,一个RequestMappingHandlerAdapter和一个ExceptionHandlerExceptionResolver来提供注解控制器和注解方法(比如@RequestMapping和@ExceptionHandler等)处理请求的功能。

还会启用以下功能:

  1. 通过一个ConversionService实例,来进行Spring 3 方式的类型转换及数据绑定支持。
  2. @NumberFormat格式化数字字段的支持
  3. @DateTimeFormat格式化Date、Calendar、Long、JodaTime类型字段的支持。
  4. 在控制器方法上使用@Valid验证Bean的支持,如果检测到JSR-303 Bean验证的实现。
  5. 一组HttpMessageConverter,用于在字符串和所需Java类型之间进行类型转换,具体的列表参见Spring文档 22.16.1. Enabling the MVC Java Config or the MVC XML Namespace。

通过这些默认配置,我们即可开始最基本的Spring MVC使用。

自定义配置

上面提供了最基本的配置。如果需要自定义某些配置也可以。如果使用Java配置的话,让配置类实现WebMvcConfigurer接口,更常用的办法是继承WebMvcConfigurerAdapter基类,通过重写基类中的方法即可配置相关功能。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    //有很多个方法可以重写,来提供自定义功能

}

如果使用XML配置文件,通过IDE的自动补全功能查看一下<mvc:annotation-driven/>有哪些子属性和子元素。

类型转换和格式化

默认情况下Spring注册了Number(包括所有基本数字类型)和java.util.Date的类型转换和格式化功能。要提供类型的转换和格式化功能,就需要自己注册相应的类型转换器和格式化器。

如果使用Java配置的话,重写addFormatters(FormatterRegistry registry)方法并添加相应功能即可。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addFormatters(FormatterRegistry registry) {
    // Add formatters and/or converters
  }

}

如果使用XML配置的话,需要注册一个ConversionService,然后添加到<mvc:annotation-driven>节点中。

  <mvc:annotation-driven conversion-service="conversionService"/>

  <bean id="conversionService"
      class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
      <set>
        <bean class="org.example.MyConverter"/>
      </set>
    </property>
    <property name="formatters">
      <set>
        <bean class="org.example.MyFormatter"/>
        <bean class="org.example.MyAnnotationFormatterFactory"/>
      </set>
    </property>
    <property name="formatterRegistrars">
      <set>
        <bean class="org.example.MyFormatterRegistrar"/>
      </set>
    </property>
  </bean>

验证功能

Spring自己提供了一组接口和类提供了一套验证功能。不过更通用的方法是使用Bean Validation进行Java对象的验证,Bean Validation的一个实现就是Hibernate Validator。

默认情况下当@EnableWebMvc或<mvc:annotation-driven/>配置之后,如果Spring检测到Bean Validation,就会自动注册一个LocalValidatorFactoryBean来提供验证功能。如果我们希望手动处理验证过程,可能希望将验证器实例注入到控制器中,这时候就不能使用自动注册的LocalValidatorFactoryBean了。这时候我们可以选择手动注册一个LocalValidatorFactoryBeanBean实例,然后注解@Primary让自定义LocalValidatorFactoryBean被优先使用。

还有一种办法就是直接覆盖Spring的默认验证器配置。如果使用Java配置的话,重写getValidator()方法即可。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public Validator getValidator() {
    // return "global" validator
  }

}

如果使用XML配置文件,定义一个Validator然后添加到<mvc:annotation-driven>中。

<mvc:annotation-driven validator="globalValidator"/>

上面定义的都是全局验证器,我们也可以在某个控制器中定义一个局部验证器,然后和全局验证器结合起来使用。这时候需要使用@InitBinder注解方法。

@Controller
public class MyController {

  @InitBinder
  protected void initBinder(WebDataBinder binder) {
    binder.addValidators(new FooValidator());
  }

}

配置好验证器之后。当Spring识别到@Valid注解的方法参数之后,就会执行验证,将验证结果绑定到BindingResult上,我们可以在方法中访问BindingResult来获取验证结果。

拦截器

我们实现了拦截器之后,就可以将其应用到Web程序中。使用Java配置的话,重写addInterceptors(InterceptorRegistry registry)方法,然后在其中添加自己的拦截器即可。如果要配置拦截路径和排除路径也可以在这里配置。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LocaleInterceptor());
    registry.addInterceptor(new ThemeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
    registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
  }

}

使用XML配置文件的话可以使用MVC命名空间,配置也比较简单。

<mvc:interceptors>
  <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
  <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <mvc:exclude-mapping path="/admin/**"/>
    <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
  </mvc:interceptor>
  <mvc:interceptor>
    <mvc:mapping path="/secure/*"/>
    <bean class="org.example.SecurityInterceptor"/>
  </mvc:interceptor>
</mvc:interceptors>

视图控制器

这是一种定义ParameterizableViewController的简单方式,当该控制器被请求的时候不会执行任何逻辑操作,直接转到相应视图。视图控制器的常见用法是将网站的首页直接和/请求映射。

使用Java配置可以这样写,下面的配置将/映射到名为index的视图。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("index");
  }

}

使用XML配置也很简单。

<mvc:view-controller path="/" view-name="index"/>

视图解析器

使用Java配置,只需要重写configureViewResolvers(ViewResolverRegistry registry)方法即可。下面配置了JSP视图。如果需要其它视图解析器可以参见其相应文档,以及ViewResolverRegistry的JavaDoc。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void configureViewResolvers(ViewResolverRegistry registry) {
    registry.enableContentNegotiation(new MappingJackson2JsonView());
    registry.jsp()
        .prefix("/WEB-INF/jsp/")
        .suffix(".jsp")
        .viewClass(JstlView.class);
  }

}

如果使用XML配置文件可以使用MVC命名空间简化配置。除了内置的JSP解析器外,其它视图解析器可能还需要额外的配置,这里不再细述。

<mvc:view-resolvers>
  <mvc:jsp prefix="/WEB-INF/jsp/"
       suffix=".jsp"
       view-class="org.springframework.web.servlet.view.JstlView"/>
</mvc:view-resolvers>

资源处理

静态资源处理

这里说的主要是静态资源的处理。前面说了很多关于控制器、视图的知识,但是如何映射CSS、JS文件,前面没有说明。配置方法在这里说明。

使用Java配置的话,重写addResourceHandlers(ResourceHandlerRegistry registry)方法,然后添加相应的映射即可。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**").addResourceLocations("/resources/static/");
  }

}

使用XML配置文件 也同样简单。

<mvc:resources mapping="/static/**" location="/resources/static/"/>

这样映射之后,假如我们有/resources/static/bootstrap.css文件,那么就可以使用/static/bootstrap.css路径来访问该文件了。同样的在视图文件中也可以如此引用。还可以使用cache-period设置资源的过期时间,单位是秒。如果需要指定多个资源位置,可以使用逗号分隔。

资源的版本控制

有些频繁更新的资源可能需要版本控制,强制让客户端使用最新的资源。Spring框架也支持资源的版本控制,我们需要定义资源链来实现这个功能。资源链由一个ResourceResolver实例和多个ResourceTransformer实例组成。内建的VersionResourceResolver能满足我们的大部分需求,它可以定义一些策略来配置版本控制,例如FixedVersionStrategy会依据日期、版本号或者其他东西作为版本;ContentVersionStrategy会计算资源的MD5值。

ContentVersionStrategy策略是一个不错的策略,不过由于它会计算MD5,所以开销比较大, 因此在使用这种策略的时候最好打开缓存来提高性能。

如果使用Java配置的话,和前面的例子差不多,只不过需要多调用resourceChain(true)等方法并添加相应的版本资源解析器和版本策略。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**")
        .addResourceLocations("/resources/static/")
        .resourceChain(true).addResolver(
          new VersionResourceResolver().addContentVersionStrategy("/**"));
  }

}

下面是使用XML配置的例子。

<mvc:resources mapping="/static/**" location="/resources/static/">
  <mvc:resource-chain>
    <mvc:resource-cache/>
    <mvc:resolvers>
      <mvc:version-resolver>
        <mvc:content-version-strategy patterns="/**"/>
      </mvc:version-resolver>
    </mvc:resolvers>
  </mvc:resource-chain>
</mvc:resources>

默认Servlet

开启这个选项可以让DispatcherServlet处理根路径/下的静态资源请求,说的详细点就是假如静态文件是webapp/css/site.css,那么我们可以直接通过/css/site.css来访问这个文件。如果不启用这个功能,那么静态文件就只能映射到其他路径下比如/static。

这个配置项实际上会配置一个DefaultServletHttpRequestHandler,映射到路径/**,并具有最低的优先级。由于DefaultServletHttpRequestHandler会将所有请求转发到默认Servlet,所以它必须被配置为最后一个处理映射才行。

使用Java配置的话,重写configureDefaultServletHandling(...)方法并开启该选项。

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
  }

}

如果使用XML配置的话,添加以下行。

<mvc:default-servlet-handler/>

消息转换

如果我们需要覆盖Spring默认的消息转换器,可以重写configureMessageConverters(List<HttpMessageConverter<?>> converters)方法,然后向converters参数添加我们自己的消息转换器。如果仅仅希望增加自己的类型转换器,重写extendMessageConverters()方法。

使用XML配置文件的话,可以使用MVC命名空间。

<mvc:annotation-driven>
  <mvc:message-converters>
    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
      <property name="objectMapper" ref="objectMapper"/>
    </bean>
    <bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter">
      <property name="objectMapper" ref="xmlMapper"/>
    </bean>
  </mvc:message-converters>
</mvc:annotation-driven>

高级自定义配置

上面的配置使用Spring提供的简化类或者MVC命名空间,帮助我们快速配置功能。有时候可能需要更高级的功能定制,这样就需要自己处理这些底层Bean的初始化和属性设置。

Java配置自定义

我们先来看一看@EnableWebMvc注解的定义。可以看到它还使用了一个@Import注解,引用了DelegatingWebMvcConfiguration类。当我们注解@EnableWebMvc的时候,实际上初始化和配置的底层类就是DelegatingWebMvcConfiguration。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}

因此我们如果要自定义MVC的话,第一件事就是移除注解@EnableWebMvc。然后继承DelegatingWebMvcConfiguration类并实现它的requestMappingHandlerAdapter()方法。

@Configuration
public class WebConfig extends DelegatingWebMvcConfiguration {

  @Override
  @Bean
  public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
    // 在这里进行高级配置
  }

}

在项目中DelegatingWebMvcConfiguration子类和@EnableWebMvc注解配置类只能存在一个,因为它们做的事情实际上是一样的。而且这里的配置并不影响Spring MVC的其他配置。

自定义MVC命名空间配置

这里的自定义配置更困难,因为Spring没有提供相应的配置机制。如果实在需要自定义MVC命名空间配置,可以考虑使用Spring提供的BeanPostProcessor机制,在检测到Bean之后修改它的值。

@Component
public class MyPostProcessor implements BeanPostProcessor {

  public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException {
    if (bean instanceof RequestMappingHandlerAdapter) {
      // 在这里自定义属性
    }
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringMVC中Json数据格式转换

    1  @RequestBody 作用: @RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json.xml等格式的数据并绑定到controller方法的参数上. List.action?id=1&name=zhangsan&age=12 本例子应用: @RequestBody注解实现接收http请求的json数据,将json数据转换为java对象  2  @ResponseBody 作

  • SpringMVC中日期格式的转换

    解决日期提交转换异常的问题 由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型.所以需要自定义参数绑定.前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定.在springmvc这可以在处理器适配器上自定义Converter进行参数绑定.如果使用<mvc:annotation-driven/>可以在此标签上进行扩展. 1.自定义DataConvertor类, 并实现Convertor接口 p

  • 详解在Spring MVC中使用注解的方式校验RequestParams

    概述 Spring MVC支持Bean Validation,通过这个验证技术,可以通过注解方式,很方便的对输入参数进行验证,之前使用的校验方式,都是基于Bean对象的,但是在@RequestParam中,没有Bean对象,这样使得校验无法进行,可以通过使用@Validated注解,使得校验可以进行. 校验bean对象 一般校验bean对象,为了可以自动的校验属性,可以通过两步解决: 一.声明对象 package com.github.yongzhizhan.draftbox.model; im

  • Spring mvc实现Restful返回xml格式数据实例详解

    spring mvc实现Restful返回xml格式数据 最近,想在自己的小项目中搭建一个Restful风格的服务接口api,项目用的spring mvc 3,听说spring mvc本身就能十分方便的支持restful的实现,于是查询了下资料,果然非常强大. 在一次偶然的#墙#外#(你懂的)状态下浏览到了一个老外的博客,举了几个入门例子十分经典,原文是E文+被墙状态,觉得有必要扒过来收藏学习下. 在本示例中,我们将向您展示如何将对象转换成xml格式并通过spring mvc框架返回给用户. 技

  • Spring mvc实现Restful返回json格式数据实例详解

    在本示例中,我们将向您展示如何将对象转换成json格式并通过spring mvc框架返回给用户. 使用技术及环境: Spring 3.2.2.RELEASE Jackson 1.9.10 JDK 1.6 Eclipse 3.6 Maven 3 PS:在spring 3 中,要输出json数据,只需要添加Jackson 库到你的classpath. 1.项目依赖 spring和jackson的依赖: <project xmlns="http://maven.apache.org/POM/4.

  • Spring Web MVC框架学习之配置Spring Web MVC

    这一篇文章讲的是Spring Web MVC各部分的配置方法,包括Java代码配置和XML文件配置以及MVC命名空间的使用方法. 启用MVC Java配置和XML命名空间 默认配置 要启用MVC Java配置(@Controller等各种注解)和XML命名空间,如果使用的是Java配置,在配置类上再添加@EnableWebMvc注解即可. @Configuration @EnableWebMvc public class WebAppConfig { } 如果使用XML配置文件的话,添加下面一行

  • 浅谈Spring Boot日志框架实践

    Java应用中,日志一般分为以下5个级别: ERROR 错误信息 WARN 警告信息 INFO 一般信息 DEBUG 调试信息 TRACE 跟踪信息 Spring Boot使用Apache的Commons Logging作为内部的日志框架,其仅仅是一个日志接口,在实际应用中需要为该接口来指定相应的日志实现. SpringBt默认的日志实现是Java Util Logging,是JDK自带的日志包,此外SpringBt当然也支持Log4J.Logback这类很流行的日志实现. 统一将上面这些 日志

  • Spring MVC完全注解方式配置web项目

    在servlet 3.0 开始web项目可以完全不需要web.xml配置文件了,所以本文的配置只在支持servlet 3.0及以上的web容器中有效 使用的是spring mvc (4.3.2.RELEASE) + thymeleaf(3.0.2.RELEASE), 持久层使用的 spring的 JdbcTemplate, PS:推荐一个很好用的对JdbcTemplate封装的框架:https://github.com/selfly/dexcoder-assistant  . 下面开始具体的配置

  • Spring MVC框架配置方法详解

    本文实例为大家分享了Spring MVC框架配置方法,供大家参考,具体内容如下 1.概述 Spring MVC 作用:用来实现前端浏览器与后面程序的交互 Spring MVC 是基于Spring 的MVC框架,所谓MVC(model,controller,view) ,整个Spring MVC 作用就是,基于Spring 将model(数据)在controller(后台程序) ,view(前端浏览器)之间交互 至于Spring MVC优点缺点,了解不深 不作评价, 2.引用的jar包 既然是基于

  • Spring MVC 框架搭建配置方法及详解

    现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不过要想灵活运用Spring MVC来应对大多数的Web开发,就必须要掌握它的配置及原理. 一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.jar.comm

  • 深入理解Spring MVC概要与环境配置

    一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务逻辑间的双向偶合.MVC不是一种设计模式,MVC是一种架构模式.当然不同的MVC存在差异. 在web早期的开发中,通常采用的都是Model1.Model1中,如图所示主要分为两层,视图层和模型层.Model2把一个项目分成三部分,包括视图.控制.模型.这样不仅提高的代码的复用率与项目的扩展性,且大大

  • spring框架学习总结

    目录 Spring 框架概述 Spring优点 Spring体系结构 Spring拓展 Spring Boot与Spring Cloud Spring IoC 容器 (IoC 也称为依赖项注入(DI),或DI是实现IoC的一种方法) IoC容器概述 Spring入门程序 IoC创建对象的三种方式 通过无参构造(要提供set方法) 通过有参构造(要提供get方法) 通过工厂类 Spring依赖注入(DI)和Bean的作用域 Spring 常用配置及属性 Spring自动装配 Spring注解开发

  • Spring框架学习常用注解汇总

    目录 类注解 方法或属性上注解 参数注解 类注解 @component 标注类,泛指各种组件,类不属于各种分类的时候,用它做标注. @Service 标注类,声明该类为业务层组件,用于处理业务逻辑 @Repositor 标注类,声明该类为持久层的接口.使用后,在启动主程序类上需要添加@MapperScan("xxx.xxx.xxx.mapper")注解 @Mapper 标注类,用在持久层的接口上,注解使用后相当于@Reponsitory加@MapperScan注解,会自动进行配置加载

  • Java环境中MyBatis与Spring或Spring MVC框架的集成方法

    与Spring3集成 Spring作为基础框架,可以集成后端框架,如Hibernate,MyBatis等. 前面是介绍单独使用MyBatis的,大致逻辑是: sqlSessionFactory <- configuration file (包括数据库连接配置) IXxxMapper <- sqlSession <- sqlSessionFactory                      <- mapper interface <- mapper xml 得到IxxMap

  • JavaWeb开发之Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架

    简单介绍一下,本框架的基本功能点: Spring:整个框架的主体部分,这个自不用说. SpringMVC:MVC部分我还是比较喜欢Spring的. MyBatis:选型的时候选择这个ORM主要也是考虑其灵活性的问题,毕竟我也不知道,今后会遇到怎样的需求,用Hibernate一来是不太会用,二来,我还是比较喜欢直接写SQL来的简单一点. SpringSecurity:这个主要是安全框架,负责用户登录验证及整站权限分配的相关事项(权限分配真的很有用,这个我就不多说了). EhCache:一个非常流行

随机推荐