RESTful风格的webservice越来越流行了,sun也推出了RESTful WebService的官方规范:JAX-RS,全称:Java API for RESTful WebService。该规范定义了一系列的注解

RESTful简化了web service的设计,它不再需要wsdl,也不再需要soap协议,而是通过最简单的http协议传输数据(包括xml或json)。既简化了设计,也减少了网络传输量(因为只传输代表数据的xml或json,没有额外的xml包装)

下面为大家介绍使用cxf开发RESTful WebService

Cxf2.7实现了大部分的jax-rs规范,从cxf3.0开始实现jax-rs的全套规范

服务端

Spring3+cxf开发RESTfulweb service

服务端jar包

上面的jettison jar包是用来将jaxb扩展为为json支持的jar

package com.tgb.cxf.server;

import javax.xml.bind.annotation.XmlRootElement;

//一定要使用XmlRootElement注解进行标注
@XmlRootElement(name="user")
public class User { private String id;
private String name; public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} }

WebService接口

@Path("/userservice/")
public interface IMyService { @Path("/addUser/")
@POST
Response addUser(User user); @Path("/delUser/{id}/")
@DELETE
Response delUser(@PathParam("id") String id); @Path("/updateUser/")
@PUT
Response updateUser(User user); @Path("/getUserById/{id}/")
@GET
@Produces("application/json")//返回json数据格式
User getUserById(@PathParam("id") String id); @Path("/")
@GET
@Produces("application/json")//返回json数据格式
List<User> findAllUsers();
}

WebService实现类

public class MyServiceImpl implements IMyService {

	private HashMap<String, User> users = new HashMap<String,User>();

	public MyServiceImpl(){
init();
} public Response addUser(User user) { users.put(user.getId(), user);
System.out.println("添加用户成功");
System.out.println(users.size());
System.out.println(users.get("2").getName());
return Response.ok().build();
} public Response delUser(String id) {
users.remove(id);
System.out.println(users.size());
return Response.ok().build();
} public Response updateUser(User user) {
users.put(user.getId(), user);
System.out.println(users.get("1").getName());
return Response.ok().build();
} public User getUserById(String id) {
return users.get(id);
} private void init(){
User user = new User();
user.setId("1");
user.setName("温欢");
users.put(user.getId(), user);
} public List<User> findAllUsers() {
List<User> userlist = new ArrayList<User>();
userlist.add(users.get("1"));
return userlist;
} }

spring-cxf.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd"> <!-- 注意这里的jaxrs命名空间需要大家手动添加 --> <!-- 发布webservice -->
<bean id="serviceBean" class="com.tgb.cxf.server.MyServiceImpl"/>
<jaxrs:server id="userService" address="/myservice">
<jaxrs:serviceBeans>
<ref bean="serviceBean"/>
</jaxrs:serviceBeans>
</jaxrs:server> </beans>

web.xml文件配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <!-- 配置spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring-cxf.xml</param-value>
</context-param> <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <!-- 配置cxf servlet -->
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping> </web-app>

客户端

所需jar包

因为RESTful就是利用最原始的http协议传输数据,所以客户端其实就是一个http客户端,有以下几种实现方式

JAX-RS Client API--cxf3.0+

Proxy【使用起来简单,代理封装通信细节】

Apache HttpClient

WebClient

为了简单我使用了Proxy方式

代码如下

    public class MyClient {

        /** @MethodName    : main
* @Description : JaxRs测试客户端
* @param args
*/
public static void main(String[] args) {
IMyService myService = JAXRSClientFactory.create("http://localhost:8096/cxf02/services/myservice",IMyService.class); User user = myService.getUserById("");
System.out.println(user.getName()); User user = new User();
user.setId("");
user.setName("委座");
myService.addUser(user); /*User user = new User();
user.setId("1");
user.setName("123");
myService.updateUser(user);*/ myService.delUser(""); System.out.println(myService.findAllUsers().get().getName());
} }

大家可以使用TCPMON这个工具监控以下,可以看到http body中只是简单的json串,没有像soap协议那样的“信封”包装

使用RESTful设计风格+传输json数据格式 可以大大的简化web service的设计 并提高传输效率

