springmvc之响应json数据和接收json数据和异常处理

这里讲解的使用spring支持的第三方jar包的使用来处理json数据,不包括其他的方法。

响应json数据:

这里涉及了几种比较复杂的json数据的响应;

第一步导包:

第二步单纯的响应json数据:

 1 /**
 2  * 
 3  */
 4 package com.sxt.controller;
 5 
 6 import java.util.ArrayList;
 7 import java.util.Arrays;
 8 import java.util.HashMap;
 9 import java.util.List;
10 import java.util.Map;
11 
12 import org.springframework.stereotype.Controller;
13 import org.springframework.web.bind.annotation.RequestMapping;
14 import org.springframework.web.bind.annotation.ResponseBody;
15 /**
16  * @author ASUS
17  * 利用gson响应json数据
18  *  
19  *
20  */
21 
22 import com.sxt.bean.User;
23 @Controller
24 public class MyController {
25     /**
26      * 响应一个map集合的数据转换成json
27      * @return
28      */
29     @RequestMapping("/fun1")
30     @ResponseBody
31     public Map<String, Object> fun1(){
32         Map<String, Object> map=new HashMap<>();
33         map.put("id", 1);
34         map.put("name", "张三");
35         map.put("age", 20);
36         map.put("address", "深圳尚学堂");
37         return map;
38     }
39     /**
40      * 响应一个list数据的
41      * @return
42      */
43     @RequestMapping("/fun2")
44     @ResponseBody
45     public List<String> fun2(){
46         System.out.println("------------");
47         return Arrays.asList("深圳","广州","上海","北京");
48     }
49     @RequestMapping("/fun3")
50     @ResponseBody
51     public User fun3() {
52         User user=new User();
53         user.setUsername("ass");
54         user.setPassword("122");
55         return null;
56     }
57     @RequestMapping("/fun4")
58     @ResponseBody
59     public Map<String, Object> fun4(){
60         Map<String, Object> map=new HashMap<>();
61         map.put("total", 20);
62         List<User> list = new ArrayList<>();
63         for(int i =0;i<5;i++){
64             User user = new User();
65             user.setUsername("aaa"+i);
66             user.setPassword("bbbb"+i);
67             list.add(user);
68         }
69         map.put("rows", list);
70         return map;
71     }
72     
73 }

上面的案例中还可以把@ResponseBody添加到类的头上,这表明该类就是一个专门的响应json数据的类

二:接收json数据

controller代码:

 1 /**
 2  * 
 3  */
 4 package com.sxt.controller;
 5 
 6 import org.springframework.stereotype.Controller;
 7 import org.springframework.web.bind.annotation.RequestBody;
 8 import org.springframework.web.bind.annotation.RequestMapping;
 9 import org.springframework.web.bind.annotation.ResponseBody;
10 
11 import com.sxt.bean.User;
12 
13 /**
14  * @author ASUS
15  * 获取请求的json数据
16  *
17  */
18 @Controller
19 public class RequestJson {
20     @RequestMapping("/add")
21     @ResponseBody
22     public String add(@RequestBody User user) {
23         System.out.println(user);
24         return "/index.jsp";
25     }
26 }

注意:这里多了一个注解;该注解能把请求的json数据自动转换成对象数据

还可以用@RestController来代替@Controller和@ResponseBody的功能

jsp页面代码:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3     <%
 4 String path = request.getContextPath();
 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
 6 %>
 7 <!DOCTYPE html>
 8 <html>
 9 <head>
10  <base href="<%=basePath%>">
11 <meta charset="UTF-8">
12 <title>Insert title here</title>
13 <script type="text/javascript" src="js/jquery.min.js"></script>
14 </head>
15 <body>
16 <input type="button" value="提交数据" onclick="fun1();">
17     <script type="text/javascript">
18         function fun1() {
19             $.ajax({
20                 type : 'POST',
21                 url : "add",
22                 contentType : "application/json",
23                 //如果想以json格式把数据提交到后台的话,这个必须有,否则只会当做表单提交
24                 data : JSON.stringify({
25                     "username" : "aaa",
26                     "password" : "bbb"
27                 }),//JSON.stringify()必须有,否则只会当做表单的格式提交
28                 dataType : "json",//期待返回的数据类型
29                 success : function(data) {
30                     alert("success:" + data);
31                 },
32                 error : function(data) {
33                     alert("error" + data);
34                 }
35             });
36         }
37     </script>
38 </body>
39 </html>

