文档章节

Spring MVC实现Restful Web Service

张升强
 张升强
发布于 2015/01/07 10:17
字数 1091
阅读 754
收藏 10

引言:

以前一说到Web Service大家肯定会联想到SOAP,现在提到Web Service大家马上联想到RESTful,因为RESTful Web Service已经深得人心,得到重用,相比笨重的SOAP越来越流行了,那么什么是RESTful Web ServiceREST英文全称为Representational State Transfer,翻译为中文即表征状态转移,是一种软件架构风格,REST关键原则为:

  1. 为所有事物定义ID

  2. 将所有事物链接在一起

  3. 使用标准方法

  4. 资源多重表述

  5. 无状态通信

RESTful Web Service 是一个使用HTTP并遵循REST原则的Web服务。它从三个方面资源进行定义:

  1. URI,比如:http://example.com/resources/

  2. Web Service接受与返回的互联网媒体类型,比如:JSONXML等。

  3. Web Service在该资源上所支持的一系列请求方法(比如:POSTGETPUTDELETE)。


HTTP 请求方法在RESTful Web 服务中的典型应用

资源

GET

PUT

POST

DELETE

一组资源的URI,比如http://example.com/resources/

列出 URI,以及该资源组中每个资源的详细信息(后者可选)。

使用给定的一组资源替换当前整组资源。

在本组资源中创建/追加一个新的资源。该操作往往返回新资源的URL

删除整组资源。

单个资源的URI,比如http://example.com/resources/142

获取指定的资源的详细信息,格式可以自选一个合适的网络媒体类型(比如:XMLJSON等)

替换/创建指定的资源。并将其追加到相应的资源组中。

把指定的资源当做一个资源组,并在其下创建/追加一个新的元素,使其隶属于当前资源。

删除指定的元素。


SpringMVCRESTful Web Service的支持:

1.URIHTTP请求方法映射到JAVA处理方法,并将JAVA方法处理结果返回给HTTP请求者(对应资源定义I和III)。

@RequestMapping

这是最重要的一个注解,用于处理HTTP请求地址映射,可用于类或方法上,用于类上时表示类中的所有响应请求的方法都是以该地址作为父路径,在Spring中,一般一个Controller类处理一种资源,所以每个Controller类都会加@RequestMapping注解。

常用属性:

value指定请求的地址

method指定请求的method类型, GETPOSTPUTDELETE

params指定request中必须包含某些参数值是,才让该方法处理

1
2
3
4
5
6
7
8
9
10
11
@RequestMapping(value = "/contact")
public class ContactController {
    final Logger logger = LoggerFactory.getLogger(ContactController.class);
    @Autowired
    private ContactService contactService;
    @RequestMapping(value = "/listdata", method = RequestMethod.GET)
    @ResponseBody
    public Contacts listData() {
        return new Contacts(contactService.findAll());
    }

@PathVariable

映射URL路径里面的参数

1
2
3
4
5
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
    @ResponseBody
    public Contact findContactById(@PathVariable Long id) {
        return contactService.findById(id);
    }


2.将接收的数据(如JSON格式数据)转换为JAVA对象和将JAVA对象转换为请求格式(如XML)的数据(对应资源定义II

@RequestBody

用于读取Request请求的body数据,使用Bean配置中的 HttpMessageConverter 将数据转换为JAVA对象,再把对象绑定到 controller中方法的参数上。

1
2
3
4
5
6
7
8
@RequestMapping(value = "/", method = RequestMethod.POST)
    @ResponseBody
    public Contact create(@RequestBody Contact contact) {
        logger.info("Creating contact: " + contact);
        contactService.save(contact);
        logger.info("Contact created successfully with info: " + contact);
        return contact;
    }

@ResponseBody

用于将Controller中方法返回的对象,使用Bean配置中的 HttpMessageConverter 转换为指定格式数据,再写入到Response对象的body数据区。

1
2
3
4
5
@RequestMapping(value = "/listdata", method = RequestMethod.GET)
    @ResponseBody
    public Contacts listData() {
        return new Contacts(contactService.findAll());
    }

HttpMessageConverter配置示例:

1
2
3
4
5
6
7
8
9
10
<mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
            <bean
                class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
                <property name="marshaller" ref="castorMarshaller" />
                <property name="unmarshaller" ref="castorMarshaller" />
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

默认情况下Spring已经启用了很多HttpMessageConverter,只要将他们的实现在类路径下即可,无需再配置。

  • ByteArrayHttpMessageConverter – converts byte arrays

  • StringHttpMessageConverter – converts Strings

  • ResourceHttpMessageConverter – converts org.springframework.core.io.Resource for any type of octet stream

  • SourceHttpMessageConverter – converts javax.xml.transform.Source

  • FormHttpMessageConverter – converts form data to/from a MultiValueMap<String, String>.

  • Jaxb2RootElementHttpMessageConverter – converts Java objects to/from XML (added only if JAXB2 is present on the classpath)

  • MappingJackson2HttpMessageConverter – converts JSON (added only if Jackson 2 is present on the classpath)

  • MappingJacksonHttpMessageConverter – converts JSON (added only if Jackson is present on the classpath)

  • AtomFeedHttpMessageConverter – converts Atom feeds (added only if Rome is present on the classpath)

  • RssChannelHttpMessageConverter – converts RSS feeds (added only if Rome is present on the classpath)


Spring做得太贴心了,所以开发者简单配置就搞定RESTful WebService功能,然后就可专注于业务逻辑实现上。

© 著作权归作者所有

张升强
粉丝 38
博文 119
码字总数 154023
作品 0
广州
高级程序员
私信 提问
使用 Spring 3 来创建 RESTful Web Services

在 Java™ 中,您可以使用以下几种方法来创建 RESTful Web Service:使用 JSR 311(311)及其参考实现 Jersey、使用 Restlet 框架和从头开始开发。Spring 是流行的 Java EE 应用开发框架,现...

IBMdW
2011/05/25
1K
2
spring boot简单实现rest服务

问题 最开始我是想使用Spring MVC搭建一个简单的REST服务,去官网看了看教程,现在Spring胆越来越大了,需要我集成一个maven的父项目,我并不愿意继承Spring的父项目。然后,就开始下面的探索...

亚林瓜子
2018/06/12
0
0
基于 Spring Boot 2.0 构建一个 RESTful WebService

REST 全称是 Representational State Transfer,中文意思是“表述性状态转移”。RESTful 是关于 Web 的现有特征和使用方式的一些准则和约束。 基于 Spring MVC 的 RestController,我们可以方...

摆码王子
2018/04/17
0
0
maven+springMVC+mybatis+junit详细搭建过程

首先我们先要弄清搭建项目的一般流程,需要注意哪些方面,想要什么样的效果,自己的功能有哪些? (假设效果:项目目录结构清晰,能够查询到本地数据库中的内容。。) 1. 工程目录结构整理清...

梵蒂冈考虑过
2016/08/16
68
1
【转】使用 Spring 3 MVC HttpMessageConverter 功能构建 RESTful web 服务

简介: Spring,构建 Java™ 平台和 Enterprise Edition (Java EE) 应用程序的著名框架,现在在其模型-视图-控制器(Model-View-Controller ,MVC)层支持具象状态传输 (REST)。RESTful web...

老盖
2011/08/25
2.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
1
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
2
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
2
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部