webservice学习1.CXF入门

版本:CXF 2.7.0

jdk版本:1.6.0_38

IDE:Eclipse Java EE IDE Juno

因为是新手 所以这个主要是一个记录的日志 原理我还不太懂了... ...%>_<%

初期准备:

变量配置:

classpath     cxf的lib文件夹

CXF_HOME 指向CXF根目录的路径

PATH           放入CXF的bin路径

java_home 环境变量(一定要是jre的 不是jdk的)

安装:

eclipse-->window-->preference-->web service-->CXF 2.x Preferences-->add 将CXF的根目录输入



 

服务器配置:

因为是第一个 就按照教程做一个最简单的 折扣服务

远端传入编号和原价 返回折扣价

步骤:

新建一个项目server

建立一个包 

新建一个接口类作为服务的接口

新建一个类实现这个接口

代码如下:

接口类:

package org.cc.ws;

import javax.jws.WebService;

@WebService
public interface DiscountService {
	// 折扣
	public double discountPrice(int num,double original);
	
}

 实现类:

package org.cc.ws;

public class DiscountServiceImpl implements DiscountService {

	// 三级的折扣
	private final int[] nums={
			1,2,3
	};
	@Override
	public double discountPrice(int num, double original) {
		double price=original;
		for(int numId:nums){
			if(num==numId){
				price*=(10-num)/10.0;
				break;
			}
		}
		return price;
	}

}

 启动类:

package org.cc.ws;

import javax.xml.ws.Endpoint;

public class Server {
  public static void main(String[] args) {
	  // 简单的发布
	  // 参数一是发布的地址,参数二是服务接口实现类的对象
	  Endpoint.publish("http://localhost/discount", new DiscountServiceImpl());
  }
}

 运行 服务开启了~内置了一个嵌入式的Jetty 运行就是一个服务器了

运行内容:

写道
2013-5-8 23:54:49 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
信息: Creating Service {http://ws.cc.org/}DiscountServiceImplService from class org.cc.ws.DiscountService
2013-5-8 23:54:50 org.apache.cxf.endpoint.ServerImpl initDestination
信息: Setting the server's publish address to be http://localhost:80/discount
2013-5-8 23:54:50 org.eclipse.jetty.server.Server doStart
信息: jetty-8.1.7.v20120910
2013-5-8 23:54:50 org.eclipse.jetty.server.AbstractConnector doStart
信息: Started SelectChannelConnector@localhost:80
2013-5-8 23:54:50 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL
信息: Creating Service {http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01}Discovery from WSDL: classpath:/org/apache/cxf/ws/discovery/wsdl/wsdd-discovery-1.1-wsdl-os.wsdl
2013-5-8 23:54:50 org.apache.cxf.endpoint.ServerImpl initDestination
信息: Setting the server's publish address to be soap.udp://239.255.255.250:3702
2013-5-8 23:54:50 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
信息: Creating Service {http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01}DiscoveryProxy from class org.apache.cxf.jaxws.support.DummyImpl

浏览器输入 http://localhost/discount?wsdl 显示了xml文件并且服务器的console没有报错就正常啦~~~\(≧▽≦)/~

客户端:

使用生成的命令:

wsdl2java -p org.cc.ws.client -d h:\webservice http://localhost/discount?wsdl

将生成好的类放入对应的包里

只需要写一个启动的类即可:

package org.cc.ws.client;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;


public class Client {

	public static void main(String[] args) {
	 JaxWsProxyFactoryBean factoryBean=new JaxWsProxyFactoryBean();
	 factoryBean.setAddress("http://localhost/discount");
	 factoryBean.setServiceClass(DiscountService.class);
	 DiscountService service=(DiscountService)factoryBean.create();
     System.out.println(service.discountPrice(1, 100));
	}

}

运行一下:

写道
2013-5-8 23:54:55 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
信息: Creating Service {http://ws.cc.org/}DiscountServiceService from class org.cc.ws.client.DiscountService
90.0

服务器端增加拦截器:

不能使用封装好的发布形式 要自己使用JaxWsServerFactoryBean进行操作:

如下:加入了请求进入和结果送出的拦截器:

package org.cc.ws;

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

public class Server {
  public static void main(String[] args) {
	  // 简单的发布
	  // 参数一是发布的地址,参数二是服务接口实现类的对象
	  //Endpoint.publish("http://localhost/discount", new DiscountServiceImpl());
	  JaxWsServerFactoryBean factory=new JaxWsServerFactoryBean();
	  
	  factory.setAddress("http://localhost/discount");
	  // 一定要写实现类 不然可以看到启动是可以的 但是客户端一连接会有:Could not instantiate service class org.cc.ws.DiscountService because it is an interface.
	  // 如果写错了发生错误改正还是有错误 那么需要重启下eclipse解决
	  factory.setServiceClass(DiscountServiceImpl.class);
	  factory.getInInterceptors().add(new LoggingInInterceptor());
	  factory.getOutInterceptors().add(new LoggingOutInterceptor());
	  factory.create();
  }
}

项目结构(额..命名不太规范 但懒得改了..额):



 好了 这是第一个运行的项目..接下去的学习会继续

猜你喜欢

转载自fair-jm.iteye.com/blog/1864788