【码】webservice+ApacheCXF基础入门

声明:基于某智播客课堂讲义及讲师课堂笔记,如有问题或者涉及到侵权,请联系删除。

  1. 介绍

  1. webService入门(了解)
  2. 基于jdk1.7开发webservice服务(了解)
  3. Apache CXF框架入门(掌握)
  4. 基于CXF框架搭建CRM系统(掌握)
  5. 基于eclipse+tomcat+Oracle10g+maven
  6. 本机同时运行客户端和服务端,需要同时配置两个tomcat,端口地址不能一样,否则会端口冲突打开失败

 

  1. webService入门

Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准通用标记语言下的一个子集)标准描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作应用程序[1] 

 

 

Webservice跨平台跨语言;

Java 客户端 -----》 .net服务端

  1. 基于jdk调用网络上服务

http://www.webxml.com.cn/zh_cn/index.aspx :提供功能服务

 

  1. 找到服务的wsdl地址
  2. 通过jdk提供命令wsimport命令生成java调用代码

  1. 将生成代码拷贝到本地,测试代码:

  1. soap协议:简单对象访问协议

规范wbeservice请求,响应数据格式:都是xml格式

 

Request:

POST /WebServices/MobileCodeWS.asmx HTTP/1.1

Host: ws.webxml.com.cn

Content-Type: text/xml; charset=utf-8

Content-Length: length

SOAPAction: "http://WebXml.com.cn/getMobileCodeInfo"

 

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

<soap:Body>

<getMobileCodeInfo xmlns="http://WebXml.com.cn/">

<mobileCode>string</mobileCode>

<userID>string</userID>

</getMobileCodeInfo>

</soap:Body>

</soap:Envelope>

Response:

 

HTTP/1.1 200 OK

Content-Type: text/xml; charset=utf-8

Content-Length: length

 

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

<soap:Body>

<getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">

<getMobileCodeInfoResult>string</getMobileCodeInfoResult>

</getMobileCodeInfoResponse>

</soap:Body>

</soap:Envelope>

SOAP 1.2

  1. wsdl webservice描述语言

俗称"web服务使用说明书"

 

网络服务描述/定义语言:每一个webservice服务都有自己wsdl

wsdl是标准xml文件,wsdl(xml文件)包含服务名称,服务中包含方法名方法参数(参数类型),方法返回类型

 

通过jdk提供命令wsimport,解析wsdl(本质就是xml文件),生成客户端java调用代码(生成代码方法名称,方法参数,方法返回类型)。

 

WSDL地址:服务地址+?WSDL

  1. wsimport命令

 

 

  1. WebService入门基于jdk1.7发布服务(了解)

    1. 基于jdk基于1.7调用网络上服务

http://www.webxml.com.cn/zh_cn/index.aspx :提供功能服务

 

  1. 找到服务的wsdl地址

 

  1. 通过jdk提供命令wsimport命令生成java调用代码

  1. 将生成代码拷贝到本地,测试代码:

  1. wsimpot命令

  1. soap简单对象访问协议

规范wbeservice请求数据,响应数据格式:xml -- 跨语言调用

 

Request:

POST /WebServices/MobileCodeWS.asmx HTTP/1.1

Host: ws.webxml.com.cn

Content-Type: text/xml; charset=utf-8

Content-Length: length

SOAPAction: "http://WebXml.com.cn/getMobileCodeInfo"

 

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

<soap:Body>

<getMobileCodeInfo xmlns="http://WebXml.com.cn/">

<mobileCode>string</mobileCode>

<userID>string</userID>

</getMobileCodeInfo>

</soap:Body>

</soap:Envelope>

Response:

 

HTTP/1.1 200 OK

Content-Type: text/xml; charset=utf-8

Content-Length: length

 

<?xml version="1.0" encoding="utf-8"?>

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

<soap:Body>

<getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">

<getMobileCodeInfoResult>string</getMobileCodeInfoResult>

</getMobileCodeInfoResponse>

</soap:Body>

</soap:Envelope>

SOAP 1.2

  1. wsdl

webservice 描述语言。

俗称:web服务使用说明书

 

网络服务描述语言:每一个webservice服务都有自己wsdl

Wsdl是标准xml文件,包含服务名称,包含方法,方法参数,方法返回类型

 

通过命令wsimport,解析wsdl,生成java调用代码。

 

  1. jdk1.7服务端发布webservice服务(了解)

  1. 创建类,创建若干方法
  2. 在类上使用注解@WebService

  1. 发布服务

  1. wsdl地址: 服务地址+?wsdl

  1. 客户端调用

    1. wsimport生成java调用代码

获取服务的wsdl地址: 服务地址+?wsdl

 

