CXF-RS(Restful)风格:所有资源都共享统一的接口,以便在客户端和服务器之间传输状态,使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和 DELETE,可以支持多种消息格式-->xml,json.更易于实现缓存机制,第一次访问资源缓存,第二次访问资源返回304查找本地资源.
对于请求方式的不同所对应的操作不同:
POST:保存操作
PUT:修改操作
GET:查询操作
DELETE:删除操作
对于同一请求方式,同一请求路径,可以通过不同的参数进行不同的操作或返回不同的资源。
一、WebService-CXF的rs风格独立开发:
开发前提-->导入依赖:
<dependencies>
<!-- 使用CXF RS开发 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 内置jetty web服务器 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 使用log4j日志实现 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<!-- 使用rs客户端 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 在CXF扩展提供者,提供转换json接口 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>3.0.1</version>
</dependency>
<!-- cxf 扩展提供者 转换json 默认需求一个工具包 -->
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.3.7</version>
</dependency>
</dependencies>
1、对需要传递的数据对象实体类上要添加@XmlRootElement(name="对象名")注解,用于转换为xml或json格式进行数据传输.
2、对发布的业务接口上有以下注解:
@Path("/接口服务的访问路径")
3、对发布的业务接口的方法上有以下注解:
①、@GET 查询 @PUT 修改 @POST 增加 @DELETE 删除
②、@Path("/访问该方法的路径/{参数}") 服务访问资源路径
③、@Consumes({ "application/xml", "application/json" }) //consumes消费,方法参数
@Produces({ "application/xml", "application/json" }) //produces生产,方法返回值
4、对发布的业务接口的方法参数上有以下注解:
①、(@PathParam("id") Integer id) -->PathParam的名称应与@Path访问路径后的参数名一致
②、(@QueryParam("username") String username,@QueryParam("password") String password) -->QueryParam类似于http的get请求参数,一般用于传递多个参数,由?&&...拼接组成.
5、发布服务:
public class RS_Server {
public static void main(String[] args) {
//创建业务接口实现类对象
IUserService userService = new UserServiceImpl();
//创建服务
JAXRSServerFactoryBean jaxrsServerFactoryBean = new JAXRSServerFactoryBean();
//指定将哪些实体类装换成json或xml
jaxrsServerFactoryBean.setResourceClasses(Car.class,User.class);
jaxrsServerFactoryBean.setAddress("http://localhost:8888");
jaxrsServerFactoryBean.setServiceBean(userService);
//发布项目
jaxrsServerFactoryBean.create();
}
}
6、创建客户端访问资源:
public class RS_Client {
public static void main(String[] args) {
/*
* create 建立与服务资源调用的连接
* type 发送给服务器的数据格式 -- @Consumes
* accept 接收服务器传输的数据格式 -- @Produces
* get/put/post/delete
*/
Collection<? extends User> collection = WebClient.create("http://localhost:8889/userService/user")
.accept(MediaType.APPLICATION_JSON).getCollection(User.class);
System.out.println(collection);
/*User user = new User();
WebClient.create("http://localhost:8889/userService/user").type(MediaType.APPLICATION_XML).post(user);*/
}
}
二、WebService-CXF的Spring整合的rs风格独立开发:
开发前提-->①导入依赖:导入日志的配置文件
<dependencies>
<!-- cxf 进行rs开发 必须导入 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 日志引入 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<!-- 客户端 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 扩展json提供者 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>3.0.1</version>
</dependency>
<!-- 转换json工具包,被extension providers 依赖 -->
<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>
<!-- spring 整合junit -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- junit 开发包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
②.在web.xml中配置web开发的spring核心监听器:
<!-- 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>
③.在web.xml中配置cxf基于web访问的servlet配置:
<servlet>
<servlet-name>CXFService</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFService</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
1、在服务器端发布服务:
<?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.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
<!--
address 发布服务地址
servicesBeans 服务实现类
-->
<jaxrs:server id="service" address="/资源访问路径" >
<jaxrs:serviceBeans>
<bean class="xx.xx.xx.服务接口实现类" />
</jaxrs:serviceBeans>
<jaxrs:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
</jaxrs:outInterceptors>
</jaxrs:server>
</beans>
2、在客户端即可访问,同上...
ws与rs的区别:
ws:使用jdk的原始动态代理开发,基于方法,"动词",资源传输基于soap协议-->xml+http
rs:约束条件遵守restful的原则,基于资源,"名词",资源传输基于http协议,可以传输json和xml格式的数据,现阶段比较主流