一、WebService简介

  为了支持跨网络的机器间相互操作交互而设计,用于开发分布式的互操作的应用程序组件。

  Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务,而XML 是 Web Services 的基础。

二、快速入门

  • 将${JDK}\bin目录添加到path环境变量
  • 新建一个文件夹,打开命令行,并cd到该目录
  • 执行命令
  • wsimport -s . http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
  • 新建Java工程,将文件夹下的内容拷贝到src目录
  • 创建测试类,测试功能
  •  public class TestService {
    public static void main(String[] args) {
    MobileCodeWS mobileCodeWS = new MobileCodeWS();
    MobileCodeWSSoap soap = mobileCodeWS.getMobileCodeWSSoap();
    String info = soap.getMobileCodeInfo("1886666", "");
    System.out.println(info);
    }
    }

三、SOAP(imple Object Access Protocol)

  使用HTTP协议传输XML格式的数据。

  • SOAP请求示例

     POST /InStock HTTP/1.1
    Host: www.example.org
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: nnn <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/stock">
    <m:GetStockPrice>
    <m:StockName>IBM</m:StockName>
    </m:GetStockPrice>
    </soap:Body> </soap:Envelope>
  • SOAP响应示例

  •  HTTP/1.1 200 OK
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: nnn <?xml version="1.0"?>
    <soap:Envelope
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/stock">
    <m:GetStockPriceResponse>
    <m:Price>34.5</m:Price>
    </m:GetStockPriceResponse>
    </soap:Body> </soap:Envelope>

四、WSDL(Web Services Description Language)

  • 网络服务描述语言是一种使用 XML 编写的文档。这种文档可描述某个 Web service, 例如服务的名称, 地址, 方法, 参数类型, 返回值类型等
  • Web服务的使用说明书
  • 每一个WebService都有一个对应的WSDL
  • WSDL地址组成 : 服务发布地址?wsdl
  • WSDL文档示例
     <message name="getTermRequest">
    <part name="term" type="xs:string"/>
    </message> <message name="getTermResponse">
    <part name="value" type="xs:string"/>
    </message> <portType name="glossaryTerms">
    <operation name="getTerm">
    <input message="getTermRequest"/>
    <output message="getTermResponse"/>
    </operation>
    </portType>

四、Apache CXF 框架

  • 主页: http://cxf.apache.org/

  • Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。

1、CXF提供的服务分为两种方式

  • JAX-WS

    • 全称是 JavaTM API forRESTful Web Services

  • JAX-RS

    • 全称是 Java API for RESTful Web Services

  • 关于JAX-WS与JAX-RS两者是不同风格的SOA架构。前者以动词为中心,指定的是每次执行函数。而后者以名词为中心,每次执行的时候指的是资源

  • JAX-RS是JAVA EE6 引入的一个新技术。

  • 是一个Java 编程语言的应用程序接口,支持按照表述性状态转移(REST)架构风格创建Web服务。JAX-RS使用了Java SE5引入的Java标注来简化Web服务的客户端和服务端的开发和部署。

  • 简单来理解两种方式的区别

    • JAX-WS是基于SOAP协议传输XML数据

    • JAX-RS是基于HTTP协议传输XML数据或JSON数据

2、使用CXF开发WebService服务端(JAX-RS)

  • RESTful

    • 一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

  • RESTful的好处

    • 基于这种风格架构,软件编写可以更简洁

    • 基于HTTP协议, 支持多种消息格式,比如XML 、JSON

    • 更易于实现缓存机制

  • 创建Maven工程,类型为WAR

  • 引入坐标

    <!--cxf-rs的坐标 -->

 <dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 增强cxf-rs,可以处理json数据 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 上面的依赖必须依赖此包 -->
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.3.7</version>
</dependency>
<!-- spring坐标 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!--spring整合web开发 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
  • 创建实体类com.itheima.domain.User
 // 指定在序列化对象时,生成的根节点的名字
