Spring 3使JSON REST服务非常容易。 本教程将通过几个步骤向您展示如何进行。 您可以在GitHub上获取代码。

先决条件

您应该有一个运行中的Spring MVC应用程序。 如果尚未设置正常的Spring MVC应用程序,请按照本教程进行操作 。 我们将定义三个REST服务:1)检索随机的Person,2)按ID检索Person,以及3)保存新的Person。 我们将在示例页面上使用jQuery使用这些服务。 首先,我将展示用于REST服务的Spring Controller,然后逐步介绍它们的工作方式:

PersonController.java

package com.codetutr.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;import com.codetutr.domain.Person;
import com.codetutr.service.PersonService;@Controller
@RequestMapping("api")
public class PersonController {PersonService personService;@Autowiredpublic PersonController(PersonService personService) {this.personService = personService;}@RequestMapping("person/random")@ResponseBodypublic Person randomPerson() {return personService.getRandom();}@RequestMapping("person/{id}")@ResponseBodypublic Person getById(@PathVariable Long id) {return personService.getById(id);}/* same as above method, but is mapped to* /api/person?id= rather than /api/person/{id}*/@RequestMapping(value="person", params="id")@ResponseBodypublic Person getByIdFromParam(@RequestParam Long id) {return personService.getById(id);}/*** Saves new person. Spring automatically binds the name* and age parameters in the request to the person argument* @param person* @return String indicating success or failure of save*/@RequestMapping(value="person", method=RequestMethod.POST)@ResponseBodypublic String savePerson(Person person) {personService.save(person);return "Saved person: " + person.toString();}
}

好的,因此,如您所见,该控制器中有4个请求处理程序。 第一种方法返回一个随机的人。 接下来的两个ID检索一个人–只是两种不同的URL映射方法。 最后一种方法可以保存一个人。

记住Spring控制器通常如何返回String类型(以指示结果视图名称)。 相反,这里我们使用Spring的@ResponseBody批注并返回要发送给客户端的对象。 @ResponseBody注释告诉Spring我们将在响应主体中返回数据,而不是呈现JSP。

当使用@ResponseBody批注时,Spring将以客户端可接受的格式返回数据。 也就是说,如果客户端请求具有用于接受json的标头,并且类路径中存在Jackson-Mapper,则Spring将尝试将返回值序列化为JSON。 如果请求标头指示XML是可接受的(accept = application / xml),并且Jaxb在类路径中,并且返回类型使用Jaxb注释进行注释,则Spring将尝试将返回值编组为XML。

如前所述,如果您希望服务返回JSON,则必须在类路径中包含Jackson。 这是您需要添加到项目中的唯一依赖项:

Gradle

compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.12'

或者,如果您使用的是Maven:

<dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.12</version>
</dependency>

或者,如果您希望服务返回XML,则包括您喜欢的Jaxb实现。 com.sun.xml.bind:jaxb:2.1.9

稍后,我们将构建一个前端,以使用AJAX调用这些服务,但是如果您现在部署应用程序,则可以使用REST客户端(或仅在浏览器中键入URL)试用您的服务。 例如:

如果您对此感到满意,可以停止关注。 现在,我将通过编码客户端jQuery来连接所有组件:

