文档章节

CXF创建webservice客户端和服务端

kt431128
 kt431128
发布于 2014/10/03 20:34
字数 1081
阅读 246
收藏 13
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。
作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui0317/article/details/9320053

一、CXF的介绍

Apache CXF是一个开源的WebService框架,CXF大大简化了Webservice的创建,同时它继承了XFire的传统,一样可以和spring天然的进行无缝的集成。CXF框架是一种基于servlet技术的SOA应用开发框架,要正常运用基于CXF应用框架开发的企业应用,除了CXF应用本身之外,还需要JDK和servlet容器的支持。

二、CXF的准备条件

所需要的jar包:

  xmlbeans-2.4.0.jar

  wss4j-1.5.9.jar

  jetty-server-7.1.6.v20100715.jar

  jetty-util-7.1.6.v20100715.jar

  geronimo-ws-metadata_2.0_spec-1.1.3.jar

  geronimo-activation_1.1_spec-1.1.jar

  geronimo-servlet_3.0_spec-1.0.jar

  velocity-1.6.4.jar

  jaxb-xjc-2.2.1.1.jar

  xml-resolver-1.2.jar

  wsdl4j-1.6.2.jar

  cxf-2.3.0.jar

  XmlSchema-1.4.7.jar

  jaxb-api-2.2.1.jar

  jaxb-impl-2.2.1.1.jar

  neethi-2.0.4.jar

  geronimo-annotation_1.0_spec-1.1.1.jar

  geronimo-stax-api_1.0_spec-1.0.1.jar

下载地址:http://download.csdn.net/detail/ch656409110/5748183   (取自己需要的jar包)

三、创建webservice服务端

1、先将jar包放入lib目录

2、在web.xml中配置CXF框架的核心servlet

<!-- CXF -->
	<servlet>  
	    <servlet-name>CXFServlet</servlet-name>  
	    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
	    <load-on-startup>1</load-on-startup>  
	</servlet>  
	<servlet-mapping>  
	    <servlet-name>CXFServlet</servlet-name>  
	    <url-pattern>/services/*</url-pattern>  
	</servlet-mapping>

3、在applicationContext.xml中导入xml,并且发布webservice服务。

<?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:p="http://www.springframework.org/schema/p"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:jaxws="http://cxf.apache.org/jaxws"  
    xmlns:jaxrs="http://cxf.apache.org/jaxrs"  
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
						http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
						http://www.springframework.org/schema/tx
						http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
						http://www.springframework.org/schema/aop
						http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
						http://cxf.apache.org/jaxws  
					    http://cxf.apache.org/schemas/jaxws.xsd  
					    http://cxf.apache.org/jaxrs  
					    http://cxf.apache.org/schemas/jaxrs.xsd
					    "
						default-autowire="byName"
						>
    <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" />
	
    <!-- <jaxws:endpoint id="facelookWebService" address="/facelookWebService" implementor="com.facelook.webservice.server.FacelookWebServiceImpl"></jaxws:endpoint> -->
    <!-- 不知道为什么,这里的webservice配置,只能用bean来实现,否则 注入的service为空。但是之前有个项目却可以,百思不得其解。。 -->
    <bean id="facelookWebService" class="com.facelook.webservice.server.FacelookWebServiceImpl"/> 
    <jaxws:endpoint id="facelookWebService1" address="/facelookWebService" implementorClass="com.facelook.webservice.server.FacelookWebServiceImpl">
    	<jaxws:implementor ref="facelookWebService"/>  
    </jaxws:endpoint>
</beans>

4、定义webservice接口FacelookWebService 和 实现类FacelookWebServiceImpl。

@WebService
public interface FacelookWebService {
	
	/**
	 * 根据传递的条件获取相册信息
	 * xml的格式规范
	 * <?xml version=\"1.0\" encoding=\"UTF-8\"?>
	 * <facelook>
	 * 	<condition>
	 * 		<name></name>
	 * 		<description></description>
	 * 		<pageno></pageno>
	 * 		<pagesize></pagesize>
	 * 	</condition>
	 * </facelook>
	 * 这里的WebParam必须指定,否则调用的时候返回null
	 * @return
	 */
	public String getAlbumList(@WebParam(name="xmlStr") String xmlStr);
}


@WebService
//这后面的可以不写注释后面的配置,在applicationContext配置也一样(serviceName="facelookWebService",endpointInterface="com.facelook.webservice.server.FacelookWebService")
public class FacelookWebServiceImpl implements FacelookWebService{

    @Autowired
    private AlbumService albumService;
    