@XmlRootElement(name = "user")
public class User {
private int id;
private String name;
private int age;

public User() {
}
public User(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
  • 创建接口com.itheima.service.UserService

 public interface UserService {
// URL = http://localhost:8080/rs_server/webservice/userService/user
@POST
@Path("/user")
@Consumes({ "application/xml", "application/json" })
public void saveUser(User user);

// URL = http://localhost:8080/rs_server/webservice/userService/user?id=1
@DELETE
@Path("/user")
@Consumes({ "application/xml" })
public void delUser(@QueryParam("id") int id);

// URL = http://localhost:8080/rs_server/webservice/userService/user
@PUT
@Path("/user")
@Consumes({ "application/xml", "application/json" })
public void updateUser(User user);

// URL = http://localhost:8080/rs_server/webservice/userService/user
@GET
@Path("/user")
@Produces({ "application/xml", "application/json" })
public List<User> findAllUsers();

// URL = http://localhost:8080/rs_server/webservice/userService/user/1
@GET
@Path("/user/{id}")
@Consumes({ "application/xml" })
@Produces({ "application/xml", "application/json" })
public User findUserByID(@PathParam("id") int id);
}
  • 创建接口实现类
 public class UserServiceImpl implements UserService {

     @Override
public void saveUser(User user) {
System.out.println("用户保存成功:" + user);
}

@Override
public void delUser(int id) {
System.out.println("ID为 " + id + " 的用户删除成功");
}

@Override
public void updateUser(User user) {
System.out.println("用户更新成功:" + user);
}

@Override
public List<User> findAllUsers() {
List<User> list = new ArrayList<>();
list.add(new User(1, "zhangsan", 11));
list.add(new User(2, "lisi", 22));
return list;
}

@Override
public User findUserByID(int id) {
return new User(1, "zhangsan", 11);
}
}
  • 在web.xml中增加以下配置
 <!-- 指定Spring框架配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置Spring框架的监听器 -->
<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>
</servlet>
<!--指定Servlet的访问路径 -->
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/webservice/*</url-pattern>
</servlet-mapping>
  • 配置applicationContext.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"
xmlns:soap="http://cxf.apache.org/bindings/soap"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd ">
<!-- 注册服务提供者 -->
<bean id="userServiceImpl" class="com.itheima.service.impl.UserServiceImpl"></bean>
<!--
发布Web服务
address : 请求地址
-->
<jaxrs:server address="/userService">
<jaxrs:serviceBeans>
<ref bean="userServiceImpl" />
</jaxrs:serviceBeans>
<!--
拦截请求信息,非必须
设置后,可以在控制台观察到请求信息
-->
<jaxrs:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
</jaxrs:inInterceptors>
<!--
拦截响应信息,非必须
设置后,可以在控制台观察到响应信息
-->
<jaxrs:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
</jaxrs:outInterceptors>
</jaxrs:server>
</beans>

3、使用CXF开发WebService客户端(JAX-RS)

  • 创建Maven工程,类型为JAR

  • 引入坐标
 <!-- cxf-rs的坐标 -->

 <dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.1</version>
</dependency>
<!-- cxf-rs客户端的坐标 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 增强cxf-rs,可以处理json数据 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 上面的依赖必须依赖此包 -->
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.3.7</version>
</dependency>
</dependencies>
  • 将Server工程的实体类拷贝过来

  • 示例测试代码

 public class CXFTest {
  ​// HTTP 405 Method Not Allowed : 请求方式错误,例如,服务端要求使用POST请求,客户端发起请求的时候,使用了PUT请求
  //保存
  ​@Test
  ​public void test1() {
    ​​WebClient// 服务器地址 : 端口号/项目名/
​​​​​        // web.xml中cxfServlet指定的地址/applicationContext.xml中指定的地址/类上Path指定的地址/方法上Path指定的地址
      ​​​​.create("http://localhost:8080/cxf_rs_server/webService/userService/user")// 指定请求的地址
    ​​​​  .post(new User(11, "张三", "123"));
  ​}
  //删除
  ​@Test
  ​public void test2() {
    ​​WebClient
      ​​​​.create("http://localhost:8080/cxf_rs_server/webService/userService/user")
​​​​      .query("id", 100).delete();
​  }   //更新
  ​@Test
  ​public void test3() {
    ​​WebClient
​​​​      .create("http://localhost:8080/cxf_rs_server/webService/userService/user")
​​​​      .put(new User(11, "张三", "123"));
​  } 
  
//查询所有
  ​@Test
  ​public void test4() {
    ​​Collection<? extends User> collection = WebClient
      ​​​​.create("http://localhost:8080/cxf_rs_server/webService/userService/user")
      ​​​​.getCollection(User.class);
    for (User user : collection) {
        ​​​System.out.println(user);
​​    }
​  }   //根据字段查询结果
​  @Test
​  public void test5() {
    ​​User user = WebClient
    ​​​​  .create("http://localhost:8080/cxf_rs_server/webService/userService/user")
​​​​      .query("id", 11).get(User.class);     ​​System.out.println(user);
  ​}   ​@Test
  ​public void test6() {
​​    User user = WebClient
      ​​​​.create("http://localhost:8080/cxf_rs_server/webService/userService/user/" + 22 + "/icon")
      ​​​​.get(User.class);     ​​System.out.println(user);
​  }

  ​@Test
  ​public void test7() {
    ​​WebClient
​​​​      .create("http://localhost:8080/cxf_rs_server/webService/userService/user")// 指定请求的地址
      ​​​​.type(MediaType.APPLICATION_JSON)// 指定本客户端传递给服务器的数据格式
      ​​​​.accept(MediaType.APPLICATION_JSON)//指定服务器传递回来的数据格式,本客户端能处理的数据格式
​​​​      .post(new User(11, "张三", "123"));
  ​}
}

4、RESTFul常用注解

4.1 路径相关

  • @Path : 设置访问路径. 可以用在方法或类上面

4.2 参数类型相关

  • @Consumers: 定义方法参数类型,常用值为 : "application/xml", "application/json"

  • @Producers: 定义方法返回值类型,常用值为 : "application/xml", "application/json"

4.3 参数相关

  • @QueryParam : 查询参数. 客户端传参:url?id=10

  • @PathParam : 路径参数. 客户端传参:url/10

4.4 操作类型相关

  • @GET: 查询操作

  • @POST: 添加操作

  • @DELETE : 删除操作

  • @PUT: 修改操作

Web Service与Apache CXF 框架的更多相关文章

  1. 怎样更好的设计你的REST API之基于REST架构的Web Service设计及REST框架实现

    一.REST 含状态传输(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格. 眼下在 ...

  2. JAVA开发Web Service几种框架介绍

    郑重声明:此文为转载来的,出处已不知了,侵告删. 在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS( ...

  3. Web Service学习之二:Web Service(for JAVA)的几种框架

    在讲Web Service开发服务时,需要介绍一个目前开发Web Service的几个框架,分别为Axis,axis2,Xfire,CXF以及JWS(也就是前面所述的JAX-WS,这是Java6发布所 ...

  4. Web服务cxf框架发布2

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317/ ...

  5. Web Service学习-CXF开发Web Service实例demo(一)

    Web Service是什么? Web Service不是框架.更甚至不是一种技术. 而是一种跨平台,跨语言的规范 Web Service解决什么问题: 为了解决不同平台,不同语言所编写的应用之间怎样 ...

  6. apache CXF Service 简单使用

    cxf介绍 框架官网:cxf.apache.org 支持多种协议: SOAP1.1,1.2 XML/HTTP CORBA(Common Object Request Broker Architectu ...

  7. JAX-RS 方式的 RESTful Web Service 开发

    JAX-RS 方式的 RESTful Web Service 开发 ——基于 CXF+Spring 的实现 Web Service 目前在风格上有两大类,一个是基于 SOAP 协议,一个是完全遵循 H ...

  8. Apache CXF入门

    CXF简介 Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了.CXF 继承了 Celtix 和 XFire 两大 ...

  9. JAVAEE——BOS物流项目07:WebService入门、apache CXF入门、基于CXF发布CRM服务

    1 学习计划 1.WebService入门 n 什么是WebService n 调用网络上的WebService服务 n SOAP和WSDL概念 n 基于JDK1.7发布一个简单的WebService ...

随机推荐

  1. shell实战之case语句的选择提示

    知识点包括:case语句,cat多行输入,break和exit的区别,wget断点续传,while中断条件写法,函数的使用方法 #!/bin/bash echo "\n1. 本机容器情况如下 ...

  2. 图的最短路径---弗洛伊德(Floyd)算法浅析

    算法介绍 和Dijkstra算法一样,Floyd算法也是为了解决寻找给定的加权图中顶点间最短路径的算法.不同的是,Floyd可以用来解决"多源最短路径"的问题. 算法思路 算法需要 ...

  3. 1.需要对txt存放的测试数据做去重处理,代码如下

    采用集合去重,在新文件里逐行写入,达成目的 old_file = "D:/testdata/memberId.txt" #old result_file = "D:/te ...

  4. i2c_smbs 函数

    i2c_smbus系列函数有: s32 i2c_smbus_read_byte(const struct i2c_client *client); s32 i2c_smbus_write_byte(c ...

  5. EDEM 2018 + Fluent 19.0耦合

    具体步骤参考流沙的文章即可,如果python版本较高,可能有个地方需要小小的改动一下: tools文件夹下的compile_lib_edem_coupling.py文件中,导入模块有个地方需要修改 其 ...

  6. Struts2 漏洞系列之S2-001分析

    0x00 前言   最近在学习java的相关漏洞,所以Struts2的漏洞自然是绕不开的.为了更好的理解漏洞原理,计划把Struts2所有的漏洞自己都做一个复现.并且自己去实现相关的POC.相关的环境 ...

  7. 让 Linux grep 的输出不换行

    在Redhat中亲测. 本来ps -ef的输出是不会换行的,但是 ps -ef | grep java 就换行了. 如果想让grep完的结果不要换行,找到两种方法. 1. 在后面拼接 less -S: ...

  8. Openerp 修改 tree view 的列宽

    在 tree 的后边添加自定义css 列:“my_class" 然后在对应的css文件中,添加样式: 保存,重新刷新页面即可.

  9. java注释详解--javadoc注释

    一. Java注释分类// 注释一行 /* ...... */ 注释若干行 /** ...... */ 注释若干行,并写入 javadoc 文档 通常这种注释的多行写法如下: /** * ...... ...

  10. C#调用SQLite报错:无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块

    C#调用SQLite数据库,有些情况下会报以下这个错误: 无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块 实际上程序目录中是存在SQLite.Interop.dll这个文 ...