cxf_axis_xfire客户端调用的几种方法
- 格式:docx
- 大小:80.74 KB
- 文档页数:22
目录一使用Axis和XFire发布Web Service (2)1.1 准备工作 (2)1.1.1 新建工程 (2)1.1.2 axis依赖文件 (3)1.1.3 XFire依赖文件 (3)1.2 Axis发布Web Service (4)1.2.1 传递简单数据类型的Web Service (4)1.2.2 带自定义对象传递的Web Service (8)1.3 XFire发布Web Services (10)1.3.1 传递简单数据类型的Web Service (10)1.3.2传递复杂数据类型的Web Service (12)附录: 1Server的结构 (16)二调用Web Services (17)2.1 准备工作 (17)2.1.1 新建工程 (17)2.1.2 启动Tomcat上发布的1Server服务 (17)2.2 Axis发布的Web Service调用方式 (18)2.2.1 Dynamic Invocation Interface (DII)方式 (18)2.2.2 Dynamic Proxy方式 (19)2.2.3 Stubs方式 (20)2.3调用XFire发布的Web Service (22)2.3.1服务以jar包形式发布的时候直接调用 (23)2.3.2 使用Axis的Client包 (23)2.3.3 使用Xfire的Client包 (24)附录2:2Client目录结构 (31)一使用Axis和XFire发布Web Service 1.1 准备工作Axis主页:/Axis下载:/dist/ws/XFire主页:/XFire下载:/Download去以上站点下载axis最新包和XFire最新包,包内有axis和XFire依赖的其他jar包。
1.1.1 新建工程1.1.2 axis依赖文件1.1.3 XFire依赖文件1.2 Axis发布Web Service1.2.1 传递简单数据类型的Web Service1.把Axis依赖的jar包放入lib文件夹下.2.在web.xml中加入如下:<!-- ****************** axis ws start ****************** --> <listener><listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener </listener-class></listener><servlet><servlet-name>AxisServlet</servlet-name><servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class></servlet><servlet><servlet-name>AdminServlet</servlet-name><servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class><load-on-startup>100</load-on-startup></servlet><servlet><servlet-name>SOAPMonitorService</servlet-name><servlet-class>org.apache.axis.monitor.SOAPMonitorService</servlet-class><init-param><param-name>SOAPMonitorPort</param-name><param-value>5001</param-value></init-param><load-on-startup>100</load-on-startup></servlet><servlet-mapping><servlet-name>AxisServlet</servlet-name><url-pattern>/servlet/AxisServlet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>AxisServlet</servlet-name><url-pattern>*.jws</url-pattern></servlet-mapping><servlet-mapping><servlet-name>AxisServlet</servlet-name><url-pattern>/services/*</url-pattern></servlet-mapping><servlet-mapping><servlet-name>SOAPMonitorService</servlet-name><url-pattern>/SOAPMonitor</url-pattern></servlet-mapping><!-- uncomment this if you want the admin servlet --><!--<servlet-mapping><servlet-name>AdminServlet</servlet-name><url-pattern>/servlet/AdminServlet</url-pattern></servlet-mapping>--><session-config><!-- Default to 5 minute session timeouts --><session-timeout>5</session-timeout></session-config><!-- currently the W3C havent settled on a media type for WSDL;/TR/2003/WD-wsdl12-20030303/#ietf-draftfor now we go with the basic 'it's XML' response -->3.发布到Tomcat5.0+ 启动Tomcat服务启动的时候若出现下面错误。
CXF框架的使用流程1. 什么是CXF框架?Apache CXF(前身是Xfire)是一个开源的Web服务框架,用于构建和开发服务导向架构(SOA)应用程序。
CXF提供了一种简单而强大的方式来创建、部署和管理Web服务,支持SOAP、REST、XML和JSON等多种协议。
它基于Java标准,可以与Java EE和Spring框架无缝集成,是一个功能丰富且灵活的框架。
2. CXF框架使用流程使用CXF框架开发Web服务通常有以下几个步骤:步骤一:创建Web服务的接口首先,需要定义Web服务的接口。
在接口中定义服务的方法,参数和返回值类型。
接口可以按照业务需求进行设计,并使用注解来标记服务方法。
步骤二:实现服务接口接下来,需要实现定义的接口。
在实现类中编写具体的服务逻辑代码。
可以根据业务需求调用其他服务或持久化数据。
步骤三:发布Web服务使用CXF框架提供的工具类将服务发布为Web服务。
可以通过Spring配置文件或Java代码的方式来发布服务。
步骤四:客户端调用服务编写客户端代码来调用已发布的Web服务。
可以使用CXF框架提供的工具类生成客户端代码,也可以手动编写客户端调用代码。
步骤五:部署和运行将服务端和客户端的代码部署到相应的容器或服务器上。
可以使用Maven等构建工具打包项目,并将生成的war或jar文件部署到Tomcat或其他容器中运行。
3. CXF框架使用示例下面是一个使用CXF框架开发Web服务的简单示例:步骤一:定义服务接口package com.example.service; import javax.jws.WebMethod;import javax.jws.WebService;@WebServicepublic interface HelloWorldService { @WebMethodString sayHello(String name);}步骤二:实现服务接口```java package com.example.service;import javax.jws.WebService;@WebService(endpointInterface =。
最近一个项目需要调用一个webservice接口,遇到一个问题.项目中的jdom版本为0.9.而webservice client需要用到jdom1.0 如果将jdom版本升级则会造成现有系统异常.因此需要在不改变现有项目jar的情况下解决这个问题.service端使用的jax-ws2.wsdl如下:Java代码<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at . RI's version is JAX-WS RI 2.1.1 in JDK 6. --><!-- Generated by JAX-WS RI at . RI's version is JAX-WS RI 2.1.1 in JDK 6. --><definitionsxmlns:soap="/wsdl/soap/"xmlns:tns="/ZySearch"xmlns:xsd="/2001/XMLSchema"xmlns="/wsdl/"targetNamespace="/ZySearch"name="UserLinkWebServiceService"><types></types><message name="getUserLink"><part name="linkNo" type="xsd:string"></part></message><message name="getUserLinkResponse"><part name="returnVal" type="xsd:string"></part></message><portType name="UserLinkWebService"><operation name="getUserLink" parameterOrder="linkNo"><input message="tns:getUserLink"></input><output message="tns:getUserLinkResponse"></output></operation></portType><binding name="UserLinkWebServicePortBinding"type="tns:UserLinkWebService"><soap:binding transport="/soap/http"style="rpc"></soap:binding><operation name="getUserLink"><soap:operation soapAction="getUserLink"></soap:operation><input><soap:body use="literal"namespace="/ZySearch"></soap:body></input><output><soap:body use="literal"namespace="/ZySearch"></soap:body></output></operation></binding><service name="UserLinkWebServiceService"><port name="UserLinkWebServicePort"binding="tns:UserLinkWebServicePortBinding"><soap:addresslocation="http://192.168.1.1.154:9010/ZySearch"></soap:address></port></service></definitions>1.xfire调用对方给我们的client是使用xfire的client调用,代码如下:Java代码package mon;import .URL;import java.util.Map;import org.codehaus.xfire.client.Client;import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.io.xml.DomDriver;public class Test {public static void main(String[] args) {String url ="http://192.168.1.1:8000/RES_Searcher/service/IUserLinkWebService?wsd l";Client client;try {client = new Client(new URL(url));Object params[] = {"123456"};String result = (String)client.invoke("getUserLink", params)[0];XStream xStream = new XStream(new DomDriver());Map map = (Map)xStream.fromXML(result);} catch (Exception e) {e.printStackTrace();}}}2.axis调用但是由于jar包的原因,我们不能使用上面的方法,想出的第一个解决方案是使用axis的客户端来调用接口,代码如下:Java代码import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;import space.QName;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import com.thoughtworks.xstream.XStream;import com.thoughtworks.xstream.io.xml.DomDriver;public class TestReflection {public static void main(String[] arg) {String url = "http://192.168.1.1:9010/ZySearch";try {Service service = new Service();Call call = (Call) service.createCall();// 设置调用服务地址call.setTargetEndpointAddress(new .URL(url));//此处一定要配置wsdl的namespace参数/ZySearchcall.setOperationName(newQName("/ZySearch", "getUserLink"));//此处需要配置传入参数类型与参数名称,如果未设置jax-ws则无法接受参数,会认为传入的参数为nullcall.addParameter("linkNo",org.apache.axis.encoding.XMLType.XSD_ST RING,javax.xml.rpc.ParameterMode.IN);//如果设置类传入参数类型,此处也需要设置返回参数类型call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);call.setUseSOAPAction(true);call.setSOAPActionURI(url);String result = (String) call.invoke(new Object[] { "AD0006526305" });XStream xStream = new XStream(new DomDriver());Map map = (Map) xStream.fromXML(result);Iterator it = map.entrySet().iterator();while (it.hasNext()) {Map.Entry enty = (Entry) it.next();System.out.println(enty.getKey() + ":" + enty.getValue());}} catch (Exception e) {e.printStackTrace();}}}3.http模拟调用由于开始对axis的了解有限,在写axis调用是总是有问题,于是便想了另外一个方法,这个方法有点剑走偏锋.但是适用性却很强,因为调用的是java自带的api 不会产生兼容性问题.大家知道webservice请求实际上也就是一个http请求,将数据通过xml文件进行交换.既然知道了原理我们就可以模拟一个http请求来调用webservice.Java代码try{String url2 = "http://192.168.1.1:9010/ZySearch?wsdl";URL getUrl = new URL(url2);HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();connection.setDoOutput(true);connection.setDoInput(true);connection.setRequestMethod("POST");connection.setRequestProperty("Content-type","text/xml");connection.setRequestProperty("Accept","text/xml");connection.setRequestProperty("User-Agent","JAX-WS RI2.1.3-hudson-390-");String send="<soap:Envelopexmlns:soap=\"/soap/envelope/\"xmlns:xsd=\"/2001/XMLSchema\"xmlns:xsi=\"/2001/XMLSchema-instance\"><soap:Body><ns1:getUserLinkxmlns:ns1=\"/ZySearch\"><linkNoxmlns=\"\">"+par+"</linkNo></ns1:getUserLink></soap:Body></soap:Envel ope>";connection.getOutputStream().write(send.getBytes());connection.getOutputStream().flush();connection.getOutputStream().close();connection.connect();// 取得输入流,并使用Reader读取BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(),"utf-8"));//设置编码,否则中文乱码System.out.println("=============================");System.out.println("Contents of get request");System.out.println("=============================");String lines="";String reuslts = "";while ((lines = reader.readLine()) != null){//lines = new String(lines.getBhqytes(), "utf-8"); reuslts+=lines.replaceAll("<", "<").replaceAll(">", ">");}reader.close();System.out.println("type:"+connection.getContentType()); // 断开连接connection.disconnect();System.out.println(reuslts);System.out.println("============================="); System.out.println("Contents of get request ends"); System.out.println("=============================");XStream xStream = new XStream(new DomDriver());reuslts =reuslts.substring(reuslts.indexOf("<returnVal>")+11);reuslts =reuslts.substring(0,reuslts.indexOf("</returnVal>"));System.out.println(reuslts);Map result = (Map)xStream.fromXML(reuslts);Iterator it = result.entrySet().iterator();while(it.hasNext()){Map.Entry enty = (Entry) it.next();System.out.println(enty.getKey()+":"+enty.getValue());}}catch(Exception e){e.printStackTrace();}4.jax-ws调用最后再写上一个jax-ws的client代码Java代码import .MalformedURLException;import java.util.Map;import space.QName;import javax.xml.soap.MessageFactory;import javax.xml.soap.SOAPBody;import javax.xml.soap.SOAPBodyElement;import javax.xml.soap.SOAPElement;import javax.xml.soap.SOAPMessage;import javax.xml.ws.BindingProvider;import javax.xml.ws.Dispatch;import javax.xml.ws.Service;import javax.xml.ws.WebServiceException;import javax.xml.ws.soap.SOAPBinding;public class Client {// 名字空间public static final String targetNamespace ="/ZySearch";//服务名public static final String serName = "UserLinkWebServiceService"; //端口名public static final String pName = "UserLinkWebServicePort";//服务地址public static final String endpointAddress ="http://192.168.1.1:9010/ZySearch?wsdl";//方法名public static final String OPER_NAME = "getUserLink";//参数名public static final String INPUT_NMAE = "linkNo";/*** @param args* @throws MalformedURLException* @throws Exception*/public static void main(String[] args) throws MalformedURLException, Exception {// TODO Auto-generated method stubQName serviceName = new QName(targetNamespace, serName);QName portName = new QName(targetNamespace, pName);javax.xml.ws.Service service = Service.create(serviceName); service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);Dispatch<SOAPMessage> dispatch =service.createDispatch(portName,SOAPMessage.class, Service.Mode.MESSAGE);BindingProvider bp = (BindingProvider) dispatch;Map<String, Object> rc = bp.getRequestContext();rc.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE); rc.put(BindingProvider.SOAPACTION_URI_PROPERTY, OPER_NAME);MessageFactory factory =((SOAPBinding)bp.getBinding()).getMessageFactory();SOAPMessage request = factory.createMessage();SOAPBody body = request.getSOAPBody();QName payloadName = new QName(targetNamespace, OPER_NAME, "ns1"); SOAPBodyElement payload = body.addBodyElement(payloadName);SOAPElement message = payload.addChildElement(INPUT_NMAE);message.addTextNode("AD0006526305");SOAPMessage reply = null;try{reply = dispatch.invoke(request);}catch (WebServiceException wse){wse.printStackTrace();}SOAPBody soapBody = reply.getSOAPBody();SOAPBodyElement nextSoapBodyElement =(SOAPBodyElement)soapBody.getChildElements().next ();SOAPElement soapElement =(SOAPElement)nextSoapBodyElement.getChildElements().next();System.out.println("获取回应信息为:" +soapElement.getValue());}}。
WebService 功能测试作者:冰雪摘要:由于WebService的平台无关性,使用越来越多,所以对WebService的测试也越来越受关注,本文整理了WebService的功能测试方法,包括编码方式和工具方式。
关键词:WebService测试1、WebService简述WebService是一种革命性的分布式计算技术,本质上就是服务提供方发布一些服务(实现一定功能的函数接口)到网络上,服务使用方如果使用到该服务的功能,直接在网络上调用服务接口就可以了,无需自己重新开发。
那么,服务使用方(我们称之为客户端)是如何使用服务方发布(我们称之为服务端)的WebService 服务的呢?这里简要介绍:WebService发布后,其服务是封装在一个wsdl(Web Service Description Language,Web服务描述语言)文件中,客户端发请求主要是向发布好的wsdl地址以SOAP方式发请求,调用过程如下:服务端生成服务描述文件,以供客户端获取。
客户端取得服务端的服务描述文件,解析该文件从而获得服务端的服务信息以及调用方式。
客户端指定调用方法和参数,生成恰当的SOAP请求消息,发往服务端,并等待服务端返回的SOAP回应消息。
服务端接收客户端发来的SOAP请求消息,解析其中的方法调用和参数格式。
并根据wsdl的描述,完成指定功能,将返回值放入SOAP回应消息返回给用户。
客户端解析得到的返回值。
使用WebService的优点是一次开发多次使用,且由于WebService的平台无关性特性,使用越来越多,所以对WebService的测试也就显得越来越重要。
2、WebService功能测试方法WebService测试最基本的是功能测试,即验证功能的正确性。
另外由于服务发布后会由多个客户端进行调用使用,所以性能测试也是一个重要测试内容。
本文只涉及了功能测试部分。
功能测试分为编码方式(通过编码测试接口的正确性)和工具方式(通过测试工具测试接口的正确性)。
WebService 四种发布方式总结Author:yczhang1.CXF方式CXF与spring搭建webservice是目前最流行的方式,但是传闻cxf与jdk1.5有些不兼容,我没有遇到过,我遇到的问题是cxf与was6.1.1不兼容,表现在cxf必须的jar包“wsdl4j-1.6.2.jar”报错,报的错为:ng.IncompatibleClassChangeError,明显的jar包不兼容问题,很是头痛,后来查找资料找到解决办法是,将上述jar包新建一个was共享库,可以解决,但是客户周经理不想用此种方式,因为需要修改was,于是改用了axis2方式,下文会介绍。
该问题在此处做个记录,以后使用cxf与was的时候需要注意!!!使用cxf+spring搭建WebService:第一步,添加jar包。
此处需要注意,不同环境(tomcat、was)jar也不一定相同,例如我本地cxf+spring只需要如下jar包:而泰康的was环境则需要如下jar包:明显的多了很多,原因应该是服务器jar包池的不同。
根据错误提示缺什么补什么就可以了,注意jar包勿重复。
第二步,配置web.xml文件,如下(重要的地方已标记):<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><!-- Character Encoding filter --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFil ter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>CXFServlet</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-c lass><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>CXFServlet</servlet-name><url-pattern>/webservice/*</url-pattern></servlet-mapping>上述标记的地方,第一处是spring配置文件路径;第二出是wsdl地址内容;第三步,编写接口类与实现类,注意注解接口类@WebServicepublic interface SendService {public boolean sendOA(@WebParam(name="param")String param);public boolean sendOrg(OrgEntity org);}实现类@WebService(endpointInterface="com.service.SendService",serviceName=" sendService")public class SendServiceImpl implements SendService{public boolean sendOA(String param) {System.out.println("-------sendOA---------param:"+param);if(param.equals("zhoujian")){return true;}return false;}public boolean sendOrg(OrgEntity org) {System.out.println("-------sendOrg--begin-------");return true;}}第四步,Spring配置文件“jaxws:client”该标签可以不必写,访问时可以手动拼接该url 第五步,发布,直接部署到服务器,访问:2.Xfire方式据说xfire方式已经很老了,但个人感觉,xfire方式很简单且容易配置,不知为啥过时了,也没感觉cxf、axis2哪里先进,我当时卡在cxf与was搞不定时想尝试xfire方式被周经理给拒绝了。
信步漫谈之Xfire—基础介绍XFire 是与 Axis 2 并列的新⼀代 Web Service 框架,通过提供简单的 API ⽀持 Web Service 各项标准协议,能够快速地开发 Web Service 应⽤。
和其他 Web 服务引擎相⽐,XFire 的配置⾮常简单,可以⾮常容易地和 Spring 集成。
以下以⼀个实例讲解如何编写⼀个 Xfire 的服务端与客户端:xfire版本:xfire-distribution-1.2.6.zip⽬录结构:关键代码:User.javaIHelloService.javaHelloService.javaClientTest.javaservices.xmlweb.xml导⼊ jar 包:将 xfire-all-1.2.6.jar 以及 lib ⽬录下的 jar 包全部导⼊即可。
services.xml ⽂件默认的存放⽬录是 WEB-INF/META-INF/xfire 下或 WEB-INF/classes/META-INF/xfire 下,如果是后者,那么实际项⽬中META-INF 应放置于 src ⽬录下:这样,部署到服务器中后 META-INF ⽂件夹就会存在于 WEB-INF/classes/ ⽬录下。
如果要⾃⼰指定 services.xml ⽂件路径,可以将services.xml 路径配置在 web.xml ⽂件中,如下:<servlet><servlet-name>XFireServlet</servlet-name><servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class><!--The servlet will by default look for the configuration onthe classpath in "META-INF/xfire/services.xml". You canoverride it with this parameter. Seperate multiple configuration files with a comma.--><!-- 默认会在classpath的META-INF/xfire/下查找services.xml⽂件,可以覆盖这个参数,指定多个配置⽂件--><init-param><param-name>config</param-name><param-value>xfire-services.xml</param-value></init-param></servlet>插⼊⼀段 init-param 配置,param-name 为 config,指定 services.xml ⽂件的路径以及⽂件名。
Java调⽤CXFWebService接⼝的两种⽅式实例1.静态调⽤// 创建WebService客户端代理⼯⼚JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();// 判断是否抛出异常factory.getOutInterceptors().add(new LoggingInInterceptor());// 注册webservice接⼝factory.setServiceClass(DeductionService.class);// 配置webservice地址factory.setAddress("http://localhost:7002/card/services/HelloWorld?wsdl");// 获得接⼝对象CxfService service = (CxfService) factory.create();// 调⽤接⼝⽅法String result = service.sayHello("aaaaaaaaaa");System.out.println("调⽤结果:" + result);// 关闭接⼝连接System.exit(0);2.动态调⽤:JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:7002/card/services/HelloWorld?wsdl");// url为调⽤webService的wsdl地址QName name = new QName("/", "sayHello");// namespace是命名空间,methodName是⽅法名String xmlStr = "aaaaaaaa";// paramvalue为参数值Object[] objects;try {objects = client.invoke(name, xmlStr);System.out.println(objects[0].toString());} catch (Exception e) {e.printStackTrace();}区别:静态调⽤需要依赖service类,因为客户端调⽤cxf webservice接⼝的过程中需要服务器端提供service,很不⽅便,如果同⼀个项⽬中则没有区别。
ajax 调用方法Ajax调用方法详解Ajax(Asynchronous JavaScript and XML)是一种用于创建快速动态网页的技术,它通过在后台与服务器进行少量数据交换,实现了网页无需刷新即可更新部分内容的功能。
在前端开发中,Ajax的应用非常广泛,本文将详细介绍几种常见的Ajax调用方法。
一、XMLHttpRequest对象XMLHttpRequest是Ajax的核心对象,它用于与服务器进行数据交互。
通过创建XMLHttpRequest对象并调用其相关方法,可以实现异步加载数据、发送数据到服务器等操作。
创建XMLHttpRequest对象的方法如下:```javascriptvar xhr;if (window.XMLHttpRequest) {xhr = new XMLHttpRequest(); // 非IE浏览器} else if (window.ActiveXObject) {xhr = new ActiveXObject('Microsoft.XMLHTTP'); // IE浏览器}```使用XMLHttpRequest对象发送GET请求的方法如下:```javascriptxhr.open('GET', 'data.php?param1=value1¶m2=value2', true);xhr.onreadystatechange = function() {if (xhr.readyState === 4 && xhr.status === 200) {var response = xhr.responseText;// 处理服务器返回的数据}};xhr.send();```使用XMLHttpRequest对象发送POST请求的方法如下:```javascriptxhr.open('POST', 'data.php', true);xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');xhr.onreadystatechange = function() {if (xhr.readyState === 4 && xhr.status === 200) {var response = xhr.responseText;// 处理服务器返回的数据};xhr.send('param1=value1¶m2=value2');```二、jQuery的Ajax方法jQuery是一款功能强大的JavaScript库,它封装了许多常用的操作,包括Ajax。
Axis2,CXF,xifire1. Axis2.x (3)1.1. 开发准备工作 (3)1.1.1. 环境 (3)1.1.2. 单独启动AXIS2服务 (4)1.1.3. 将axis2-1.6.2-bin.zip中的项目打成axis2.war包 (4)1.1.4. Axis2脚本 (5)1.1.5. 安装eclipse插件(可选) (7)1.1.6. axis2-bin文件目录结构 (8)1.1.7. 部署axis2.war到tomcat (8)1.1.8. 上传services(Uploading Services) (9)1.2. Axis2开发部署 (9)1.2.1. 编写服务器代码,和配置文件 (10)1.2.2. 发布 (11)1.2.3. 通过class文件生成wsdl文件(java2wsdl) (13)1.2.4. 通过wsdl文件生成Java访问代码(wsdl2java) (13)1.2.5. 调用:Axis2开发WebService客户端的3种方式 (14)1.2.6. PS:配置文件介绍 (21)1.3. 大病系统ESB接口开发 (25)1.3.1. esb接口标准 (26)1.3.2. esb接口开发 (31)1.3.3. esb接口调试测试 (53)1.3.4. esb接口发布 (53)2. CXF (53)2.1. 准备工作 (54)2.2. 开发示例 (54)2.2.1. 编写服务端接口 (55)2.2.2. 编写服务实现 (56)2.2.3. 编写webServiceApp.java类来暴露web服务 (57)2.2.4. 启动服务 (57)2.2.5. 编写客户端访问服务 (57)2.2.6. 测试 (58)2.2.7. 集成到spring (58)2.2.8. 通过wsdl文件生成客户端和服务器端代码 (61)3. xfire (62)3.1. 准备工作 (62)3.2. 开发步骤 (62)3.2.1. 建立目录结构 (62)3.2.2. 添加依赖包 (63)3.2.3. 编写服务端代码 (63)3.2.4. 配置web.xml (66)3.2.5. 创建xfire配置文件 (67)3.2.6. services.xml的作用 (68)3.2.7. 在服务器上运行服务 (69)4. Axis与XFire的比较 (72)4.1. XFire与Axis1性能的比较 (72)4.2. XFire与Axis2的比较 (72)5. cxf与axis2比较 (73)6. WSDL文件 (74)6.1. 抽象定义 (74)6.2. 具体定义 (74)7. JAXB (76)7.1. Java SE中的JAXB (76)7.2. 使用 (77)7.3. 缺省的数据类型绑定 (77)7.4. 代码示例 (78)1.Axis2.xWeb Service是现在最适合实现SOAP的技术,而Axis2是实现Web Service的一种技术框架(架构)。
CXF使⽤教程(⼆)——webService⾃动⽣成客户端代码webService⾃动⽣成客户端代码有四种⽅法:⼀:使⽤Axis⽣产客户端代码(另存为bat⽂件)需要注意的是:⽬录包含空格,⽐如Axis_Lib,Output_Pathset Axis_Lib=F:\axis1.4\axis\WEB-INF\libset Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%set Output_Path=D:\Workspacesset Package=com.axis.sub%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% http://192.168.11.62:8090/rainLogin?wsdl pause⼆:使⽤JDK1.6的wsimport.exe(在jdk的bin⽬录下)产⽣客户端代码(之前要将JDK的bin添加到环境变量Path中)wsimport -keep -p com.jdk6.sub -s JavaSrc http://192.168.11.62:8090/rainLogin?wsdl1. -s(src):在当前路径下的JavaSrc(要⼿动创建)⽂件夹中⽣成客户端代码2. -p(package):定义客户端代码的包名3. -keep 保留.class⽂件三:使⽤CXF wsdl2java.bat (要先将CXF的bin⽬录添加到环境变量Path下)在cmd本项⽬SCR⽬录下运⾏下⾯代码,就会在src下⽣成客户端代码wsdl2java http://192.168.11.62:8080/FFWebservice/services/PortalServices?wsdl四:使⽤Myeclipse⾃带⼯具⽣成客户端代码finnish 就可以⽣成客户端代码了。
个⼈⼀般⽐较喜欢⽤第⼆种⽅法。
XFire 1.2.6调用Web Service的几种方法最近由于项目的需求,我开始学习XFire 1.2.6。
XFire的服务发布很简单,但由于xfire为用户提供了多种调用(invoke) web service的方法,所以在编写客户端代码的时侯,需要我们做一番斟酌。
在不同的应用环境下,我们可能需要采用不同的服务调用的方法。
本文将详细介绍这几种调用web服务的方法。
方法一:动态客户端(Dynamic Client)这是一种最简单的web服务调用方法。
具体过程如下:1.创建一个服务代理,其中url为调用服务的wsdl地址。
Client client = new Client(new URL(url));2.调用web服务,输入参数(简单类型)。
Object[] results = client.invoke(methodName, new Object[]{param1,param2});3.打印web 服务运行结果System.out.println((ReturnValueType)results[0]);全过程只需要三个过程,非常简单。
但是,上述过程仅限于简单的方法调用,对于那些以复杂数据结构为参数的方法,以及复杂结构的返回值的方法,需要采用另外的处理方法,否则将无法正常运行。
关于复杂参数的传递以及调用复杂返回值方法的过程还有待进一步研究,如果哪个读者熟悉这一块,可以与我联系,本人将非常感谢。
方法二:代理工厂方法(Proxy Factory)一般的方法如如下:1.创建一个服务实例,就像在自己的服务器上创建一样。
要注意的是,这里的“”Service serviceModel = new ObjectServiceFactory().create(YourService.class);要注意的是,这里的“YourService”是接口类,而不是接口的实现类。
2.定义服务URLString serviceURL = “http://localhost:8080/XFireTest/services/YourService”;3.为服务创建一个代理YourService client = (YourService) new XFireProxyFactory().create(serviceModel,serviceURL);4.使用代理访问服务提供的方法String name = (String) client.getName();如果已经知道调用的服务在本地时,我们可以采取下面方法(本地传输)来调用,这种方法可以提高调用服务的速度,减少调用服务的延迟时间。
webservice是跨编程语言和跨平台的远程调用技术。
常见的远程调用技术还有RMI,因为webservice跨平台和跨编程语言,因此应用更广泛,但性能略低。
远程调用:一台计算机a上的一个程序可以调用另一台计算机b上的一个对象的方法。
关于Java webService框架,主要有AXIS、XFire、CXF,还有Java自带的JAX-WS(必须JDK6以上环境)。
SOAP:是在分布式的环境中交换信息的简单协议,以XML作为数据传送的方式。
SOAP=RPC+HTTP+XMLSOAP RPC的工作原理:类似于web的请求/响应方式,不同之处在于web客户和web服务器之间传输的是HTML数据。
在SOAP RPC模式中,SOAP客户(程序)和SOAP服务之间传输的是符合SOAP规范的XML数据。
(XML中说明调用远程服务对象的哪个方法、传递的参数是什么,以及服务对象的返回结果是什么。
)WSDL:webservice客户端要调用一个webservice服务,首先要知道这个服务的地址在哪,以及这个服务有什么方法可以调用。
因此webservice服务端首先要通过一个WSDL文件来说明有什么服务可以对外调用,服务是什么,有哪些方法,方法接受的参数是什么,返回值是什么。
WSDL文件保存在服务端,可以通过url地址访问到。
客户端要调用一个webservice服务之前,要知道该服务的WSDL文件的地址。
webservice服务提供者可以通过两种方式暴露它的WSDL文件地址:a、注册到UDDI服务器,以便被人查找;b、直接告诉客户端调用者;要访问一个远程的webservice,有两种方法:a、通过SOAP协议;b、通过REST的方式;1、AXIS是apache软件组织对SOAP规范的实现。
SOAP客户程序——>AXIS API—RPC请求—>AXIS web应用(SOAP服务),此web应用可以放在Tomcat容器中。
XFire客户端流程分析分类:Webservice 2008-06-13 14:21 341人阅读评论(0) 收藏举报XFire是当前J2EE领域非常流行的Web Service框架,以其卓越的性能和简单易用的特性博得了广大开发者的青睐。
目前XFire已经演变为Apache的CXF 项目,但仍有大量用户在使用XFire。
下面是XFire客户端调用的流程分析图,本文后续本分将围绕该图展开。
XFire客户端的调用非常灵活,可以有很多种方式,如通过配置调用、通过API编程调用或者与Spring等IoC框架集成使用。
虽然调用方式灵活多样,但万变不离其中,其内部流程是一致的。
创建服务模型服务模型是XFire中非常重要的概念之一,包含了服务的接口信息、操作信息、Binding信息等诸多服务调用过程中需要的信息。
因此在进行服务调用之前首先要创建服务模型。
创建服务模型的工作是由服务工厂ServiceFactory完成的,用户需要为服务工程提供服务接口、名称、命名空间等一些信息,其中服务接口是必须的,其他为可选信息。
创建Client实例Client是XFire客户端的核心组成部分,间接的代表了一个服务。
当为具体某个服务配置拦截器(Handler,有很多种译法如拦截器、处理器、过滤器等,本文统一用拦截器)时,其实是将拦截器信息应用到Client实例上。
Client可以手工创建也可以由XFireProxyFactory创建,无论通过哪种方式,Client在初始化过程中最重要的一步都是在out拦截器堆栈中增加一个OutMessageSender拦截器。
该拦截器负责最终将服务调用通过HTTP发送到服务提供者并返回处理结果。
本文后续部分还会对OutMessageSender做更加详细的讲解。
创建服务代理对象XFireProxy,XFire SOAP客户端代理实现,用户调用服务时(如Hello.echo(“tony”))就是通过该对象的invoke方法来执行。
详解java开发webservice的⼏种⽅式webservice的应⽤已经越来越⼴泛了,下⾯介绍⼏种在Java体系中开发webservice的⽅式,相当于做个记录。
1.Axis2Axis是apache下⼀个开源的webservice开发组件,出现的算是⽐较早了,也⽐较成熟。
这⾥主要介绍Axis+eclipse开发webservice,当然不⽤eclipse也可以开发和发布webservice,只是⽤eclipse会⽐较⽅便。
(3)下载eclipse的axis2插件(4)eclipse安装axis2插件1)在任意⽬录下新建⼀个Axis2⽂件夹,在该⽂件夹下新建eclipse⽬录,在eclipse⽬录中新建plugins⽬录和features⽬录,例如:D:\programSoftware\eclipse-SVN\Axis2\eclipse;2)把下载的axis2插件解压,并把解压的⽂件放到新建的eclipse的plugins⽬录下;3)在%eclipse_home%的⽬录下新建links⽬录,并在links⽬录下新建axis2.link⽂件,内容为:path=D:\programSoftware\eclipse-SVN\Axis2;4)重启eclipse,点击·file-new-other,如果看到Axis2 Wizards,则表明插件安装成功。
(5)安装axis2(6)使⽤eclipse新建web⼯程,创建⼀个普通java类,⾄少包含⼀个⽅法。
(7)发布webservice1)点击eclipse的File-New-other,打开Axis2 Wizards,选择Axis2 Service Archiver,然后Next;2)选择Class File Location,也就是类⽂件存放路径,注意:只选到classes⽬录,不要包括包⽂件夹,然后Next;3)选择Skip WSDL,然后Next4)⼀路Next到Select the Service XML file to be included in the Service archive,勾选Generate theservice xml automatically;5)Service Name-填写你的service名称,Class Name-填写类名称,要包括包名,然后点击load,然后点击Finish,这时webservice就发布成功了;6)然后到%TOMCAT_HOME%/webapps/axis2/WEB-INF/services 看看是否多了⼀个.aar的⽂件;2.Apche CXFCXF开发webservice也是⽐较⽅便和简单的,它和spring的集成可以说是⾮常地好。
Webservice 之CXF一、关于CXFApache CXF = Celtix + XFire,Apache CXF 的前身叫Apache CeltiXfire,现在已经正式更名为Apache CXF 了,以下简称为CXF。
CXF 继承了Celtix 和XFire 两大开源项目的精华,提供了对JAX-WS全面的支持,并且提供了多种Binding 、DataBinding、Transport 以及各种Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者WSDL 优先(WSDL First)来轻松地实现Web Services 的发布和使用。
Apache CXF已经是一个正式的Apache顶级项目。
Apache CXF 是一个开源的Services 框架,CXF 帮助您利用Frontend 编程API 来构建和开发Services ,像JAX-WS 。
这些Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者JBI,CXF 大大简化了Services 的创建,同时它继承了XFire 传统,一样可以天然地和Spring 进行无缝集成。
二、CXF/AXIS/AXIS2比较请参考互联网中使用者文章,在此用cxf主要是能与spring无缝隙整合。
三、CXF+spring整合1.工程目录结构:2.所需要包:这些是添加最少的包了。
如果运行中报错,在添加相应的包就可以。
3.Demo中的类实体:package com.fly.bean;import java.io.Serializable;import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlType;@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "user")public class User implements Serializable { private String name;public String getName() {return name;}public void setName(String name) { = name;}public User(){}public User(String name){ = name;}}接口:package com.fly.service;import java.util.List;import javax.jws.WebParam;import javax.jws.WebService;import er;@WebServicepublic interface IHelloWorld {public String sayHi(@WebParam(name="params")String params);public String sayHiToUser(User user);public String[] sayHiToList(List<User> list);}接口实现类:package com.fly.service.impl;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import javax.jws.WebService;import er;import com.fly.service.IHelloWorld;@WebService(endpointInterface="com.fly.service.IHelloWorld",serviceNa me="HelloWorld",targetNamespace="")public class HelloWorldImpl implements IHelloWorld {@Overridepublic String sayHi(String params) {return"hello , "+params;}@Overridepublic String sayHiToUser(User user) {// TODO Auto-generated method stubreturn"hello , name="+user.getName();}@Overridepublic String[] sayHiToList(List<User> list) {String[] result = new String[list.size()];int i=0;for(User u:list){result[i] = "Hello " + u.getName();System.out.println(u.getName());i++;}return result;}}applicationContext.xml:<?xml version="1.0"encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:jaxws="/jaxws"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd /jaxws/schemas/jaxws.xsd"><!-- 此三个文件在cxf.jar保重,将文件放到src目录下,并去掉此注释<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"/>--><!-- 服务可通过两种方式公布,一种JAX-WS标准点的API;另一种 jaxws标签 --> <jaxws:endpoint id="helloWorld"implementor="com.fly.service.impl.HelloWorldImpl"address="/helloWorld"/><!-- spring客户端调用时配置方式一 --><jaxws:client id="helloClient"serviceClass="com.fly.service.IHelloWorld"address="http://localhost:8080/cxftest/webservice/helloWorld" /><!-- spring客户端调用时配置方式二<bean id="helloClient" class="com.fly.service.IHelloWorld"factory-bean="clientFactory" factory-method="create"/><bean id="clientFactory"class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"><property name="serviceClass"value="com.fly.service.IHelloWorld"/><property name="address"value="http://localhost:8080/cxftest/webservice/helloWorld"/></bean>--></beans>Webx.xml配置<?xml version="1.0"encoding="UTF-8"?><web-app version="3.0"xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_3_0.xsd"><display-name></display-name><!-- Spring ApplicationContext配置文件的路径,可使用通配符,多个路径用,号分隔此参数用于后面的Spring Context Loader --><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><!-- Character Encoding filter --><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFil ter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- Spring 刷新Introspector防止内存泄露 --><listener><listener-class>org.springframework.web.util.IntrospectorCleanupL istener</listener-class></listener><servlet><servlet-name>CXFServlet</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-c lass><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>CXFServlet</servlet-name><url-pattern>/webservice/*</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>四、客户端调用package com.fly.client;import java.awt.List;import java.util.ArrayList;import org.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;import er;import com.fly.service.IHelloWorld;public class Client {/*** @param args*/public static void main(String[] args) {//spring bean 方式调用ApplicationContext ctx = newClassPathXmlApplicationContext("applicationContext.xml");IHelloWorld helloClient = (IHelloWorld)ctx.getBean("helloClient");System.out.println(helloClient.sayHi(" 涛哥"));System.out.println(helloClient.sayHiToUser(new User(" 童安格")));ArrayList list = new ArrayList();list.add(new User(" 普弟"));System.out.println(helloClient.sayHiToList(list));//纯cxf调用方式/**JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();factory.getInInterceptors().add(new LoggingInInterceptor());factory.getOutInterceptors().add(new LoggingOutInterceptor());factory.setServiceClass(IHelloWorld.class);factory.setAddress("http://localhost:8080/cxftest/webservice/hell oWorld");IHelloWorld client = (IHelloWorld) factory.create();String reply = client.sayHi(" 涛哥");System.out.println("Server said: " + reply);System.exit(0);*/}}此demo为服务与客户端同工程,如果为不同工程的,请参看注释自行调整。
XFire VS AxisXFire是与Axis2 并列的新一代WebService平台。
之所以并称为新一代,因为它:1、支持一系列Web Service的新标准--JSR181、WSDL2.0 、JAXB2、WS-Security等;2、使用Stax解释XML,性能有了质的提高。
XFire采用Woodstox 作Stax实现;3、容易上手,可以方便快速地从pojo发布服务;4、Spring的结合;5、灵活的Binding机制,包括默认的Aegis,xmlbeans,jaxb2,castor。
XFire与Axis1性能的比较1、XFire比Axis1.3快2-6倍2、XFire的响应时间是Axis1.3的1/2到1/5XFire与Axis2的比较虽然XFire与Axis2都是新一代的WebService平台,但是Axis2的开发者太急于推出1.0版本,所以1.0还不是一个稳定的版本,它的开发者宣称1.1版本即将推出,希望1.1版本会是个稳定的版本。
在XFire捐献给apache后有人认为Axis2将会灭亡。
其实在很多人眼里,Axis2并不是pojo形式,Dan Diephouse证明了XFire比Axis更有市场,我也发现了有很多人开始从Axi s转向XFire,包括我也在说服身边的人转向利用XFire进行WebService的开发,很典型的是我可以在几分钟之内教会我的团队实用XFire来发布一个他自己的Web服务。
本人倾向于XFire确实比Axis2简单很多AXIS VS CXF在SOA领域,我们认为Web Service是SOA体系的构建单元(building block)。
对于服务开发人员来说,AXIS和CXF一定都不会陌生。
这两个产品都是Apache孵化器下面的Web Ser vice开源开发工具。
Axis2的最新版本是1.3.CXF现在已经到了2.0版本。
这两个框架都是从已有的开源项目发展起来的。
CXF、AXIS2、XFire客户端的几种调用方法一、CXF客户端
服务接口类
服务实现类
客户端实现类(JaxWsDynamicClientFactory)
客户端实现类(wsdl2java生成客户端存根类)
import java.util.ArrayList;
客户端实现类(用JAX-WS APIs开发动态客户端)
二、AXIS2客户端
这里我们不写AXIS2的服务端,直接使用上面的CXF的服务端。
客户端实现类(RPCServiceClient)
客户端实现类(用AXIS2 AXIOM[AXis Object Model])
客户端实现类(AXIS2 ADB[Axis Data Binding])
三、XFire客户端
由于XFire客户端方法调用与CXF和Axis2客户端方法调用生成的SAOP包不一样,所以XFire调不了CXF服务,这里我们用XFire实现和CXF相同的TestService服务(由于我们关注的是客户端调用,服务端就在这省略)。
客户端实现类:。
CXF、AXIS2、XFire客户端的几种调用方法一、CXF客户端
服务接口类
服务实现类
客户端实现类(JaxWsDynamicClientFactory)
客户端实现类(wsdl2java生成客户端存根类)
import java.util.ArrayList;
客户端实现类(用JAX-WS APIs开发动态客户端)
二、AXIS2客户端
这里我们不写AXIS2的服务端,直接使用上面的CXF的服务端。
客户端实现类(RPCServiceClient)
客户端实现类(用AXIS2 AXIOM[AXis Object Model])
客户端实现类(AXIS2 ADB[Axis Data Binding])
三、XFire客户端
由于XFire客户端方法调用与CXF和Axis2客户端方法调用生成的SAOP包不一样,所以XFire调不了CXF服务,这里我们用XFire实现和CXF相同的TestService服务(由于我们关注的是客户端调用,服务端就在这省略)。
客户端实现类:。