SpringMVC--10配置过滤器以及Json

文章目录

12 配置过滤器

在SpringMVC中我们依然可以使用过滤器来进行一些处理,我们可以像在Servlet阶段在web.xml中配置,也可以使用SpringMVC提供的Java类来配置

12.1 在web.xml配置

<filter>
  <filter-name>characterFilter</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>
</filter>
<filter-mapping>
  <filter-name>characterFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

12.2 Java类配置

在Java类配置的话,我们需要在初始化的类,也就是去配置Spring配置文件和映射路径的类,重新getServletFilters方法

public class ApplicationInitialize extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{ApplicationContext.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{MvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
		protected Filter[] getServletFilters() {
  	CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
  	characterEncodingFilter.setEncoding("UTF-8");
  	// 强制覆盖,这里会把响应的编码也设置
  	characterEncodingFilter.setForceEncoding(true);
  	// 多个过滤器可以在数组中去继续添加
  	return new Filter[] {characterEncodingFilter};
		}
}

13 Json数据

13.1 简介

是一种数据的交换格式,也是一种数据的交换标准,主要用于浏览器和服务器之间的数据交互

格式:{“属性名称”:属性值}

13.2 结构

{
  "key": "value",
  "key2": "value2",
  "key3": null,
  "student": {
    "name": "xiaolong",
    "age": 18,
    "course": {
      "courseName": "vip11",
      "courseAddress": "只支持双引号"
    }
  }
}

13.3 Jackson

Jackson和FastJson一样是一个java用于处理JSON数据的类库,但是Spring中默认使用的Jackson,所以对Jackson的支持是比较好的,直接将依赖导入即可使用

注意:

  • 默认的Jackson在导入依赖后,还需要确保SpringMVC的配置文件中开启了注解驱动的支持
  • 在使用java类来配置SpringMVC的时候,注解驱动也开启了,但是没有自动去使用Jackson(也有可能是我配置错了),可以选择在配置类中添加Jackson的转化器。具体添加方法可以参照后面设置时间响应。

13.3.1 导入依赖

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.9</version>
</dependency>

13.3.2 SpringMVC中的简单使用

13.3.2.1 响应对象

我们可以直接响应一个对象回去,而不是响应字符串

@GetMapping("/request")
  public Student rest1() {
    Student student = new Student();
    student.setName("晓龙");
    student.setAge(23);
    return student;
  }
13.3.2.2 响应集合

通过Jackson的处理后,我们也可以返回一个map集合

@GetMapping("/request")
  public Map<String, String> test1() {
    HashMap<String, String> map = new HashMap<>();
    map.put("state", "成功");
    return map;
  }

13.3.3 局部处理时间响应

如果我们想要返回一个时间响应,通过Jackson就可以帮我们来处理,我们可以选择局部的方法,采用的是Jackson为我们提供的注解@JsonFormat

注意:

  • 该注解使用在我们对应的属性字段上
  • 该注解的pattern就是我们设置的格式
  • Jackson在处理时间的时候,默认是不会去计算当地时间,我们需要手动加上东八
/**
   * pattern:时间的格式
   * timezone:时区
   */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date birthday;

13.3.4 全局处理时间响应

对于时间的处理,Jackson也提供了全局的方法,需要我们去配置转化器

13.3.4.1 基于配置文件
<mvc:annotation-driven>
    <mvc:message-converters>
   
      <!--Spring提供的Jackson的转化器-->
      <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <!--设置对象映射-->
        <property name="objectMapper">
          <!--映射的对象就是Jackson提供的映射-->
          <bean class="com.fasterxml.jackson.databind.ObjectMapper">
            <!--设置映射对象里面的时间格式-->
            <property name="dateFormat">
              <!--采用java通过的SimpleDateFormat-->
              <bean class="java.text.SimpleDateFormat">
                <!--通过构造器注入格式-->
                <constructor-arg name="pattern" value="yyyy-MM-dd"/>
              </bean>
            </property>
          </bean>
        </property>
      </bean>
                
    </mvc:message-converters>
  </mvc:annotation-driven>
13.3.4.2 基于Java类
@Configurable
@EnableWebMvc
@ComponentScan(value = "com.moon", includeFilters = {
  @ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Controller.class, RestController.class})})
public class SpringMvcConfig implements WebMvcConfigurer {
  /**
   * 添加转化器
   */
  @Override
  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    // 添加jackson转化器
    MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
    // 实例对象映射
    ObjectMapper objectMapper = new ObjectMapper();
    // 设置时间格式工厂
    objectMapper.setDateFormat(new SimpleDateFormat("yyyy年MM月dd日  HH时mm分ss秒"));
    // 添加到jackson转化器
    jackson2HttpMessageConverter.setObjectMapper(objectMapper);
    converters.add(jackson2HttpMessageConverter);
  }
}
上一篇:属性序列化自定义与字母表排序-JSON框架Jackson精解第3篇


下一篇:Maven 打包程序如何使用可在外部修改的配置文件