文章目录
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);
}
}