🎉🎉欢迎来到我的CSDN主页!🎉🎉
🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚
🌟在这里,我要推荐给大家我的专栏《Spring MVC》。🎯🎯
🚀无论你是编程小白,还是有一定基础的程序员,这个专栏都能满足你的需求。我会用最简单易懂的语言,带你走进Spring MVC的世界,让你从零开始,一步步成为JAVA大师。🚀🏆
🌈让我们一起在SpringMVC的世界里畅游吧!🌈🌈
👉点击这里,就可以查看我的主页啦!👇👇
🎁如果感觉还不错的话请记得给我点赞哦!🎁🎁
💖期待你的加入,一起学习,一起进步!💖💖
一、JSON数据返回
1.1.前言
JSON是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。JSON的常用场景包括:
- 前后端分离的项目中,后端向前端传送数据时 。
- Ajax异步访问数据。
- RPC远程调用。
除了JSON,还有其他的数据传输格式,如XML等。但是由于XML格式的特点,它在Web开发中使用较少。
1.2.Jackson的介绍
1.2.1.什么是Jackson
Jackson是一个Java库,用于将Java对象转换为JSON格式,以及将JSON格式转换为Java对象。它提供了一种简单的方式来序列化和反序列化Java对象,使得它们可以很容易地在Java应用程序和Web服务之间进行传输。
Jackson库是一个开源项目,由FasterXML开发。它是目前最流行的Java JSON库之一,被广泛应用于各种Java项目中。
优点:
- 容易使用,提供了高层次外观,简化常用的用例。
- 无需创建映射,API提供了默认的映射大部分对象序列化。
- 性能高,快速,低内存占用
- 创建干净的json
- 不依赖其他库
- 代码开源
1.2.2.常用注解
注解名 | 说明 |
@JsonIgnore | 用于忽略某个属性或方法,不参与序列化或反序列化。 |
@JsonProperty | 用来指定序列化和反序列化的属性名映射。 |
@JsonSerialize | 用来指定序列化时使用的类。 |
@JsonDeserialize | 用来指定反序列化时使用的类。 |
@JsonInclude | 用来指定包含的属性名。 |
@JsonIncludeAll | 包含所有属性,除了上面提到的属性。 |
@JsonAnyGetter | 用于处理Map中的值。 |
@JsonAnySetter | 用于处理Map中的值。 |
@JsonUnwrapped | 将JSON字符串中的包装类型(如List、Map等)转换为对应的Java对象。 |
@JsonFormat | 用于格式化日期、时间和数字等类型的序列化/反序列化。 |
@JsonIgnoreProperties | 作用在类上,用来说明有些属性在序列化/反序列化时需要忽略掉 |
下面是一个简单的示例:
假设有一个Person类:
public class Person { private String name; private int age; @JsonIgnoreProperties({"address"}) // 忽略address属性的序列化和反序列化 private Address address; // getter and setter methods... }
在序列化时,只有name和age属性会被序列化到JSON中:
ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(person);
在反序列化时,只有name和age属性会被反序列化为Java对象:
Person person = objectMapper.readValue(json, Person.class);
1.3.使用注解
1.3.1.导入依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.3</version> </dependency>
1.3.2.配置spring-mvc.xml
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJackson2HttpMessageConverter"/> </list> </property> </bean> <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件--> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/json;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean>
1.3.3.案例实战
@ResponseBody使用
@ResponseBody注解的作用是将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON
数据或者是XML数据。
小贴士:
在使用此注解之后不会再走视图解析器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
以下我会以JSON格式的不同情况来演示数据回显。
JsonController.java
@Controller @RequestMapping("/stu/json") public class JsonController { @Autowired private StudentBiz stubiz; /** * 返回List<T> * @param req * @param Student * @return */ @ResponseBody @RequestMapping("/list") public List<Student> list(HttpServletRequest req, Student Student){ PageBean pageBean = new PageBean(); pageBean.setRequest(req); List<Student> lst = this.stubiz.selectBySnamePager(Student, pageBean); return lst; } /** * 返回T * @param req * @param Student * @return */ @ResponseBody @RequestMapping("/load") public Student load(HttpServletRequest req, Student Student){ if(Student.getSid() != null){ List<Student> lst = this.stubiz.selectBySnamePager(Student, null); return lst.get(0); } return null; } /** * 返回List<Map> * @param req * @param Student * @return */ @ResponseBody @RequestMapping("/mapList") public List<Map> mapList(HttpServletRequest req, Student Student){ PageBean pageBean = new PageBean(); pageBean.setRequest(req); List<Map> lst = this.stubiz.mapListPager(Student, pageBean); return lst; } /** * 返回Map * @param req * @param Student * @return */ @ResponseBody @RequestMapping("/mapLoad") public Map mapLoad(HttpServletRequest req, Student Student){ if(Student.getSid() != null){ List<Map> lst = this.stubiz.mapListPager(Student, null); return lst.get(0); } return null; } @ResponseBody @RequestMapping("/all") public Map all(HttpServletRequest req, Student Student){ PageBean pageBean = new PageBean(); pageBean.setRequest(req); List<Student> lst = this.stubiz.selectBySnamePager(Student, pageBean); Map map = new HashMap(); map.put("lst",lst); map.put("pageBean",pageBean); return map; } @ResponseBody @RequestMapping("/jsonStr") public String jsonStr(HttpServletRequest req, Student Student){ return "clzEdit"; } }
返回List<T>:
返回T:
返回List<Map>:
返回Map:
返回JSON数组:
返回字符串:
总结:
通过以上的案例我们可以看到返回T和List<T>都可以通过Map来做到,所以我们在做需求的时候应当灵活应用,如果返回的是字符串虽然我们有这个jsp页面,但也不会走视图解析器,这一点我们前面也说了这里也验证了。给大家提一个小技巧,如果你的Controller类里面,都是返回的JSON数据可以将@ResponseBody注解在类上,如果我们的类上同时出现以下两个注解:@Controller和@ResponseBody就可以使用@RestController。
小贴士:
@Controller注解用于标识一个类是Spring MVC中的控制器,即处理用户请求并返回响应的组件。
@ResponseBody注解用于将方法返回的对象转换为JSON格式的字符串,并将其作为HTTP响应体发送给客户端。
因此,@RestController注解合集的含义是:将一个类标记为Spring MVC控制器,并使用@ResponseBody注解将方法返回的对象转换为JSON格式的字符串,以便于在浏览器或其他客户端中进行访问。