apache CXF入门

支持多种协议:

            •    SOAP1.1,1.2

            •    XML/HTTP

             •    CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构

                 ,早期语言使用的WS。C,c++,C#)

•    并可以与Spring进行快速无缝的整合

灵活的部署:可以运行在Tomcat,Jboss,Jetty(内置),IBMWS,BeaWL上面

CXF 可以创建的Web 服务应用有两种:服务提供者和服务消费者。这种结构可类比客户端/ 服务器结构,服务消费者类似于客户端,服务提供者类似于服务器。使用CXF 创建应用时,服务提供者和服务消费者并不需要同时出现,因为有可能应用只是作为服务提供者或服务消费者单独出现。

为了说明使用CXF 如何创建这两种类型的应用,本教程将同时给出它们的例子。另外,由于Groovy在Java 世界中变得越来越流行,本教程会给出使用Groovy 的CXF 插件GroovyWS 的实现例子。例子使用JDK 1.5.X 和Groovy 1.0 完成,包含以下几部分:

1.User,用户对象,在消费者和提供者之间传递;

2.UserService,用户管理服务,它提供增加和获取所有用户的功能;

3.Client,服务消费者,它向UserService发起服务请求。

首先介绍下webservice是什么

    用于不同系统之间的数据交互(例如数据库不在同一个服务器上,这时候需要webservice起调用远数据库作用

1 .webservice

所谓webservice就是定义了一套标准的调用过程:

a 服务器首先用一套标准的方法向外界描述它所提供的服务的内容,就属于WSDL;

b 客户端需要以一种标准的协议来调用此服务,这属于SOAP;

c 服务提供者将服务内容放在一个公共的网址让大家查询,就属于UDDI。


2 .命名空间

命名空间其主要目的通过加一个命名属性,使名称保持唯一性。

WSDL有大量的使用命名空间的地方。

本质上WSDL是一个XML文件,作为一个XML文件,为了区别同名的元素,就需要采用命名空间的概念。


3. WSDL的本质:服务内容的标准化描述

WSDL的全称是web service Description Language,是一种基于XML格式的关于web服务的描述语言。

其主要目的在于web service的提供者将自己的web服务的所有相关内容。

如所提供的服务的传输方式,服务方法接口,接口参数,服务路径等,生成相应的完全文档,发布给使用者。

使用者可以通过这个WSDL文档,创建相应的SOAP请求消息,通过HTTP传递给webservice提供者;

web服务在完成服务请求后,将SOAP返回消息传回请求者,服务请求者再根据WSDL文档将SOAP返回消息解析成自己能够理解的内容。


4 .SOAP的本质:标准的传输协议

SOAP是web service的标准通信协议,SOAP为simple object access protocoll的缩写,简单对象访问协议. 它是一种标准化的传输消息的XML消息格式。


5 .UDDI的本质:服务的公共网址

将web service进行UDDI注册发布,UDDI是一种创建注册表服务的规范,以便大家将自己的web service进行注册发布供使用者查找.然而当服务提供者想将自己的web service向全世界公布,以便外部找到其服务时,那么服务提供者可以将自己的web service注册到相应的UDDI商用注册网站,目前全球有IBM等4家UDDI商用注册网站。

因为WSDL文件中已经给定了web service的地址URI,外部可以直接通过WSDL提供的URI进行相应的web service调用。

所以UDDI并不是一个必需的web service组件,服务方完全可以不进行UDDI的注册。

介绍对于定义的服务实现类, 可以用注解进行修饰

@WebService 定义服务,在类上边

targetNamespace:指定命名空间

name:portType的名称

portName:port的名称

serviceName:服务名称

endpointInterface:如果一个服务类实现了多个服务接口,但只需要发布一个接口的方法,可通过此注解指定要发布服务的接口

@WebMethod 定义方法,在方法上边

operationName:方法名

exclude:设置为true表示此方法不是webservice方法,不会发布,默认是false

@WebResult 定义返回值,在方法返回值前边

name:返回结果值的名称

@WebParam 定义参数,在方法参数前边

name:指定参数的名称





服务端开发

第一步:创建动态web项目

第二步:导入CXF相关jar包



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

<!-- 配置CXF框架提供的Servlet -->
  <servlet>
  	<servlet-name>cxf</servlet-name>
  	<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  	<!-- 通过初始化参数指定CXF框架的配置文件位置 -->
  	<init-param>
  		<param-name>config-location</param-name>
  		<param-value>classpath:cxf.xml</param-value>
  	</init-param>

  </servlet>
  <servlet-mapping>
  	<servlet-name>cxf</servlet-name>
  	<url-pattern>/service/*</url-pattern>
  </servlet-mapping>

第四步:在类路径下提供cxf.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">
	<!-- 引入CXF Bean定义如下,早期的版本中使用 -->
	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

</beans>

第五步:开发一个接口和实现类

@WebService
public interface CustomerService {
       public List<Customer> findAll();
}
@Transactional
public class CustomerServiceImpl implements CustomerService {
   
	private JdbcTemplate jdbcTemplate;

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}



	@Override
	public List<Customer> findAll() {
		// TODO Auto-generated method stub
		String sql="select * from t_customer";
		List<Customer> list = jdbcTemplate.query(sql, new RowMapper<Customer>() {

			@Override
			public Customer mapRow(ResultSet rs, int arg1) throws SQLException {
				// TODO Auto-generated method stub
				int id = rs.getInt("id");
				String name = rs.getString("name");
				String station = rs.getString("station");
				String telephone = rs.getString("telephone");
				String address = rs.getString("address");
	            String decidedzone_id = rs.getString("decidedzone_id");	
				
				return new Customer(id, name, station, telephone, address, decidedzone_id);
			}
			
		});
		return list;
	}

}

第六步:在cxf.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"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
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://www.springframework.org/schema/tx 
                                        http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
					http://cxf.apache.org/jaxws 
					http://cxf.apache.org/schemas/jaxws.xsd">
	<!-- 引入CXF Bean定义如下,早期的版本中使用 -->
	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
	
	<!-- 配置数据源 -->
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
		<property name="url" value="jdbc:mysql:///crm_heima32"/>
		<property name="username" value="root"/>
		<property name="password" value="123"/>
	</bean>
	
	<!-- 事务管理器 -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
	<!-- 支持事务注解 -->
	<tx:annotation-driven transaction-manager="txManager"/>
	
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
	<bean id="customerService" class="com.itheima.service.CustomerServiceImpl">
		<property name="jdbcTemplate" ref="jdbcTemplate"/>
	</bean>
	
	<!-- 注册服务 -->
	<jaxws:server id="myService" address="/customer">
		<jaxws:serviceBean>
			<ref bean="customerService"/>
		</jaxws:serviceBean>
	</jaxws:server>
	
</beans>

<jaxws:server id="myService "  address="/customer">中的address的值为http://localhost:8080/crm_itheima32/service

/address?wsdl    其中crm_itheima32为项目名  service为web.xml中的servlet-mapping的url-pattern里面的值


客户端开发

l  方式一:使用jdk提供的wsimport命令生成本地代码完成调用

l  方式二:使用CXF提供的方式(重点)

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

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

            先访问服务是否加载成功 如  这表明它告诉你有一个服务为 CustomerService

            

             点击 {http://service.itheima.com/}CustomerServiceImplService

    

        在控制台上 输入

              wsimport -s. -p com.itheima.service http://localhost:8080/crm_itheima32/service/customer?wsdl

              

                运行结果   

               

第三步:将生产的java文件复制到客户端项目

                

           创建一个测试类App.java           

public class App {
     public static void main(String[] args) {
		CustomerServiceImplService customerserviceimpl=new CustomerServiceImplService();
		CustomerService service = customerserviceimpl.getCustomerServiceImplPort();
		List<Customer> customers = service.findAll();
		for (Customer customer : customers) {
			System.out.println(customer.toString());
		}
	}
}

             结果是

                张三    百度    北京市西城区长安街100号    13811111111    null
                李四    哇哈哈    上海市虹桥区南京路250号    13822222222    null
                王五    搜狗    天津市河北区中山路30号    13533333333    null
                赵六    联想    石家庄市桥西区和平路10号    18633333333    null
                小白    测试空间    内蒙古自治区呼和浩特市和平路100号    18511111111    null
                小黑    联想    天津市南开区红旗路20号    13722222222    null
                小花    百度    北京市东城区王府井大街20号    13733333333    null
                小李    长城    北京市昌平区建材城西路100号    13788888888    null

           


猜你喜欢

转载自blog.csdn.net/Wang_kang1/article/details/80559360