WebService引擎-CXF-01

1.什么是CXF

ApacheCXF = Celtix+ Xfire
支持多种协议:
SOAP1.1,1,2
XML/HTTP
CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构,早期语言使用的WS。C,c++,C#)
并可以与Spring进行快速无缝的整合
灵活的部署:可以运行在Tomcat,Jboss,Jetty(内置),IBMWS,BeaWL上面。
2.配置环境变量
Ant
Tomcat
并设置以下环境变量:
JAVA_HOME 
CXF_HOME
ANT_HOME
CATALINA_HOME(tomcat环境变量)
Path= %JAVA_HOME%\bin;%CXF_HOME%\bin;%CATALINA_HOME%\bin;%ANT_HOME%\bin
CLASSPATH=.;%CXF_HOME%\lib\cxf-manifest.jar ;.\build\classes

3.使用ant打包发版

在这之前,请确认上述环境变量配置完成

用ANT将它发布到Tomcat服务器上:

l1、执行ant clean清除以前生成的代码
l2、执行ant war打包此应用。
l3、执行ant deploy –Dtomcat=true将项目发布到tomcat的服务器上。
l4、启动tomcat服务器
l5、打开IE的地址栏输入:

http://localhost:9999/helloworld/services/hello_world?wsdl

或:http://localhost:9999/helloworld/services

l6、在命令行执行:
•antclient-servlet –Dbase.url=http://localhost:9999
•或在MyEclipse的WebServiceExplorer中访问这个WebService
l7、停止tomcat服务器。
l8、卸载应用:ant undeploy –Dtomcat=true
l9、清空项目:ant clean

4.利用CXF引擎开发简单的java se 应用

在项目中导入CXF中的所有jar文件

可以用两个不同的类发布应用:
①ServerFactoryBean  -- FacotryBean
package cn.itcast.cxf;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.cxf.frontend.ServerFactoryBean;

/**
 * 使用ServerFactoryBean 发版WebService服务
 * @author wangz_ing
 *
 */
public class HelloService {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		
		ServerFactoryBean bean = new ServerFactoryBean();
		//服务的发布地址
		bean.setAddress("http://127.0.0.1:6789/hello");
		//提供服务的类型
		bean.setServiceClass(HelloService.class);
		//提供服务的实例
		bean.setServiceBean(new HelloService());
		//发布服务
		bean.create();
		System.out.println("Server ready..");
	}
	
	public String sayHello(String name){
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		
		System.out.println("sayHello...."+name);
		
		return sdf.format(new Date())+ " hello " +name;
	}

}


②JaxWsServerFactoryBean ( 建议使用此类 )
package cn.itcast.cxf;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.jws.WebService;

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

/**
 * 使用JaxWsServerFactoryBean发布服务
 * @author wangz_ing
 * 必须加入WebService注解,如果不加,虽然不报错,但所有的方法都暴露不出来
 */
@WebService
public class HiService {


	public static void main(String[] args) {

		JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
	
		//服务的发布地址
		bean.setAddress("http://127.0.0.1:7789/hi");
		//提供服务的类型
		bean.setServiceClass(HiService.class);
		//提供服务的实例
		bean.setServiceBean(new HiService());
		//发布服务
		bean.create();
		System.out.println("Server ready..");
	}
	
public String sayHi(String name){
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		
		System.out.println("sayHi...."+name);
		
		return sdf.format(new Date())+ " hi: " +name;
	}

}

上述服务端服务发布成功之后,下面怎么在服务端调用服务端的方法呢?

CXF中提供了对应的客户端调用方法,ServerFactoryBean--->ClientProxyFactoryBean;JaxWsServerFactoryBean-->JaxWsProxyFactoryBean;


l使用ServerFactoryBean发布服务以后,在没有接口的情况下,可以使用wsimport生成的客户端代码调用成功。
l但如果要使用ClientProxyFactoryBean客户端去调用服务器,则必须要先在服务器端创建一个接口。
(一直以来,Spring都要求面向接口编程,而cxfSpring能很好的整合,也就在此。),所以,必须要重写服务器端的代码。这将导致刚才使用wsimport生成的调用代码失效。


l同时,ClientProxyFactoryBean由于要用到CXF环境,所以要导入CXF的所有包,所以此方法不建议用
l同时,如果是在本项目中调用,则可以直接使用本项目的接口。
如果在其他项目中调用,仍然需wsimport生成的类,但只需要一个接口


下面我们可以运用标准的编码规范进行服务端代码的编写,包括对应的接口,实现类,而不是所以的方法都写在一个类里

如果不是使用spring配置文件发布,可以没有接口文件,但在任何情况下建议拥有接口文件。如果使用spring的配置文件发布,则必须拥有接口类

接口:

package cn.itcast.cxf;

import javax.jws.WebService;

@WebService
public interface IHelloService {

	public String sayHello(String name);
}
实现类:

package cn.itcast.cxf;

import java.text.SimpleDateFormat;
import java.util.Date;

public class HelloServiceImpl implements IHelloService{

	@Override
	public String sayHello(String name) {
		
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		
		System.out.println("sayHello...."+name);
		
		return sdf.format(new Date())+ " hello: " +name;
	}



}

服务端发布方法:

package cn.itcast.cxf;


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


/**
 * 使用JaxWsServerFactoryBean发布服务
 * @author wangz_ing
 * 必须加入WebService注解,如果不加,虽然不报错,但所有的方法都暴露不出来
 */
public class Server {


/**
* @param args
*/
public static void main(String[] args) {


JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
//服务的发布地址
bean.setAddress("http://127.0.0.1:7788/hi");
//提供服务的类型或接口类型,建议使用接口
bean.setServiceClass(IHelloService.class);
//提供服务的实例
bean.setServiceBean(new HelloServiceImpl());
//加入请求的消息拦截器
bean.getInInterceptors().add(new LoggingInInterceptor());
bean.getInInterceptors().add(new LoggingOutInterceptor());
//发布服务
bean.create();
System.out.println("Hello service ready..");

}


}
值得注意的是,此方法中加入了消息拦截器,

给服务器添加拦截器,类似于使用TCP/IP Monitor来捕获SOAP消息的过程

l LoggingInInterceptor 信息输入时的拦截器 请求
l LoggingOutInterceptor 信息输出时的拦截器 - 响应

加入拦截器后,可以在控制台看到对应的请求内容,控制台输出内容为:

2015-8-19 17:00:19 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 1
Address: http://127.0.0.1:7788/hi?wsdl
Http-Method: GET
Content-Type: 
Headers: {Accept=[text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2], connection=[keep-alive], Content-Type=[null], Host=[127.0.0.1:7788], User-Agent=[Java/1.6.0_43]}
--------------------------------------
2015-8-19 17:00:20 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 2
Address: http://127.0.0.1:7788/hi
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml;charset="utf-8"
Headers: {Accept=[text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2], connection=[keep-alive], Content-Length=[194], content-type=[text/xml;charset="utf-8"], Host=[127.0.0.1:7788], Soapaction=[""], User-Agent=[JAX-WS RI 2.1.6 in JDK 6]}
Payload: <?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:sayHello xmlns:ns2="http://cxf.itcast.cn/"><arg0>aa</arg0></ns2:sayHello></S:Body></S:Envelope>
--------------------------------------

可以看到使用代码方式调用服务端方法时,一次调用,两次请求,先是get'方法判断是否查询到对应的wsdl文件,若可以,则利用post请求再次发出请求,

利用aja调用时,只有一次post请求


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值