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

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>

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

Spring MVC jQuery Ajax示例

完整资料:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 勿扰模式代码,Android N Zen Mode (勿扰模式)设置流程

Android N去除了情景模式&#xff0c;取而代之的是勿扰模式。勿扰模式的入口有两处&#xff0c;下拉栏和设置声音里面。下面我们就从设置声音入口&#xff0c;看看勿扰模式的设置流程。首先&#xff0c;勿扰模式的首页有三种选项&#xff0c;分别是仅允许优先打扰内容、自动规则…

一个edit的学习笔记

https://blog.csdn.net/woshizoe/article/details/51555396转载于:https://www.cnblogs.com/strongdady/p/9060760.html

VM12虚拟机Centos7配置动态IP的网络设置

1.控制面板->网络和Internet->网络连接->本地连接->属性->共享->共享给VMnet8 2.VM虚拟机->编辑->虚拟网络编辑器->NAT模式 将所有IP设置为Windows下的CMD->ipconfig下的VMnet8一样的IP 3. 1 vi /etc/sysconfig/network-script/ifcfg-ens33 PS:e…

使用display:none和visibility:hidden隐藏的区别

今天做毕设时遇到了一个小问题&#xff0c;我做了一个tab导航栏&#xff0c;点击一个tab页其它tab页隐藏&#xff0c;这时候第一想法是使用display&#xff1a;none来控制显示隐藏&#xff0c;写了之后发现使用display会有一个问题&#xff0c;就是第二个tab页的轮播图是在页面…

Java 8 Lambdas –缺少脱离Java的链接

我学习了函数式编程&#xff0c;但是后来我决定我更喜欢命令式编程&#xff0c;于是我转回去。 —没人 从命令式编程过渡到函数式编程是当今非常普遍的事情。 互联网上的博客文章充斥着关于它的证词。 我读过的所有内容以及与我交谈过的每个人&#xff08;包括我自己&#xf…

倒计时 时间校准android,android倒计时器时间

我一直在使用android倒计时器样本来创建某个日期的倒计时.Time TimerSet new Time();TimerSet.set(20, 8, 2012); //day month yearTimerSet.normalize(true);long millis TimerSet.toMillis(true);Time TimeNow new Time();TimeNow.setToNow(); // set the date to Current…

(转)zabbix3.4使用percona-monitoring-plugins监控mysql

原文&#xff1a;https://blog.csdn.net/yanggd1987/article/details/79656771 简介 之前主要使用nagios监控mysql&#xff0c;本文主要介绍使用percona-monitoring-plugins监控mysql&#xff0c;percona监控插件是php开发&#xff0c;因此要在agent安装php环境。 配置安装 一.…

用订阅/发布者模式解决异步函数结果依赖的问题

我们都知道node是基于事件无阻塞i/o模型的&#xff0c;所以说大部分函数都是以异步实现的&#xff0c;请看下面代码&#xff1a; db.query(sql1, function (err, data) {//code })db.query(sql2, function (err, data) {//code })如果我们上述两个操作&#xff0c;结果之间没有…

在集成测试中模拟耗时的动作

最近在我的一个项目中&#xff0c;我遇到一种情况&#xff0c;需要为该应用程序创建集成测试。 这不是很奇怪&#xff0c;不是吗&#xff1f; 有趣的是&#xff0c;该应用程序的逻辑涉及一些并发问题&#xff0c;并且其中一个组件必须连接到外部服务&#xff0c;这将花费几秒钟…

html基础-html简介-第一个网页(1)

今天刚刚开通博客园&#xff0c;把我最近整理的html/css来说一下&#xff0c;对于初学者还是有一定的帮助。 一、先来为大家简单普及以下html &#xff08;1&#xff09;、html英文即&#xff1a;hypertext markup language 中译 &#xff1a; 超文本标记语言 &#xff08;2&…

javafx android sdk,JavaFX打包到Android上

让JavaFX运行到移动平台一直是社区努力完成的事。当然&#xff0c;目前已经可以让JavaFX运行到Android和IOS平台了&#xff0c;下面我们来看看如何打包自己的JavaFX项目到Android平台。这个示例是我从打包官方示例的例子里修改而来&#xff0c;用于打包一个简单的JavaFX程序。示…

在zookeeper集群的基础上,搭建伪solrCloud集群

伪集群的搭建&#xff1a;将solrCloud搭建到同一台机器上。 准备工作 1 将在window中部署的单机版solr上传到服务器&#xff08;虚拟机&#xff09;中 solr的简单部署&#xff1a;在tomcat中启动slor 的内容 这一次放到 mkdir /usr/local/solr-cloud 文件夹内并解压 2 复制4份…

Python-IndexError: list index out of range

Error&#xff1a;IndexError: list index out of range Where? 对Python中有序序列进行按索引取值的时候&#xff0c;出现这个异常 Why? 对于有序序列&#xff1a; 字符串 str 、列表 list 、元组 tuple进行按索引取值的时候&#xff0c;默认范围为 0 ~ len(有序序列)-1&…

摆脱困境:向REST API添加验证

我对此感到有些to愧&#xff0c;但直到昨天&#xff0c;我才知道我可以使用Valid和RequestBody批注将验证添加到REST API中。 这在Spring MVC 3.0中不起作用&#xff0c;由于某种原因&#xff0c;我没有注意到在Spring MVC 3.1中添加了对此功能的支持 。 我从不喜欢旧的方法&am…

三星 原生android,原生Android 4.0 三星GALAXY Nexus评测

前言&#xff1a;北京时间10月19日上午10时&#xff0c;谷歌联合三星在香港举行了一场主题为“Calling all possibilities ”的新品发布会&#xff0c;在发布会上正式推出了搭载最新Android 4.0操作系统的智能手机三星GALAXY Nexus。三星GALAXY Nexus每一代的Nexus都被看做是An…

css类选择器类名覆盖优先级

code <style>.a{background: red;}.b{background: yellow;} </style> <div class"a b">A</div> 渲染效果 最初以为更改元素中class类里面的类名顺序&#xff0c;渲染效果就会根据类名顺序依次渲染code <style>.a{background: red;…

IntelliJ IDEA插件-常用插件

IntelliJ IDEA的插件真的很多&#xff0c;最近的新版集成的插件已经基本够用&#xff0c;下面是收集的一些常用插件&#xff0c;根据需要来安装和测试。如果还是没有找到&#xff0c;那么自己来开发一个。 官网&#xff1a;https://plugins.jetbrains.com/ 插件开发资料&#x…

CMD命令锦集

虽然随着计算机产业的发展&#xff0c;Windows 操作系统的应用越来越广泛&#xff0c;DOS 面临着被淘汰的命运&#xff0c;但是因为它运行安全、稳定&#xff0c;有的用户还在使用&#xff0c;所以一般Windows 的各种版本都与其兼容&#xff0c;用户可以在Windows 系统下运行DO…

在运行时访问工件的Maven和SCM版本

您可以轻松地告诉Maven在JAR清单文件中包含工件的版本及其Git / SVN /…修订版&#xff0c;然后在运行时通过getClass&#xff08;&#xff09;。getPackage访问该信息。 getImplementationVersion&#xff08;&#xff09; 。 &#xff08;所有功劳归功于MarkusKrger和其他同事…

Bootstrap学习笔记01

1、Make Images Mobile Responsive 用处&#xff1a; 使图片适配你的页面宽度。 操作&#xff1a; 给图片添加 .img-responsive class属性。 <img src"/images/cat.jpg" class"img-responsive"> 2、Center Text with Bootstrap 用处&#xff…