no16-第12章第一次课-springmvc处理json数据和拦截器
分类: ssm 专栏: ssm框架课 标签: 处理json 拦截器
2023-01-05 18:32:46 1203浏览
1.springMVC处理json数据
1.1json数据的传递处理
案例:以添加用户的时候异步验证用户编码的唯一性
- 页面部分-ajax请求

- control部分——(前提是要引入fastjson包)
/**
* 验证用户编号是否已存在
* @param account
* @return
*/
@ResponseBody
// @RequestMapping(value="/userExist", method = RequestMethod.GET)
@GetMapping("/userExist")
public Object userExist(@RequestParam String account){
logger.debug("验证用户名account="+account + "的用户是否存在");
HashMap<String, Object> resultMap = new HashMap<String, Object>();
if(StringUtils.isNullOrEmpty(account)){
resultMap.put("exist", 1);
}else{
SysUser sysUser = sysUserService.getAccountExist(account);
if(null != sysUser) {
resultMap.put("exist", 1);
}else {
resultMap.put("exist", 0);
}
}
return JSONArray.toJSONString(resultMap);
}1.2json数据传递过程中的中文乱码和日期问题
案例:查看某个用户的详情的时候,想在当前页面局部刷新展示不跳页面增强用户体验
- 1.ajax返回中文乱码解决:

- 1.1中文乱码解决方法1
在@GetMapping里加produces = {"application/json;charset=UTF-8"}
- 1.2中文乱码解决方法2
springmvc配置文件加消息转换器的配置
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>- 1.3补充jackson的方式
其实直接使用jackson的三个jar包后,放回实体类型的json对象格式就不会出现中文乱码问题,springmvc默认内置的是jackson的消息转换器。

maven方式:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
@GetMapping(value = "/view/{id}")
@ResponseBody
public SysUser view(@PathVariable String id){
logger.debug("根据id查询用户详情"+id);
SysUser sysUser = sysUserService.getUserById(id);
// model.addAttribute(sysUser);
return sysUser;
// return "sysUser/view";
}- 2.日期展示问题解决

- 2.1加注解的方式解决

- 2.2配置fastjson消息转换器
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>application/json</value> </list> </property> <property name="features"> <list> <!-- Date的日期转换器 --> <value>WriteDateUseDateFormat</value> </list> </property> <property name="dateFormat" value="yyyy-MM-dd"/> </bean> </mvc:message-converters> </mvc:annotation-driven>
这里注意下,配置了fastjson的话不能写JSON.toJSONString(sysUser),直接return 实体类就行。
/**
* 查询用户详情,返回JSON
* @param id
* @return
*/
@ResponseBody
@GetMapping("/{id}/view")
public Object view(@PathVariable String id){
logger.debug("根据id查询用户详情id:" + id);
SysUser sysUser = null;
try {
sysUser = sysUserService.getUserById(id);
logger.debug("查询到用户信息:" + sysUser);
} catch (Exception e) {
e.printStackTrace();
return "failed";
}
return sysUser;
}
备注:这样配置后发现页面上的时间全部带时分秒,日期也带时分秒了,解决方案可以用加注解和配置结合的方式就OK。
- 2.3补充jackson的方式
注解方式:
@JsonFormat(pattern = "yyyy-MM-dd")
配置消息转换器的方式
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg name="pattern" value="yyyy-MM-dd" /> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
2.拦截器
- 自定义拦截器类
public class AuthInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
SysUser sysUser=(SysUser) request.getSession().getAttribute(Constants.USER_SESSION);
if(sysUser == null){
response.sendRedirect(request.getContextPath()+"/user/toLogin");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}- 将自定义的拦截器配置到框架中,
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/user/**"/> <!--设置白名单--> <mvc:exclude-mapping path="/user/toLogin" /> <mvc:exclude-mapping path="/user/login" /> <bean class="cn.cvs.interceptor.AuthInterceptor"/> </mvc:interceptor> </mvc:interceptors>
拦截器方法执行顺序
- 一个拦截器的情况

- 两个拦截器的情况

拦截器和过滤器的区别:
- 拦截器只能在springmvc 框架中使用,过滤器可以在任何web项目都可以用
- 拦截器只能拦截control,而过滤器可以拦截jsp页面静态资源等都可以拦截掉
好博客就要一起分享哦!分享海报
您可能感兴趣的博客

新业务
springboot学习
ssm框架课
vue学习
【带小白】java基础速成