本帖最后由 小石姐姐 于 2017-11-27 11:14 编辑
WebService && CXF
Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序
用于多平台、系统之间的数据传输,分布式系统之间的通信
CXF
cxf 是Apache旗下的WebService 开发框架
JAX-WS 传输数据,就是 XML 格式,基于 SOAP 协议
JAX-RS 传输数据,传输 XML 格式或者 JSON 格式,基于 HTTP 协议
jax_ws
使用maven导入依赖
<!-- 进行cxf_ws服务开发 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</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>
<!-- 日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
编写服务
接口
@WebService 使用类上面,标记类是 WebService 服务提供对象
@WebMethod 使用方法上面,标记方法 是 WebService 服务提供方法
实现类
@WebService 注解设置 endPointInterface 接口服务完整类名, servicename 服务名称
@WebService(endpointInterface = "cn.itcast.cxf.service.IUserService", serviceName = "userService")
服务发布
服务实现对象
IUserService userService = new UserServiceImpl();
设置发布地址
String address = "http://localhost:9999/userService";
发布服务
Endpoint.publish(address, userService);
客户端调用
通过JaxWsProxyFactoryBean获取代理对象工厂
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
设置实现的接口
jaxWsProxyFactoryBean.setServiceClass(IUserService.class);
设置访问地址
jaxWsProxyFactoryBean.setAddress("http://localhost:9999/userService");
通过拦截器 打印soap 报文信息
jaxWsProxyFactoryBean.getInInterceptors().add(new LoggingInInterceptor());
jaxWsProxyFactoryBean.getOutInterceptors().add(new LoggingOutInterceptor());
通过代理对象工厂获得代理类
IUserService proxy = (IUserService) jaxWsProxyFactoryBean.create();
调用方法
spring 整合 jax_ws
引入依赖
spring核心及测试
cxf ws开发
<!-- CXF WS开发必须 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.1</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<!-- spring测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
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>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>
在applicationContext.xml 配置文件中引入名称空间及约束
xmlns:jaxws="http://cxf.apache.org/jaxws"
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
配置
<jaxws:server id="userService" address="/userService"
serviceClass="cn.itcast.cxf.service.IUserService">
<jaxws:serviceBean>
<bean class="cn.itcast.cxf.service.UserServiceImpl" />
</jaxws:serviceBean>
</jaxws:server>
address 客户端访问服务路径
serviceClass 配置接口
serviceBean 配置实现类
客户端
配置文件与服务器一致
<jaxws:client id="userServiceClient"
serviceClass="cn.itcast.cxf.service.IUserService"
address="http://localhost:9998/cxf_ws_spring/services/userService" >
<!-- 来源消息拦截器 -->
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
</jaxws:inInterceptors>
<!-- 输出消息拦截器 -->
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
</jaxws:outInterceptors>
</jaxws:client>
serviceClass 服务接口
address 服务访问地址
jax_rs
Restful 风格的服务
一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制
HTTP动(标记在方法上的注解)
对于资源的具体操作类型,由HTTP动词表示。
常用的HTTP动词有下面五个(括号里是对应的SQL命令)
GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源(保存操作)
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源,修改操作)。
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)
DELETE(DELETE):从服务器删除资源
http://localhost:9997/userService/user 查询所有用户信息
http://localhost:9997/userService/user/1 查询用户编号为 1 的用户信息
访问服务器统一资源,采用不同 HTTP 协议请求方式,服务器端可以得知进行 CRUD 哪
个操作
独立发布rs 服务
导入maven依赖
<!-- 使用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>
在实体类上加注解
@XmlRootElement 指定序列化(转换 XML、JSON) 对象名字
在业务接口上加注解
@Path("/userService") 服务访问资源路径
在方法上加注解
@GET 查询 @PUT 修改 @POST 增加 @DELETE 删除
@Path("/user") || @Path("/user/{id}") 带参数
服务访问资源路径
@Consumes({ "application/xml", "application/json" })
@Consumes 指定能够处理客户端传递过来数据格式
@Produces({ "application/xml", "application/json" })
@Produces 指定能否生成哪种格式数据返回给客户端
方法的参数加注解@PathParam("id")
public User finUserById(@PathParam("id") Integer id);
如果实现某条数据单独查询,使用 url 参数
发布服务
创建业务接口 实现类对象
IUserService userService = new UserServiceImpl();
通过服务器FactoryBean 创建服务
JAXRSServerFactoryBean jaxrsServerFactoryBean = new JAXRSServerFactoryBean();
将哪些实体数据转换xml、json发送
jaxrsServerFactoryBean.setResourceClasses(User.class, Car.class);
设置要发布的服务
jaxrsServerFactoryBean.setServiceBean(userService);
设置要发布的地址
jaxrsServerFactoryBean.setAddress("http://localhost:9997");
发布服务
jaxrsServerFactoryBean.create();
RS客户端
导入依赖
<!-- 使用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>
create 建立与调用 服务资源路径 连接
type 发送给服务器数据格式 --- @Consumes
accept 接收服务器传输数据格式 ---- @Produces
采用HTTP协议哪种方式访问服务
Collection<? extends User> collection = WebClient
.create("http://localhost:9997/userService/user")
.accept(MediaType.APPLICATION_XML).getCollection(User.class);
System.out.println(collection);
// 添加用户
User user = new User();
WebClient.create("http://localhost:9997/userService/user")
.type(MediaType.APPLICATION_JSON).post(user);
// 查询某个用户,获取json
User resultUser = WebClient
.create("http://localhost:9997/userService/user/1")
.accept(MediaType.APPLICATION_JSON).get(User.class);
System.out.println(resultUser);
}
JAX-RS整合spring
导入依赖
<!-- 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>
修改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>
<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>
修改applicationContext.xml
引入名称空间:xmlns:jaxrs="http://cxf.apache.org/jaxrs"
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
<!--
address 发布服务地址
servicesBeans 服务实现类
-->
<jaxrs:server id="userService" address="/userService" >
<jaxrs:serviceBeans>
<bean class="cn.itcast.cxf.service.UserServiceImpl" />
</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>
最终访问资源服务路径
服务器根目录地址 + web.xml 配置 + applicationContext.xml address 配置 + 类 @Path +方法 @Path |
|