其实springMVC也采用了RESTful的设计风格,不过它使用的是spring自己的注解,这些注解和jax-rs中的注解惊奇的类似。如果大家有兴趣可以研究一下springMVC的RESTful特性。

开发RESTful WebService的更多相关文章

  1. Jersey框架一:Jersey RESTful WebService框架简介

    Jersey系列文章: Jersey框架一:Jersey RESTful WebService框架简介 Jersey框架二:Jersey对JSON的支持 Jersey框架三:Jersey对HTTPS的 ...

  2. RESTful Webservice

    1,REST和RESTFUL是什么? REST ( REpresentational State Transfer ),State Transfer 为 "状态传输" 或 &quo ...

  3. 用cxf开发restful风格的WebService

    我们都知道cxf还可以开发restful风格的webService,下面是利用maven+spring4+cxf搭建webService服务端和客户端Demo 1.pom.xml <projec ...

  4. 开发基于CXF的 RESTful WebService web 项目 webservice发布

    配置步骤 开发基于CXF的 RESTful WebService 1.创建Web项目并导入CXF的jar 2.在Web.xml中配置 CXFServlet <servlet> <se ...

  5. SOAP Webservice和RESTful Webservice

    http://blog.sina.com.cn/s/blog_493a845501012566.html REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的 ...

  6. Restful是什么,SOAP Webservice和RESTful Webservice

    首先,应该怀着这样一种心态来学习Restful——Restful你可以将其理解一种软件架构风格,并且诠释了Http协议的设计初衷,所以不要把他理解的那么神秘,Restful风格有好处,当然也是有坏处的 ...

  7. RESTful Webservice (一) 概念

    Representational State Transfer(表述性状态转移) RSET是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩 ...

  8. Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice

    浅谈SOAP Webservice和RESTful Webservice REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.RE ...

  9. Eclipse + Jersey 发布RESTful WebService(一)了解Maven和Jersey,创建一个WS项目(成功!)

    一.下文中需要的资源地址汇总 Maven Apache Maven网站 http://maven.apache.org/ Maven下载地址: http://maven.apache.org/down ...

随机推荐

  1. 转:mysql性能优化的19个要点

    原文来自于:http://outofmemory.cn/mysql/mysql-performance-tips 1.为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方 ...

  2. BZOJ 1072 排列

    Description 给一个数字串\(s\)和正整数\(d\), 统计\(s\)有多少种不同的排列能被\(d\)整除(可以有前导\(0\)).例如\(123434\)有\(90\)种排列能被\(2\ ...

  3. 【Java】ArrayList和LinkedList的区别

    一般大家都知道ArrayList和LinkedList的大致区别:      1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问 ...

  4. java design

    http://www.austintek.com/mvc/ http://msdn.microsoft.com/zh-cn/magazine/cc163419.aspx http://www.croc ...

  5. Pair of Numbers

    Codeforces Round #209 (Div. 2) D:http://codeforces.com/contest/359/problem/D 题意:给以一个n个数的序列,然后问你最大的区间 ...

  6. cf E. George and Cards

    http://codeforces.com/contest/387/problem/E 题意:给你n个数,然后在输入k个数,这k个数都在n个数中出现,进行每一次操作就是在n个数中选择长度为w的连续序列 ...

  7. JSP页面的异常处理<转>

     对于jsp页面错误处理这里大致有两种方式:一.在Web.xml中配置全局的错误异常处理    即凡是该项目下(即虚拟路径下的所有文件)的任意一个文件错误或者异常,都会跳到指定的错误处理页面.    ...

  8. 14.5.3 Locks Set by Different SQL Statements in InnoDB

    14.5.3 Locks Set by Different SQL Statements in InnoDB 通过不同的SQL语句设置的锁 在InnoDB中 一个锁定读, 一个UPDATE 或者一个D ...

  9. WordPress 3.5.1 crypt_private()远程拒绝服务漏洞(CVE-2013-2173)

    漏洞版本: WordPress 3.5.1 漏洞描述: BUGTRAQ ID: 60477 CVE(CAN) ID: CVE-2013-2173 WordPress是一种使用PHP语言和MySQL数据 ...

  10. 线段树(区间维护):HDU 3308 LCIS

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...