home.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %><!DOCTYPE HTML>
<html><head><title>Spring MVC - Ajax</title><script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script><style>body { background-color: #eee; font: helvetica; }#container { width: 500px; background-color: #fff; margin: 30px auto; padding: 30px; border-radius: 5px; box-shadow: 5px; }.green { font-weight: bold; color: green; }.message { margin-bottom: 10px; }label { width:70px; display:inline-block;}.hide { display: none; }.error { color: red; font-size: 0.8em; }</style></head><body><div id="container"><h1>Person Page</h1><p>This page demonstrates Spring MVC's powerful Ajax functionality. Retrieve arandom person, retrieve a person by ID, or save a new person, all without page reload.</p><h2>Random Person Generator</h2><input type="submit" id="randomPerson" value="Get Random Person" /><br/><br/><div id="personResponse"> </div><hr/><h2>Get By ID</h2><form id="idForm"><div class="error hide" id="idError">Please enter a valid ID in range 0-3</div><label for="personId">ID (0-3): </label><input name="id" id="personId" value="0" type="number" /><input type="submit" value="Get Person By ID" /> <br /><br/><div id="personIdResponse"> </div></form><hr/><h2>Submit new Person</h2><form id="newPersonForm"><label for="nameInput">Name: </label><input type="text" name="name" id="nameInput" /><br/><label for="ageInput">Age: </label><input type="text" name="age" id="ageInput" /><br/><input type="submit" value="Save Person" /><br/><br/><div id="personFormResponse" class="green"> </div></form></div><script type="text/javascript">$(document).ready(function() {// Random Person AJAX Request$('#randomPerson').click(function() {$.getJSON('${pageContext.request.contextPath}/api/person/random', function(person) {$('#personResponse').text(person.name + ', age ' + person.age);});});// Request Person by ID AJAX$('#idForm').submit(function(e) {var personId = +$('#personId').val();if(!validatePersonId(personId)) return false;$.get('${pageContext.request.contextPath}/api/person/' + personId, function(person) {$('#personIdResponse').text(person.name + ', age ' + person.age);});e.preventDefault(); // prevent actual form submit});// Save Person AJAX Form Submit$('#randomPerson').click(function() {$.getJSON('${pageContext.request.contextPath}/api/person/random', function(person) {$('#personResponse').text(person.name + ', age ' + person.age);});});$('#newPersonForm').submit(function(e) {// will pass the form date using the jQuery serialize function$.post('${pageContext.request.contextPath}/api/person', $(this).serialize(), function(response) {$('#personFormResponse').text(response);});e.preventDefault(); // prevent actual form submit and page reload});});function validatePersonId(personId) {console.log(personId);if(personId === undefined || personId < 0 || personId > 3) {$('#idError').show();return false;}else {$('#idError').hide();return true;}}</script></body>
</html>

一切就绪后,您应该拥有一个如下所示的页面:

完整资料:

ZIP , GitHub上
要运行本教程中的代码:必须已安装Gradle 。 下载ZIP。 提取。 打开命令提示符以提取位置。 运行gradle jettyRunWar。 在浏览器中导航到http:// localhost:8080。

参考文献

  • SpringSource博客– Spring MVC Ajax的简化
  • SpringSource博客– Spring MVC增强功能
参考: Spring MVC –来自JCG合作伙伴 Steve Hanson的@ResponseBody 提供的基于REST的基于REST的轻松JSON服务,位于CodeTutr博客上。

翻译自: https://www.javacodegeeks.com/2013/04/spring-mvc-easy-rest-based-json-services-with-responsebody.html

Spring MVC –使用@ResponseBody轻松实现基于REST的JSON服务相关推荐

  1. Spring Cloud之(四)基于RestTemplate的微服务调用

    四.基于RestTemplate的微服务调用 前面我们已经成功的把第一个小案例跑起来了,其中消费者使用了RestTemplate来调用提供者提供的微服务,下面就来详细的说明一下RestTemplate ...

  2. Spring MVC中用@ResponseBody转json,对json进行处理方法汇总

    <mvc:annotation-driven><mvc:message-converters register-defaults="true"><be ...

  3. spring mvc @RequestBody @ResponseBody 解析流程

    一.此接口测试用例 @RequestMapping(value = "/save_user",produces = "application/xml;charset=ut ...

  4. Spring mvc 注解@ResponseBody 返回内容编码问题

    @ResponseBody 在@Controller 类方法中能够让字符串直接返回内容. 其返回处理的类是org.springframework.http.converter.StringHttpMe ...

  5. Spring 2.5 基于注解驱动的 Spring MVC

    基于注解的配置有越来越流行的趋势,Spring 2.5 顺应这种趋势,为 Spring MVC 提供了完全基于注解的配置.本文将介绍 Spring 2.5 新增的 Sping MVC 注解功能,讲述如 ...

  6. 使用 Spring 2.5 基于注解驱动的 Spring MVC(二)

    我们在 ② 处添加了一个 ModelMap 属性,其属性名为 currUser,而 ① 处通过 @SessionAttributes 注解将 ModelMap 中名为 currUser 的属性放置到 ...

  7. Spring MVC 5 + Thymeleaf 基于Java配置和注解配置

    Spring MVC 5 + Thymeleaf 注解配置 Spring的配置方式一般为两种:XML配置和注解配置 Spring从3.0开始以后,推荐使用注解配置,这两种配置的优缺点说的人很多,我就不 ...

  8. Spring Controller – Spring MVC控制器

    Spring Controller annotation is a specialization of @Component annotation. Spring Controller annotat ...

  9. 使用Spring MVC 4构建Restful服务

    使用Spring MVC 4构建RESTful服务相对于其它框架来说,有很多优势.首先,Spring MVC 4作为Spring的框架之一,可以很好地与Spring进行集成.其次,Spring MVC ...

最新文章

  1. Java_JAVA6动态编译的问题
  2. iOS如何使用三方字体
  3. Python os.walk() 方法遍历文件目录
  4. Android --- 消息模式Toast.makeText.show()的几种用法总结
  5. Flask部署| gunicorn、nginx部署flask项目,并用supervisor来管理进程
  6. Oracle命令--alter 操作
  7. 版本对应关系python TensorFlow+Keras
  8. Spring MVC上传文件后重命名读取不显示,报错已解决(The origin server did not find a current representation for the targe)
  9. Windows 2008 R2 ServerCore学习点滴(1)
  10. mysql中innodb的工作原理_解读MySQL的InnoDB引擎日志工作原理
  11. 所有浏览器的 CSS selectors 兼容性
  12. 黑马Pink老师H5CSS教程学习笔记
  13. c语言程序答案PDF,C语言程序设计答案.pdf
  14. 浅谈分布式存储之SSD基本原理
  15. 零基础入门—手把手教你做网站(新手必备)
  16. 思绪,飘在青山绿水间
  17. 牛客网:牛牛玩平板(c++)
  18. maven 打包错误:Please refer to xxx\target\surefire-reports for the individual test results.
  19. word首页之前插入空白页没有页眉页脚且不影响后续页码
  20. Linux 挂载外加磁盘

热门文章

  1. 攻城掠地端mysql_【图片】攻城掠地单机版本服务端+攻城掠地GM工具【单兆权吧】_百度贴吧...
  2. 阳泉2021高考成绩查询时间段,2021年阳泉高考成绩排名及成绩公布时间什么时候出来...
  3. java异常—— finally 子句+带资源的 try语句
  4. 2021年最新springcloud配置中心不生效的版本原因
  5. HDU2059(DP)
  6. 怎么实现阴影效果呢?
  7. 黑马2016java_2016年成功的Java开发人员简介
  8. 将MongoDB集成到您的Spring项目中
  9. gradle maven_将工件从Gradle自动提升到Maven Central
  10. Jar Hell变得轻松–用jHades揭开类路径的神秘面纱