A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 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

1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马