CXF

来源:互联网 发布:适合大学生的java项目 编辑:程序博客网 时间:2024/06/02 07:15

1、WebService入门

n  什么是WebService

n  调用网络上的WebService服务

n  SOAP和WSDL概念

n  基于JDK1.7发布一个简单的WebService服务

n  使用JDK的wsimport命令生成本地代码调用WebService服务

2、apache CXF入门

n  CXF简介

n  CXF入门案例(服务端开发)

n  CXF入门案例(客户端开发)

                            1)使用WSDL2Java命令生成本地代码调用

                            2)在配置文件中注册代理对象调用

3、基于CXF发布CRM服务

n  创建CRM数据库和CRM客户表

n  发布服务

 

 

2      WebService入门

2.1    什么是WebService

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

         WebService技术,能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。依据Web Service规范实施的应用之间,无论它们所使用的语言、平台或内部协议是什么,都可以相互交换数据。Web Service是自描述、自包含的可用网络模块,可以执行具体的业务功能。Web Service也很容易部署,因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。WebService为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。

 

         WebService就是实现多个系统之间的远程调用技术。WebService可以实现跨语言的调用。

 

  1. WebService,顾名思义就是基于Web的服务。它使用Web(HTTP\ XML)方式,接收和响应外部系统的某种请求。从而实现远程调用.
  2. 我们可以调用互联网上查询天气信息Web服务,然后将它嵌入到我们的程序(C/S或B/S程序)当中来,当用户从我们的网点看到天气信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单调用了一下服务器上的一段代码而已
  3. 学习WebService可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样。

网络上的webService:

http://www.webxml.com.cn/zh_cn/index.aspx

实现webService方式:

cxf

http+json

axis

 

webservice分析:

 

需求:调用网络上的手机号码归属地查询服务

第一步:

通过wsimport命令生成客户端代码

第二步:

删除不用class,新建一个java工程

第三步:

将生成的客户端代码copy到工程中

第四步:测试服务

2.2    基于JDK1.7发布一个WebService服务

第一步:创建一个Java项目,基于jdk1.7

第二步:创建HelloService类,提供sayHello方法

第三步:在HelloService类上加入WebService注解

第四步:提供main方法,调用jdk提供的Endpoint的publish发布服务的方法

 

@WebService

publicclass HelloService {

         public String sayHello(Stringname){

                   System.out.println("sayHello方法被调用了。。。。");

                   return"hello " +name;

         }

        

         publicstaticvoid main(String[]args) {

                   //参数一:指定服务的发布地址

                   //参数二:服务端提供服务的对象实例

                   Endpoint.publish("http://192.168.99.83:8080/hello",new HelloService());

                   System.out.println("服务发布好了");

         }

}

 

客户端调用过程:

第一步:获得wsdl地址,地址为服务发布地址+?wsdl

第二步:使用一个命令wsimport,解析wsdl文件生成本地代码

第三步:使用生成的本地代码创建一个代理对象,通过这个代理对象就可以实现对服务端的远程调用

 

 

注意点:包名不能在生成客户端代码后,手动修改

如果没有设置包-p,默认跟服务端包名一致

 

2.3    SOAP和WSDL概念

l  SOAP(Simple Object Access Protocol):简单对象访问协议

 

•    SOAP作为一个基于XML语言的协议用于在网上传输数据。

•    SOAP = 在HTTP的基础上+XML数据。

•    SOAP是基于HTTP的。

•    SOAP的组成如下:

•    Envelope – 必须的部分。以XML的根元素出现。

•    Headers – 可选的。

•    Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据

请求

响应

 

l  WSDL(WebService Description Language):Web服务描述语言,就是一个xml文档

•    通过XML形式说明服务在什么地方-地址。

•    通过XML形式说明服务提供什么样的方法 – 如何调用。

1.      通过wsdl地址生成客户端代码

2.      一个文档,描述服务名,方法,具体的参数,返回值。

 

2.4    wsimport命令使用

wsimport是由jdk提供的命令,作用是解析wsdl文件,生成本地代码

 

wsimport –s . (将生成的代码写当前目录)  http://10.254.1.53:8080/hello?wsdl(必须 wsdl地址)

-d 生成class文件

-p 生成包名

-s 生成java文件+class文件

通过这个命令生成客户端调用的代码

 

WebService的特点

•    WebService通过HTTP POST方式接受客户的请求

•    WebService与客户端之间一般使用SOAP协议传输XML数据.

•    它本身就是为了跨平台或跨语言而设计的。

 

 

 

 

 

3      CXF简介

为什么学习CXF?

因为CXF跟Spring无缝整合,并且代码配置特别简单。

JAX-WS : JAVA FOR XML WebService

JAX-RS : JAVA FOR XML RestFul

官网:http://cxf.apache.org/

apache提供的一个WebService框架

在官网下载开发包:

解压zip文件:

 

l  wsdl2Java命令使用:

CXF框架提供一个和jdk提供的wsimport命令功能类似的命令wsdl2java,可以解析wsdl文件,生成本地代码

 

l  此工具位于cxf_home/bin目录下。参数与wsimport有所不同。

l  它包含以下参数:

•    -d参数,指定代码生成的目录。

•    -p参数,指定生成的新的包结构。

l  在命令行执行:

         wsdl2java–d . http://127.0.0.1:6666/helloworld?wsdl

注意:没有-s参数

3.1    CXF入门案例(服务端)

第一步:创建一个动态web项目

第二步:导入CXF相关的jar包(整合spring了)

第三步:在web.xml中配置一个CXF框架提供的Servlet

 