wsimport – d <生成class文件目录> -s<生成java文件目录> -p <生成代码包路径> wsdl地址

 

解析wsdl(xml),生成本地代码

 

  1. 通过命令解析wsdl生成代码

  1. 将生成的java文件拷贝项目中
  2. 测试代码

  1. Apache cxf框架入门

Apache CXF = Celtix + Xfire 支持多种协议: SOAP1.1,1.2 XML/HTTP CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构,早期语言使用的WS;C,c++,C#) 并可以与Spring进行快速无缝的整合 灵活的部署:可以运行在Tomcat,Jboss,Jetty(内置),IBMWS,BeaWL上面。

<!-- 导入webservice依赖 -->

        <dependency>

            <groupId>org.apache.cxf</groupId>

            <artifactId>cxf-rt-frontend-jaxws</artifactId>

            <version>${cxf.version}</version>

        </dependency>

        

        <dependency>

            <groupId>org.apache.cxf</groupId>

            <artifactId>cxf-rt-transports-http</artifactId>

            <version>${cxf.version}</version>

        </dependency>

 

        <dependency>

            <groupId>org.apache.cxf</groupId>

            <artifactId>cxf-rt-frontend-jaxrs</artifactId>

            <version>${cxf.version}</version>

        </dependency>

 

        <dependency>

            <groupId>org.apache.cxf</groupId>

            <artifactId>cxf-rt-rs-client</artifactId>

            <version>${cxf.version}</version>

        </dependency>    

        

        <dependency>

            <groupId>org.apache.cxf</groupId>

            <artifactId>cxf-rt-rs-extension-providers</artifactId>

            <version>${cxf.version}</version>

        </dependency>

 

  1. 服务端

  1. 创建web项目
  2. 课后资料中,cxf开发jar包(跟spring整合),导入项目中

  1. 配置约束位置

  1. 搭建CXF环境
    1. 提供cxf的配置文件(spring配置文件需要导入jaxws名称空间)

<?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:jaxws="http://cxf.apache.org/jaxws"

    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://cxf.apache.org/bindings/soap

http://cxf.apache.org/schemas/configuration/soap.xsd

http://cxf.apache.org/jaxws

http://cxf.apache.org/schemas/jaxws.xsd">

 

 

</beans>

  1. Web.xml中配置Servlet

<!-- 配置cxf提供servlet 1、发布webservice服务 2、处理客户端访问请求 -->

<servlet>

    <servlet-name>cxf</servlet-name>

    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

    <!—暂时使用初始化参数加载cxf配置文件(spring配置文件),后期使用spring监听器加载spring配置文件 -->

    <init-param>

        <param-name>config-location</param-name>

        <param-value>classpath:applicationContext.xml</param-value>

    </init-param>

</servlet>

 

  1. 创建服务接口,实现类,在接口上使用注解@webService注解
  2. 在cxf配置文件中发布服务

  1. 查看wsdl地址:

 

  1. 客户端调用