    @Override
    public String getAlbumList(String xmlStr) {
        try {
            List<Album> albumList = getAlbumPage(xmlStr);
            JSONArray jsonArray = JSONArray.fromObject(albumList);
            return jsonArray.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
这样子,基本上就可以了。

5、保存代码,发布项目,启动tomact。

在地址栏输入:http://localhost:8080/house/services/houseWebService?wsdl  即可看到发布的服务端的明细。

显示如下:


这就表示CXF发布的webservice服务端成功了。

6、通过客户端调用服务端webservice。

axis的客户端访问:

public static void main(String[] args) throws ServiceException, RemoteException, MalformedURLException {
		String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
				 + " 	 <facelook>"
				 + "	 	<condition>"
				 + " 	 		<name>家</name>"
				 + "			<description></description>"
				 + "			<pageno></pageno>"
				 + "			<pagesize></pagesize>"
				 + "  		</condition>"
				 + "	 </facelook>";
		
		  Service service = new Service();
		  Call call = (Call) service.createCall();
		  call.setTargetEndpointAddress("http://localhost:8080/facelook/services/facelookWebService?wsdl");
		  QName qName = new QName("http://server.webservice.facelook.com/", "getAlbumList");
		  call.setOperationName(qName);
		  call.setUseSOAPAction(true);
		  //这下面两行一定要加上,否则接收在服务器端收不到。
		  call.addParameter("xmlStr", XMLType.XSD_STRING, ParameterMode.IN);
		  call.setReturnType(XMLType.XSD_STRING);
		  String result = (String) call.invoke(new Object[] { xmlStr });
		  System.out.println(result);
		
		//将返回的字符串转换成list集合
		//JSONArray array = JSONArray.fromObject(result);
		//List<Album> list = JSONArray.toList(array,Album.class);
		
	}

CXF客户端访问:

public static void main(String[] args) throws Exception {
		//这个是用cxf 客户端访问cxf部署的webservice服务
		//千万记住,访问cxf的webservice必须加上namespace ,否则通不过
		//现在又另外一个问题,传递过去的参数服务端接收不到
		JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
		org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:8080/facelook/services/facelookWebService?wsdl");
		//url为调用webService的wsdl地址
		QName name=new QName("http://server.webservice.facelook.com/","getAlbumList");
		//namespace是命名空间,methodName是方法名
		String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
				 + " 	 <facelook>"
				 + "	 	<condition>"
				 + " 	 		<name>家</name>"
				 + "			<description></description>"
				 + "			<pageno></pageno>"
				 + "			<pagesize></pagesize>"
				 + "  		</condition>"
				 + "	 </facelook>";
		//paramvalue为参数值
		Object[] objects=client.invoke(name,xmlStr); 
		//调用web Service//输出调用结果
		System.out.println(objects[0].toString());
}

在这里面传递的xml规范由 服务端自己规范好了,然后去解析、获取参数,执行相应的操作,返回想要的结果给调用的客户端。。



本文转载自:http://blog.csdn.net/chenghui0317/article/details/9320053

kt431128
粉丝 14
博文 149
码字总数 68823
作品 0
海淀
程序员
私信 提问
CXF、Axis2 怎么实现相互调用???

关于webservice的软件有很多,这里只讨论cxf、Axis2这两种。(鄙人有个疑惑,求证实:由于cxf对spring框架支持的很好,而且操作起来也最简单,所以搞java的同学都选择cxf;但是,用.Net的同学...

追风少年8090
2013/01/09
10K
5
Apache CXF 和 Spring 开发 Web Service 1

正文 为什么使用CXF 本文段摘录自 http://www.ibm.com/developerworks/cn/webservices/ws-pojo-springcxf/index.html Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务...

洋葱94
2015/12/04
272
0
bboss发布apache cxf 2.7.6服务和定义客户端服务实例可能产生冲突解决办法

bboss发布apache cxf 2.7.6服务和定义客户端服务实例放到一起可能会产生冲突并导致服务发布失败,本文介绍这个冲突的解决办法。 首先介绍一下冲突现象,假设在bboss mvc的xml配置文件中定义一...

bboss
2014/03/22
0
0
在java web项目中集成webservice

公司要求在项目中加入webservice服务,因为项目中使用了spring框架,所以在这里使用与spring兼容性较好的cxf来实现 cxf所需jar包 ![在此输入图片描述][1] spring的jar包就不贴了 一:创建web...

那位先生
2014/07/20
6.3K
9
新手初识webservice-实践篇

理论背景:《新手初识webservice-理论篇》http://my.oschina.net/achi/blog/52766 编程语言:Java 必要技能:JavaWeb,MVC,Spring IOC 情景假设:你刚用Java做了个网上店铺,用了servlet,MVC...

路飞
2012/04/12
9K
5

没有更多内容

加载失败,请刷新页面

加载更多

设计模式之访问者模式

定义 Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which......

陈年之后是青葱
昨天
11
0
PhotoShop 高级应用 : 分层云彩 - 简单闪电效果

1.创建黑白渐水平渐变图层 2.选择滤镜选项卡: 渲染--->分层云彩功能 3.将滤镜-云彩效果渲染后的图层进行反相操作 【此时出现闪电效果】 6.调整色阶,使得闪电效果更明显 7.创建剪贴蒙版:色...

东方墨天
昨天
13
0
三种实现Android主界面Tab的方式

三种实现Android主界面Tab的方式 https://www.cnblogs.com/caobotao/p/5103673.html

shzwork
昨天
13
0
java8-Optional类

背景 NPE问题,100%的Java程序员都碰到,并且曾经是心中的痛。 1965年英国TonyHoare引入了Null引用,后续的设计语言包括Java都保持了这种设计。 一个例子 业务模型 Person 有车一族, 有Car...

春天springcarter
昨天
13
0
py 登录github时token以及cookie的应用

import requestsfrom bs4 import BeautifulSoup## 获取tokenr1 = requests.get('https://github.com/login')s1 = BeautifulSoup(r1.text,'html.parser')token = s1.find(name='input',......

子枫Eric
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部