注意:如果我们在接收json数据的时候加上@RequestBody这个注解,那么它会自动将请求的json数据转换到对象中

在我们日常的开发中,404,500这类的错误异常信息屡见不鲜;这是因为在开发中的异常信息都被我们try-catch给处理掉了,所以当某一个出现问题的就会抛出这样的界面;

这样给用户的体验很不好。在spring中有一个专门的异常处理器HandlerExceptionResolver,我们可以借助这个接口将错误的界面换成更好看的界面展示给客户。但是,这存在一个问题,也就是我们所有的异常必须往上抛,最后再controller中利用该接口展示给用户我们想让他们看到的界面。

第一步:

创建一个异常处理器实现HandlerExceptionResolver接口

代码:

 1 /**
 2  * 
 3  */
 4 package com.sxt.controller;
 5 
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import org.springframework.stereotype.Component;
 9 import org.springframework.web.servlet.HandlerExceptionResolver;
10 import org.springframework.web.servlet.ModelAndView;
11 /**
12  * @author ASUS
13  * 自定义的全局异常处理器
14  *
15  */
16 @Component
17 public class MyHandleException implements HandlerExceptionResolver{
18 
19     /**
20      * ex就是对应的抛出的按个异常
21      */
22     @Override
23     public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
24             Exception ex) {
25         // TODO Auto-generated method stub
26         System.out.println(ex);
27         System.out.println(ex.getMessage());
28         ModelAndView mc=new ModelAndView();
29         mc.setViewName("/error.jsp");
30         return mc;
31     }
32 
33 }

在controller中对异常进行展示:

 1 /**
 2  * 
 3  */
 4 package com.sxt.controller;
 5 
 6 
 7 
 8 import org.springframework.stereotype.Controller;
 9 import org.springframework.web.bind.annotation.RequestMapping;
10 
11 import com.sxt.bean.User;
12 import com.sxt.exception.CustomException;
13 /**
14  * @author ASUS
15  * 将异常全部抛出,最后再controller中有一个spring自带的异常处理器;如果不抛的话就没有办法知道这些异常
16  * 用户就可能见到404这样的异常信息,为了更好地体验,我们将这样的错误界面换成更好看的,这在显示生活中很常见
17  *
18  */
19 @Controller
20 public class MyController {
21     @RequestMapping("/update")
22     public String update( User user) throws CustomException {
23         System.out.println("------------");
24         System.out.println(user);
25         if("admin".equals(user.getUsername())) {
26             throw new CustomException("系统维护,请稍后访问!!");
27         }else if("root".equals(user.getUsername())) {
28             throw new CustomException("类型出错了");
29         }
30         return "/user.jsp";
31     }
32     
33 }

自定义异常信息显示类:

 1 /**
 2  * 
 3  */
 4 package com.sxt.exception;
 5 
 6 /**
 7  * @author ASUS
 8  * 自定义异常类
 9  *
10  */
11 public class CustomException extends Exception{
12 
13     /**
14      * 
15      */
16     private static final long serialVersionUID = 1L;
17     private String message;
18     public String getMessage() {
19         return message;
20     }
21     public void setMessage(String message) {
22         this.message = message;
23     }
24     @Override
25     public String toString() {
26         return "CustomException [message=" + message + "]";
27     }
28     
29     public CustomException(String message) {
30         super(message);
31         this.message=message;
32     }
33     
34 
35 }

错误界面代码:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3     <%
 4 String path = request.getContextPath();
 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
 6 %>
 7 <!DOCTYPE html>
 8 <html>
 9 <head>
10  <base href="<%=basePath%>">
11 <meta charset="UTF-8">
12 <title>Insert title here</title>
13 </head>
14 <body>
15 错误页面!!!
16 </body>
17 </html>

配置文件信息:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:mvc="http://www.springframework.org/schema/mvc"
 6     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
 7         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 8         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
 9     
10     <!-- 开启注解 -->
11     <mvc:annotation-driven ></mvc:annotation-driven>
12     <!-- 开启扫描 -->
13     <context:component-scan base-package="com.sxt.*"></context:component-scan>
14    
15     
16 </beans>

注意:这里使用的是注解的形式,如果在自定义异常处理器中没有使用注解,就要在spring-mvc.xml文件中配置异常处理器

猜你喜欢

转载自www.cnblogs.com/liyunfeng-deng/p/10289739.html