通过命令生成本地调用java代码:

 

  1. Jdk的方式(了解)

  1. wsdl地址:服务地址+?wsdl

  1. 将上面生成所有java文件拷贝到项目
  2. 测试代码

  1. CXF方式(掌握

通过spring工厂产生代理对象;

 

  1. 创建新的工程
  2. 将cxf的相关jar包到入项目
  3. 提供cxf配置文件:spring配置文件
  4. 只需要拷贝生成的服务接口到项目中,在cxf配置文件中进行配置

  1. 测试代码

  1. 总结

解决两个项目直接互相调用;

 

  1. 基于cxf搭建CRM项目环境

 

CRM系统只是为了提供webservice服务供其他两个项目:后台管理系统,前台系统调用;没有提供对客户数据模块维护页面;

CRM项目中使用技术:spring+spring-data-jpa +CXF +oracle数据库

 

 

  1. 搭建数据库环境

  1. 创建表空间
  2. 创建用户,用户授权

--创建表空间

create tablespace itcast271_crm

datafile 'c:\itcast271_crm.dbf'

size 200m

autoextend on

next 10m;

 

 

 

--创建用户

create user xiaolongnv identified by xiaolongnv

default tablespace itcast271_crm;

 

--授权

grant resource,connect to xiaolongnv;

  1. 搭建项目环境

Spring+spring-data-jpa+CXF

  1. 创建maven –project 父工程为:common_parent

  1. CRM框架环境

Spring+spring-data-jpa+CXF

 

  1. 搭建spring环境
    1. 配置文件:applicationContext.xml
    2. Web.xml配置监听器
  2. Spring整合jpa
  3. Spring-data-jpa :2,3配置去复制bos_web项目下 注意:包扫描路径改为crm

<?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:aop="http://www.springframework.org/schema/aop"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:jdbc="http://www.springframework.org/schema/jdbc"

    xmlns:jaxws="http://cxf.apache.org/jaxws"

    xmlns:soap="http://cxf.apache.org/bindings/soap"

    xmlns:tx="http://www.springframework.org/schema/tx"

    xmlns:jpa="http://www.springframework.org/schema/data/jpa"

    xmlns:task="http://www.springframework.org/schema/task"

    xsi:schemaLocation="

                        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

                        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

                        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd

                        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd

                        http://www.springframework.org/schema/data/jpa

                        http://www.springframework.org/schema/data/jpa/spring-jpa.xsd

                        http://cxf.apache.org/bindings/soap

                        http://cxf.apache.org/schemas/configuration/soap.xsd

                        http://cxf.apache.org/jaxws

                        http://cxf.apache.org/schemas/jaxws.xsd">

                        

    <!-- 连接池 -->

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

        <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />

        <property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.133.10:1521:ORCL" />

        <property name="user" value="xiaolongnv" />

        <property name="password" value="xiaolongnv" />

    </bean>

    

    <!--

        jap:entityManger操作数据库 相对于hibernate中Session对象

        JPA是统一规范,hibernate实现JPA标准 -->

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

        <property name="dataSource" ref="dataSource" />

        <!-- 扫描实体类包:包含子包 -->

        <property name="packagesToScan" value="cn.itcast.crm.domain" />

        <!-- 指定持久层提供者为Hibernate -->

        <property name="persistenceProvider">

            <bean class="org.hibernate.ejb.HibernatePersistence" />

        </property>

        <property name="jpaVendorAdapter">

            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">

                <!-- 自动建表 -->

                <property name="generateDdl" value="true" />

                <property name="showSql" value="true" />

                <property name="database" value="ORACLE" />

                <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" />

            </bean>

        </property>

        <property name="jpaDialect">

            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />

        </property>

    </bean>

    

    <!-- 事务管理器 -->

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">

        <property name="entityManagerFactory" ref="entityManagerFactory" />

    </bean>

    

    <!-- 注解方式管理事务 -->

    <tx:annotation-driven transaction-manager="transactionManager"/>

    

    <!-- spring-Data整合jpa:解放持久层

        base-package:设置为dao接口包,指定到父包,当项目启动时候,对接口产生代理对象。通过代理对象调用CRUD方法

     -->

    <jpa:repositories base-package="cn.itcast.crm.dao"></jpa:repositories>

    

    <!-- service,action对象创建使用注解方式 -->

    <context:component-scan base-package="cn.itcast.crm"></context:component-scan>

</beans>

  1. 服务端CXF环境
    1. Web.xml配置servlet

<!-- 配置cxfServlet 处理客户端请求 -->

 

<servlet>

    <servlet-name>cxf</servlet-name>

    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

<!--     <init-param>之前通过初始化参数加载spring配置文件,发布服务;现在已经配置监听器</init-param> -->

</servlet>

 

<servlet-mapping>

    <servlet-name>cxf</servlet-name>

    <url-pattern>/service/*</url-pattern>

</servlet-mapping>

5、Web.xml

<!-- spring的监听器 -->

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

 

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>classpath:applicationContext.xml</param-value>

    </context-param>

 

    <!-- cxfServlet:处理客户端请求 2、发布服务 -->

    <servlet>

        <servlet-name>cxf</servlet-name>

        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

    </servlet>

 

    <servlet-mapping>

        <servlet-name>cxf</servlet-name>

        <url-pattern>/service/*</url-pattern>

    </servlet-mapping>

  1. 发布查询所有的客户数据服务

添加新server:

 

  1. 将资料中客户实体导入bos_crm项目中

2、启动项目完成自动建表

  1. 执行资料中sql脚本,添加测试客户数据

  1. 数据库中数据

  1. 实现案例

  1. 创建服务接口,在接口上使用注解@WebService,创建实现类

  1. Cxf配置文件中,配置webservice服务端对象

  1. 启动项目:查询webservice服务

Wsdl地址:服务地址+?wsdl

  1. 完善服务端查询所有客户方法
    1. 创建dao继承jparepository
    2. 将dao对象注入service中
      1. 调用服务户端方法

  1. 将接口拷贝到bos-service项目中

  1. 在客户端spring配置文件中,配置客户端调用对象

  1. 在需要调用CRM的代码中注入客户端对象

 

相关资料链接:https://pan.baidu.com/s/16IhLwfKGabTQp6SSUMSP_g 密码:a6c1

idea环境下相关问题处理:

无法使用@Autowired , could not autowire   :    http://www.cnblogs.com/Vgger/p/8596020.html

posted @ 2018-03-18 09:42  两行仨bug  阅读(544)  评论(0编辑  收藏  举报