<!-- 配置CXF框架提供的Servlet -->

  <servlet>

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

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

       <!-- 由初始化参数指定配置文件 -->

       <init-param>

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

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

       </init-param>

  </servlet>

  <servlet-mapping>

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

       <url-pattern>/cxf/*</url-pattern>

  </servlet-mapping>

两种配置方式(classpath WEB-INF

 

第四步:在classpath下提供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: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>

 

 

第五步:开发一个接口和实现类,在接口上加入WebService注解

第六步:在applicationContext.xml中注册服务

<bean id="helloService" class="cn.itcast.cxf.service.HelloServiceImpl"/>

 

         <!-- 注册服务 -->

         <jaxws:serverid="myService"address="/hello">

                   <jaxws:serviceBean>

                            <refbean="helloService"/>

                   </jaxws:serviceBean>

         </jaxws:server>

注意:访问路径问题

需求:name=“arg0”è name=”name”

3.2    CXF入门案例(客户端)

l  使用jdk自带wsimport命令生成本地代码调用

l  使用WSDL2Java命令生成本地代码调用

 

l  在配置文件中注册代理对象调用

第一步:创建Java项目,并导入CXF相关的jar包

第二步:使用wsdl2java或者wsimport命令生成本地代码,只需要生成的接口文件

注意:将copy过来的接口ObjectFactory.class 删除

第三步:提供一个spring配置文件,注册客户端代理对象

<!-- 注册一个代理对象,由spring框架负责创建这个代理对象,通过这个代理对象完成远程调用 -->

<!-- 通过spring来创建代理对象,以及获取服务 address:配置到具体的服务-->

<!-id="helloService" 名称自定义 并且必须要有,因为要通过这个id获取到代理对象-à

         <jaxws:clientid="myProxy"address="http://192.168.99.83:8080/cxf_server/cxf/hello"serviceClass="cn.itcast.cxf.service.IHelloService"></jaxws:client>

第四步:加入spring文件创建spring工厂,从工厂中获取代理对象,远程调用

ApplicationContext ctx = newClassPathXmlApplicationContext("applicationContext.xml");

                   IHelloService proxy = (IHelloService)ctx.getBean("myProxy");

                   String re =proxy.sayHello("abc");

                   System.out.println(re);

 

 

4      基于CXF发布一个CRM服务

需求:基于CXF发布一个CRM服务,查询用户的所有数据

第一步:创建一个crm数据库

第二步:执行sql脚本,建表,插入客户数据

第三步:创建一个动态web项目,作为crm服务系统,导入CXF相关jar包

第四步:配置web.xml

 

<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>

       <!-- 由初始化参数指定配置文件

       <init-param>

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

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

       </init-param>

        -->

  </servlet>

  <servlet-mapping>

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

       <url-pattern>/cxf/*</url-pattern>

  </servlet-mapping>

 

第五步:在src目录下提供spring配置文件applicationContext.xml

第六步:创建一个ICustomerService接口,在接口上加入WebService注解

@WebService

publicinterface ICustomerService {

         public List<Customer> findAll();

}

第七步:提供CustomerServiceImpl实现类

@Transactional

publicclassCustomerServiceImpl implements ICustomerService{

         //@Autowired

         private JdbcTemplatejdbcTemplate;

         public List<Customer> findAll() {

                   String sql = "select * from t_customer";

                   List<Customer> list = getJdbcTemplate().query(sql,new RowMapper<Customer>(){

                            public Customer mapRow(ResultSetrs, intarg1)throws SQLException {

                                     intid =rs.getInt("id");

                                     String name = rs.getString("name");

                                     String station = rs.getString("station");

                                     String telephone = rs.getString("telephone");

                                     String address = rs.getString("address");

                                     String did = rs.getString("decidedzone_id");

                                     returnnew Customer(id,name, station, telephone,address, did);

                            }

                   });

                   returnlist;

         }

         public JdbcTemplate getJdbcTemplate() {

                   returnjdbcTemplate;

         }

         publicvoid setJdbcTemplate(JdbcTemplatejdbcTemplate) {

                   this.jdbcTemplate =jdbcTemplate;

         }

}

 

第八步:在applicationContext.xml中注册服务

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

<beans xmlns="http://www.springframework.org/schema/beans"

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

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

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

         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

                                                       http://www.springframework.org/schema/context

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

                                                       http://www.springframework.org/schema/aop

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

                                                       http://www.springframework.org/schema/tx

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

                                                       ">

<!--以前版本cxf版本比较低,需要我们手动导入配置->

         <importresource="classpath:META-INF/cxf/cxf.xml"/>

         <importresource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>

         <importresource="classpath:META-INF/cxf/cxf-servlet.xml"/>

         <beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">

                   <propertyname="driverClassName"value="com.mysql.jdbc.Driver"/>

                   <propertyname="url"value="jdbc:mysql:///crm0505"/>

                   <propertyname="username"value="root"/>

                   <propertyname="password"value="root"/>

         </bean>

        

         <beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate">

                   <propertyname="dataSource"ref="dataSource"/>

         </bean>

        

         <beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

                   <propertyname="dataSource"ref="dataSource"/>

         </bean>

        

         <!-- 支持事务注解 -->

         <tx:annotation-driven/>

        

         <!--

         <context:annotation-config></context:annotation-config>

          -->

        

         <beanid="customerService"class="cn.itcast.crm.service.CustomerServiceImpl">

                   <propertyname="jdbcTemplate"ref="jdbcTemplate"/>

         </bean>

        

         <!-- 注册服务 -->

         <jaxws:serverid="myService"address="/customer">

                   <jaxws:serviceBean>

                            <refbean="customerService"/>

                   </jaxws:serviceBean>

         </jaxws:server>

</beans>

 

客户端调用:

第一步:生成客户端代码

第二步:将生成的代码copy 到webservice10_client_01工程src目录下

第三步:写一个测试类,进行测试

 

注意:打印客户数据.toString()

 

原创粉丝点击