CXF 简易搭建说明与实例下载

一朋友最近他们公司要求必须马上做个基于cxf的webservice出来,并要求讲解。。。他刚接触webservice,各种找视频找代码不给力,关键是时间紧。。。。。。

纯属被他逼出来做这个简易搭建说明

------割-------

说下框架,就搭建来说cxf 比起axis、xfire有优势。采用spring来管理,这还用说。。。。。。


先提供我做的简单实例(包括服务器端和客户端)下载,不需要了解搭建知识的就直接拖去用,不用浪费时间了,里面有大量的注释来解释说明。click me 


蛋疼的,请继续。。。。。。

额,采用maven来搭建,maven知识不足的同学,请去补下maven的搭建知识先。。。。。。


蛋更疼的,请继续。。。。。。

首先新建一个maven工程。




提供的实例里不是叫webservice,是叫ws,一个意思了。。。

介个时候,工程就建好了,如下图,ws2工程


选中工程名字,然后alt+回车键调出工程属性界面:


首先修改jdk,为1.6以上


再去project facets界面去修改


点cxf时是不是需要把dynamic web module改为2.5呀,是不是改不了2.5呀,表担心,找到工程目录下的.settings/org.eclipse.wst.common.project.facet.core.xml 这个文件里把2.3改为2.5,顺便把jdk也改为1.6,刷新下工程。


其实开了个玩笑,没有专门的cxf,所以这里不需要勾选cxf,哈哈。。。。

自己动手吧。。。。。。

先打开pom.xml加上spring和cxf的相关包配置


好了。。。。。

web.xml 吧:

直接copy过去粘贴好了:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">
	<display-name>Archetype Created Web Application</display-name>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	<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>
	</servlet>
	<servlet-mapping>
		<servlet-name>CXFService</servlet-name>
		<url-pattern>/webservices/*</url-pattern>
	</servlet-mapping>
</web-app>

此处需要注意的是,CXFService下面的/webservices/*,这个后面会提到。

再在src/main/resources下面新建个 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:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
	"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

	<!-- context -->
	<import resource="spring.xml" />
	<import resource="spring-webservice.xml" />
</beans>


恩,没错,这里需要引入两个xml,目的是为了将cxf和正常web工程的service分开

spring.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:aop="http://www.springframework.org/schema/aop" xmlns:c="http://www.springframework.org/schema/c" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
	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/cache http://www.springframework.org/schema/cache/spring-cache.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/jee http://www.springframework.org/schema/jee/spring-jee.xsd
		http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

	<!-- 自动扫描dao和service包(自动注入) -->
	<context:component-scan base-package="com.test" />

</beans><strong>
</strong>
spring-webservice.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"
	xsi:schemaLocation="
 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

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

	<!-- 
		implementor的地址就是webservice接口实现类里的@Component里的value值
		address的值是随意的,决定生成wsdl的名字就是testWService.wsdl
	 -->
	<jaxws:endpoint implementor="#testWServcieImpl"
		address="/testWService" />
		
	
</beans>

好吧,这里有一些解释,需要结合后面的java接口和实现类来说明。。。。。

先看下结构:


1是普通的service接口,跟我们原来工程里大部分service接口一致。

2是专门的webservice接口,他们本身其实就是普通接口的一种扩展,加了一些webservice的annotation而已。

普通service接口略去。

看下webservice接口

package com.test.ws;

import javax.jws.WebParam;
import javax.jws.WebService;

/**
 * webservice 测试接口
 * 
 * @Author Ellrien
 * @Date 2014年6月13日 上午9:58:28
 * @Version 1.0
 */
@WebService
public interface TestWServiceI {

	/**
	 * 加法运算
	 * @param param1
	 * @param param2
	 * @return String
	 */
	public String getSum(@WebParam(name = "param1") int x,
			@WebParam(name = "param2") int y);
}
可以看出其实就是加了@webservice 以及每个方法里的参数都标上了@webparam

再看接口的实现类

package com.test.ws.impl;

import javax.jws.WebMethod;
import javax.jws.WebService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.test.service.TestServiceI;
import com.test.ws.TestWServiceI;

/**
 * webservice 实现类
 * 
 * @Author Ellrien
 * @Date 2014年6月13日 上午10:01:58
 * @Version 1.0
 */

/*
 * targetNamespace 的值可以随便写,将会在接口列表中看到。
 * serviceName 的值也可以随便写,将会在接口列表中看到。
 * portName的值也可以乱写,将会在生成客户端时用到。
 * 
 * 以上三个参数可写可不写。
 * 
 * @Component 的value值,需要跟cxf配置文件里的implementor保持一致
 */
@WebService(targetNamespace = "http://com.test.lalala/", serviceName = "testService", portName = "testServicePort")
@Component(value = "testWServcieImpl")
public class TestWServcieImpl implements TestWServiceI {

	@Autowired
	TestServiceI service;

	@WebMethod
	public String getSum(int x, int y) {
		int sum = service.getSum(x, y);
		return String.valueOf(sum);
	}

}
其实还是一些annotation,而且注释已经写得很明了,包括每个参数该怎么写。如果有疑问请在下面留言。。。。

至此,这个工程就可以发布了。。。。。看下发布后的结果:

输入http://localhost/ws/webservices

看到下图:


这表示webservice发布成功!

具体解释下1234

1、这个地址是查看当前工程ws下所有webservice列表,至于这个框1中的webservices,就是web.xml里配置的/webservices/*

2、这个是TestWServiceI这个webservice的wsdl地址,这个名字是红框2中的testWService,就是spring-webservice.xml中配置的address

3、WSDL地址的另一种写法,由框3和框4组成。框3是Target namespace,对应的就是webservice接口实现类TestWServcieImpl里的targetNamespace。框4是serviceName,对应的是webservice接口实现类TestWServcieImpl里的serviceName。

----------割-----------------------

下面介绍客户端的。



我客户端也写在这个工程里面了。就当做另一种单元测试好了。

按理应该在另一个工程里,按照service+impl的方式来做比较合适。

package com.test.client;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

import com.test.ws.TestWServiceI;


/**
 * 这个环节是独立的,完全是客户端,你可以按照下面的serviceI 和 serviceImpl 对应关系来写
 * 
 * 此客户端是基于cxf来做的。需要jdk1.6以上
 * 
 * @Author Ellrien
 * @Date 2014年6月13日 下午2:20:13
 * @Version 1.0
 */
public class ClientServiceBean {

	private static URL wsdl_url = null;
	private static Service service = null;

	private static void init() throws MalformedURLException {
		// WSDL地址
		wsdl_url = new URL("http://localhost/ws/webservices/testWService?wsdl");

		// new QName(实现类里的targetNamespace,实现类里的serviceName)
		QName serviceName = new QName("http://com.test.lalala/", "testService");
		service = Service.create(wsdl_url, serviceName);
	}

	private static void test() {
		int i = 1;
		int j = 2;
		TestWServiceI clientService = service
				.getPort(TestWServiceI.class);// 通关service来还原成相同的service接口
		String result = clientService.getSum(i, j);
		System.out.println("调用webservice的结果为:" + result);

	}

	public static void main(String[] args) {
		try {
			init();
			test();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

}

其实已经注释得很清楚,如果你上面的服务器端都看懂了,这个客户端就是傻瓜式的。

----------------割----------------------

福利如下:介绍一种最简单的客户端生成方式,采用的是axis自动生成webservice客户端,无论你用axis、cxf、xfire哪种生成的wsdl都能自动生成java代码,谁用谁知道。。。。妈妈再也不用担心我写不出webservice客户端了。。。。得意

click me too












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值