SpringMVC JSON传递参数 多视图解析 自定义类型转换 拦截器

springMVC

属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2(一般老项目使用)等。

返回结果为Bean对象,name又如何转换成JSON对象输出?

Controller层

1
2
3
4
5
6
7
8
9
@RequestMapping(value = "/showJson")//,produces = {"application/json;charset=utf-8"})
@ResponseBody
public String showJson(){
UserMessage um = new UserMessage();
um.setError("exception");
um.setMessage("异常");
//return "{\"error\":\"exception\",\"message\":\"异常\"}";
return JSON.toJSONString(um);
}

在上述代码中,通过

1
@RequestMapping

指定请求的URL。
通过

1
@ResponseBody

来进行处理结果的输出。
在方法体内,通过um对象将um转换成JSON格式的字符串。

解决JSON数据传递的中文乱码问题

局部指定的编码集,如上述代码注释的部分

1
produces = {"application/json;charset=utf-8"}

在sringmvc-servlet.xml 中解决JSON数据传递的中文乱码问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<mvc:annotation-driven >
<mvc:message-converters>
<!--解决springmvc返回的json中文问题 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="utf-8" />
</bean>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

解决JSON数据传递的日期格式问题

在SpringMVC中使用@ResponseBody返回JSON数据是,日期默认显示为时间戳。如(512323200000),我们需要把他转换成具有可读性的 ‘yyyy-MM-dd’ 日期格式(如1986-02-28)具体的解决方案有两种:

1) 注解方式

在属性上加

1
@JSONfield(format="yyyy-MM-dd")

2)配置FastJosn消息 转换器————FastJsonHttpMessageConverter:

此方式默认格式为 yyyy-MM-dd HH:mm:ss

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<mvc:annotation-driven >
<mvc:message-converters>
<!--解决springmvc返回的json中文问题 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="utf-8" />
</bean>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json</value>
</list>
</property>
<property name="features">
<list>
<!--输出Date的日期转换器-->
<value>WriteDateUseDateFormat</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

单独配置JSP解析器

1
2
3
4
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>

多视图解析器

导入XML生成的jar包

1
2
3
4
5
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>

配置springmvc-servlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<!-- 指定JSON用什么工具解析 XML用什么工具解析-->
<property name="defaultViews">
<list>
<bean class="com.alibaba.fastjson.support.spring.FastJsonJsonView">
<property name="charset" value="UTF-8"/>
</bean>
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.entity.SmbmsUser</value>
<value>com.entity.SmbmsProvider</value>
<value>com.entity.SmbmsBill</value>
<value>com.entity.SmbmsRole</value>
<value>com.entity.SmbmsAddress</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
</list>
</property>
<!-- 指定jsp解析器-->
<!--在此配置jsp解析器后,不需要再配置专门的解析器-->
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</list>
</property>
</bean>

自定义类型转换器

单个格式转换

1
2
3
4
5
6
7
8
9
<bean name="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.converter.DataConverter" p:dataPatter="yyyy-MM-dd" />
</set>
</property>
</bean>
<!--覆盖默认的ConversionService-->
<mvc:annotation-driven conversion-service="conversionService" />
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class DataConverter implements Converter<String,Date> {
private String dataPatter;

public void setDataPatter(String dataPatter) {
this.dataPatter = dataPatter;
}

public Date convert(String s) {
Date data = null;
try {
data = new SimpleDateFormat(dataPatter).parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return data;
}
}

多个格式转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<bean name="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<!--<bean class="com.converter.DataConverter" p:dataPatter="yyyy-MM-dd"/>-->
<bean class="com.converter.DataConverters">
<property name="dataPatters">
<array>
<value>yyyy-MM-dd</value>
<value>yyyy/MM/dd</value>
<value>yyyy MM dd</value>
</array>
</property>
</bean>
</set>
</property>
</bean>
<!--覆盖默认的ConversionService-->
<mvc:annotation-driven conversion-service="conversionService" />
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class DataConverters implements Converter<String, Date> {
private String[] dataPatters;

public Date convert(String s) {
Date date = null;
for (String dataPatter : dataPatters) {
try {
date = new SimpleDateFormat(dataPatter).parse(s);
//转换成功出循环
break;
} catch (ParseException e) {
System.out.println(e.getMessage());
//转换失败进入下次循环
continue;
}
}
return date;
}

public void setDataPatters(String[] dataPatters) {
this.dataPatters = dataPatters;
}
}

拦截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!--拦截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截所有url请求-->
<mvc:mapping path="/**"/>
<!--放过登录方法-->
<mvc:exclude-mapping path="/login"/>
<!--放过 样式,图片 等请求路径-->
<mvc:exclude-mapping path="/css/**"/>
<mvc:exclude-mapping path="/images/**"/>
<mvc:exclude-mapping path="/js/**"/>
<bean class="com.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("one");
Object userSession = request.getSession().getAttribute("userSession");
if (null == userSession) {
response.sendRedirect("/login");
//返回false 不会进入 two three
return false;
}
return super.preHandle(request, response, handler);
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("two");
super.postHandle(request, response, handler, modelAndView);
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("three");
super.afterCompletion(request, response, handler, ex);
}
}

示例下载 密码: ksqj