axis,jax-ws,xfire客户端调用分析,以及webservice万能客户端
- 格式:doc
- 大小:44.00 KB
- 文档页数:8
几种流行Webservice框架性能对比(转载、拼接)1摘要开发webservice应用程序中离不开框架的支持,当open-open网站列举的就有很多种,这对于开发者如何选择带来一定的疑惑。
性能Webservice的关键要素,不同的框架性能上存在较大差异,而当前在官方网站、网络资料中可以方便的找到各自框架的介绍,但是很少有针对不同框架性能测试数据。
本文选择了比较流行几个框架:Apache Axis1、Apache Axis2、Codehaus XFire、Apache CXF、Apache Wink、Jboss RESTEasy、sun JAX-WS(最简单、方便)、阿里巴巴Dubbo (除外)等,采用java作为测试用例,通过本机和远程两种进行测试方式,对这几种框架进行了性能测试,并对测试结果分析和性能比较,最后并对性能优异的框架进行了推荐。
目前三种主流的web服务实现方法:REST(新型):表象化状态转变(软件架构风格)RESTEasy、Wink、CXF、Axis2……. SOAP(比较成熟):简单对象访问协议Xfire、Axis2、CXF、Axis1XML-RPC(淘汰):远程过程调用协议(慢慢被soap 所取代)REST 简单易用,效率高,貌似未来有很大的发展空间,也有宣称rest性能个方便比soap强大的,已经有很多框架宣称对rest进行支持比如spring 3.0、struts…….. (百度观点)SOAP 成熟度较高,安全性较好关键词:Axis1、Axis2、XFire、CXF、Spring、SOAP、StAX、WSDL2框架介绍2.1 Apache Axis1Axis本质上就是一个SOAP引擎(Apache Axis is an implementation of the SOAP),提供创建服务器端、客户端和网关SOAP操作的基本框架。
但Axis并不完全是一个SOAP引擎,它还包括:●是一个独立的SOAP服务器。
使用XFire开发webservice服务和客户端全攻略收藏XFire 是与Axis 2并列的新一代Web Service框架,通过提供简单的API支持Web Service 各项标准协议,帮助你方便快速地开发Web Service应用。
相对于Axis来说,目前XFire相对受欢迎,加上其提供了和Spring集成的支持,在目前的Web Service开源社区拥有众多的追随者。
并且因为XFire为Spring提供的支持,使得我们可以很容易在Spring中使用XFire构建Web Service应用。
XFire 与Axis2相比具有如下特征:l 支持一系列Web Service的新标准--JSR181、WSDL2.0 、JAXB2、WS-Security 等;l 使用Stax解释XML,性能有了质的提高。
XFire采用Woodstox 作Stax实现;l 容易上手,可以方便快速地从pojo发布服务;l 支持Spring、Pico、Plexus、Loom等容器;l 灵活的Binding机制,包括默认的Aegis,xmlbeans,jaxb2,castor;l 高性能的SOAP 栈设计;l 支持Spring、Pico、Plexus、Loom等容器。
XFire 与Axis1性能的比较如下:l XFire 比Axis1.3快2-6倍;l XFire 的响应时间是Axis1.3的1/2到1/5。
XFire 在WebService框架中开始较晚,它从现有的框架中借鉴了许多优秀的理念,力争将Web Service的应用开发难度降到最低。
此外,还提供了各种绑定技术、支持多种传输协议,对WebService体系中许多新的规范提供了支持。
下面让我们来看一个XFire于Spring集成的helloWorld的简单例子。
一.实现的功能和特点本例具有如下功能和特点:1)基于J2EE平台的Web Service服务;2)开发方便,配置简单;3)与spring无缝集成。
目录一使用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服务启动的时候若出现下面错误。
最近一个项目需要调用一个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());}}。
Java WebService几种调用方式一、介绍Java WebService是一种基于SOAP协议的远程方法调用技术,可以实现跨评台、跨语言的通信。
在实际应用中,我们可以使用多种方式来调用Web服务,本文将介绍Java WebService几种常见的调用方式。
二、基于JAX-WS的调用方式JAX-WS(Java API for XML Web Services)是一种用于创建和调用Web服务的Java标准。
通过使用JAX-WS,我们可以方便地创建客户端和服务端,并进行方法调用。
在客户端,我们可以通过使用wsimport命令生成客户端的Java代码,并使用Java代码来调用Web服务的方法。
在服务端,我们可以通过使用@WebService注解来发布服务,并使用Java代码实现方法的具体逻辑。
三、基于Axis的调用方式Apache Axis是一个流行的开源Java Web服务框架,它支持SOAP协议,可以用于创建和调用Web服务。
在基于Axis的调用方式中,我们可以使用WSDL2Java工具生成客户端的Java代码,然后使用Java代码来调用Web服务的方法。
在服务端,我们可以使用Java代码实现方法的逻辑,并使用Axis框架来发布服务。
四、基于CXF的调用方式Apache CXF是另一个流行的开源Java Web服务框架,它也支持SOAP协议,并提供了丰富的特性和扩展性。
在基于CXF的调用方式中,我们可以使用wsdl2java工具生成客户端的Java代码,然后使用Java代码来调用Web服务的方法。
在服务端,我们可以使用Java代码实现方法的逻辑,并使用CXF框架来发布服务。
五、总结在本文中,我们介绍了Java WebService几种常见的调用方式,包括基于JAX-WS、Axis和CXF。
通过这些调用方式,我们可以方便地创建和调用Web服务,实现跨评台、跨语言的通信。
个人观点和理解作为Java开发人员,我认为Java WebService是一种非常重要的技术,它可以帮助我们实现分布式系统之间的通信,为企业级应用的开发提供了很大的便利。
WebService框架JWS、Axis2、XFire、CXF的区别1、JWS是Java语言对WebService服务的一种实现,用来开发和发布服务。
而从服务本身的角度来看JWS服务是没有语言界限的。
但是Java语言为Java开发者提供便捷发布和调用WebService服务的一种途径。
2、Axis2是Apache下的一个重量级WebService框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,是WebService框架的集大成者,它能不但能制作和发布WebService,而且可以生成Java和其他语言版WebService客户端和服务端代码。
这是它的优势所在。
但是,这也不可避免的导致了Axis2的复杂性,使用过的开发者都知道,它所依赖的包数量和大小都是很惊人的,打包部署发布都比较麻烦,不能很好的与现有应用整合为一体。
但是如果你要开发Java之外别的语言客户端,Axis2提供的丰富工具将是你不二的选择。
3、XFire是一个高性能的WebService框架,在Java6之前,它的知名度甚至超过了Apache的Axis2,XFire的优点是开发方便,与现有的Web整合很好,可以融为一体,并且开发也很方便。
但是对Java之外的语言,没有提供相关的代码工具。
XFire后来被Apache收购了,原因是它太优秀了,收购后,随着Java6 JWS的兴起,开源的WebService引擎已经不再被看好,渐渐的都败落了。
4、CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB (企业服务总线)。
CXF来自于XFire项目,经过改造后形成的,就像目前的Struts2来自WebWork一样。
可以看出XFire的命运会和WebWork的命运一样,最终会淡出人们的视线。
CXF不但是一个优秀的Web Services / SOAP / WSDL 引擎,也是一个不错的ESB总线,为SOA的实施提供了一种选择方案,当然他不是最好的,它仅仅实现了SOA架构的一部分。
Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物。
Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持Spring、JSON等技术。
这些都将在后面的系列教程中讲解。
在本文中主要介绍了如何使用Axis2开发一个不需要任何配置文件的WebService,并在客户端使用Java和C#调用这个WebService。
一、Axis2的下载和安装读者可以从如下的网址下载Axis2的最新版本:/axis2/在本文使用了目前Axis2的最新版本1.4.1。
读者可以下载如下两个zip包:axis2-1.4.1-bin.zipaxis2-1.4.1-war.zip其中axis2-1.4.1-bin.zip文件中包含了Axis2中所有的jar文件, axis2-1.4.1-war.zip 文件用于将WebService发布到Web容器中。
将axis2-1.4.1-war.zip文件解压到相应的目录,将目录中的axis2.war文件放到<Tomcat安装目录>\webapps目录中(本文使用的Tomcat的版本是6.x),并启动Tomcat。
在浏览器地址栏中输入如下的URL:http://localhost:8080/axis2/如果在浏览器中显示出如图1所示的页面,则表示Axis2安装成功。
图1二、编写和发布WebService对于用Java实现的服务程序给人的印象就是需要进行大量的配置,不过这一点在Axis2中将被终结。
在Axis2中不需要进行任何的配置,就可以直接将一个简单的POJO发布成WebService。
其中POJO中所有的public方法将被发布成WebService方法。
下面我们来实现一个简单的POJO,代码如下:public class SimpleService{public String getGreeting(String name){return "你好 " + name;}public int getPrice(){return new java.util.Random().nextInt(1000);}}在SimpleService类中有两个方法,由于这两个方法都是public方法,因此,它们都将作为WebService方法被发布。
axis 开发webservice摘要:本节主要用于介绍使用axis开发webservice,包括服务端的创建、webservice的部署、客户端的调用。
preparation:说明:相关的可能要了解SOAP(简单对象访问协议)、WSDL(web服务描述语言)、XML(可扩展标记语言)、axis(阿帕奇可扩展交互系统)等相关知识。
1.下载axis的jar包,请到apache官网或者在百度自行下载,然后导入jar包,不清楚的话导入所有的jar包就好了。
(本人用的是axis1的版本,因为项目中用的是axis1的版本)2.webservice客户端生成工具genclient.bat(后面会对这个工具做一个简单的说明)之前介绍没有说明本机的环境,现在把本机环境罗列一下:系统:XP myeclipse:6.5 tomcat:5.X JDK:1.5生成webservice的方式有XFire、Jax-WS、axis等,使用axis调用webservi有三种方式:动态调用接口、使用动态代理Dynamic Proxy、使用从WSDL生成的存根generated Stubs from Service WSDL description,由于本人工作中使用的是axis,调用webservice的方式用到的有动态调用接口、使用从WSDL生成的存根generated Stubs from Service WSDL description,故本节只介绍用axis调用webservice的这两种方式。
后续的拓展部分根据需要再说。
start:第一步:服务器端的开发(1)开发java文件代码如下:接口文件:IBbossGroupInfoService.java接口1 package info.b2p.soap.interfaces;23 import java.rmi.RemoteException;45 public interface IBbossGroupInfoService {67 // 根据集团编号查询集团基本信息8 /**9 * 集团编号GROUP_NUM 集团名称GROUP_NAME 公司地址CO_ADDR 集团状态GROUP_STATE 集团开户时间10 * START_TIME 传真FAX 企业网址WEB_URL 证件类型CARD_TYPE 证件号码CARD_CODE11 * 公司邮编CO_POSTCODE 联系电话TEL_NUM 法人代表名称PERSON_NAME 发展类型DEVELOP_TYPE12 * 地区编码REGION_ID regionId13 *14 * @throws Exception15 */16 public abstract String groupInfo(long groupNo) throws Exception,17 RemoteException;1819 // 根据集团编号查询集团订购历史20 public abstract String groupSubHistoryInfo(long groupNo) throws Exception;2122 }实现类:IBbossGroupInfoServiceImpl.java实现类1 package info.b2p.soap.impl;23 import mons.logging.Log;4 import mons.logging.LogFactory;5 import info.b2p.soap.interfaces.IBbossGroupInfoService;67 /**8 * @Product esop_dev9 * @FileName IBbossGroupInfoServiceImpl.java10 * @History TODO 根据集团编号,查询集团基本信息、集团用户信息、集团订购历史11 * @Version 1.0.012 * @Date Nov 22, 201113 * @Author pantaipeng14 * @Content 最初版本15 */16 public class IBbossGroupInfoServiceImpl implements IBbossGroupInfoService {17 private static transient Log log = LogFactory18 .getLog(IBbossGroupInfoServiceImpl.class);192021 // 根据集团编号查询集团基本信息22 public String groupInfo(long groupNo) throws Exception, RemoteException {23 (">>>>>>>>>>>>>>>>>>>>>>>>>>>集团编号=" + groupNo);24 //方法体我省略了,为了测试我仅加入一句打印语句25 System.out.println("我是一个公共的方法,作用是根据集团编号查询集团基本信息");26 String xml="<message>public_groupInfo</message>";//为了测试,返回的信息我也是随便写的一个字符串27 return xml;28 }2930 // 根据集团编号查询集团订购历史31 public String groupSubHistoryInfo(long groupNo) throws Exception {3233 (">>>>>>>>>>>>>>>>>>>>>>>>>>>集团编号=" + groupNo);34 //方法体我省略了,为了测试我仅加入一句打印语句35 System.out.println("我是一个公共的方法,作用是根据集团编号查询集团订购历史");36 String xml="<message>public_groupSubHistoryInfo</message>";//为了测试,返回的信息我也是随便写的一个字符串37 return xml;38 }39 }说明:为了更加的接近实际的开发,这个是本机上运行的程序,实现的功能是通过一个编号查询相关信息拼成一个字符串,方法体的部分我删除了,你需要用这个代码的话,直接拷贝修改包名称就可以直接用了。
WebService使用目录目录 (2)1 XFire方式 (3)1.1 XFire生成服务端 (3)1.1.1 建立webservice工程 (3)1.1.2 建立webservice (4)1.2 访问webservice (8)1.3 XFire生成客户端 (9)1.4 客户端调用webservice服务 (10)2 AXIS方式 (11)2.1 AXIS生成服务端 (11)2.2 AXIS生成客户端 (18)2.3 客户端调用AXIS的webservice服务 (18)3 JAX-WS方式 (19)3.1 使用WSDL生成服务端 (19)3.2 创建服务端 (21)3.3 JAX-WS生成客户端 (24)3.4 客户端调用webservice服务 (26)4 CXF方式 (28)4.1 导入所需包 (28)4.2 接口创建 (28)4.3 实现类创建 (29)4.4 web.xml配置 (29)4.5 applicationContext.xml配置 (30)5 关于jax-ws服务端和xfire服务端冲突的问题 (30)6 推荐模式 (31)1XFire方式1.1XFire生成服务端1.1.1建立webservice工程●使用Myeclipse新建一个Webservice工程WBSVS,选择XFire方式。
●选择Next,默认选项●默认选项完成webservice创建1.1.2建立webservice●选中工程,新建一个webservice选择XFIRE Strategy选Create web service from java bean & create new java bean填写webservice名称,其他自动补充点击完成,系统生成如下内容●Services.xml内容如下:●Web.xml中新增webservice配置信息1.2访问webservice启动工程,使用soapui即可调用到该webservice,服务端建成。
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的一种技术框架(架构)。
Java调用webservice方式的总结柿子当然要拿软的捏,笔者先讲基于http协议的jax-rs规范的webservice的调用方式。
客户端调用WebService的方式:1.通过wximport生成代码2.通过客户端编程方式(同第一种是一样都是本地调用)3.通过ajax调用方式(可能存在跨域jax-rs)4.通过URL Connection 方式调用5.通过HttpClient方式调用6.xfire框架下生成的客户端(不用)1.wximport根据wsdl文档生成客户端代码,再调用在eclipse中,根据操作生成客户端代码,Eg:调用helloWS方法即可2.客户单编程方式(和第一种方式一样)先生成客户端代码后,调用以下是经测试后的实例:URL url = new URL("http://localhost:88/webServiceWS/wsWSPort?wsdl");QName sname = new QName("http://ws.webservice.suan/", "wsWSService");Service service = Service.create(url,sname);WsWSDelegate ms = service.getPort(WsWSDelegate.class);System.out.println(ms.helloWS("suansuan"));} catch (MalformedURLException e) {e.printStackTrace();第二种方式中,还可以直接创建了SOAP消息后使用dispatch便可以进行传递,通过extractConentAsDocument方法得到Document类型的返回值参考网页:/wanghuan203/article/details/92195653.使用ajax+xml+js的方式调用具体使用方法,参考整理的ajax跨域文档4.URL Connection方式//服务的地址//服务的地址URL wsUrl = new URL("http://localhost:88/webServiceWS/wsWSPort");HttpURLConnection conn = (HttpURLConnection) wsUrl.openConnection();conn.setDoInput(true);conn.setDoOutput(true);conn.setRequestMethod("POST");conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");OutputStream os = conn.getOutputStream();//创建SOAPMessageSOAPMessage msg=MessageFactory.newInstance().createMessage();SOAPEnvelope envelope =msg.getSOAPPart().getEnvelope();SOAPBody body=envelope.getBody();//创建QName来指定消息中传递数据QName ename=new QName("http://ws.webservice.suan/","HelloWS","wsWSService");//<nn:add xmlns="xx"/>SOAPBodyElement ele=body.addBodyElement(ename);ele.addChildElement("arg0").setValue("suansuan");String soap1=soap.toSoapString(msg);os.write(soap1.getBytes());InputStream is = conn.getInputStream();byte[] b = new byte[1024];int len = 0;String s = "";while((len = is.read(b)) != -1){String ss = new String(b,0,len,"UTF-8");s += ss;}System.out.println(s);is.close();os.close();conn.disconnect();5.httpclient方式需要commons-codec-1.3.jar,commons-logging-1.0.4.jar,commons-httpclient-3.1.jar//定义一个PostMethod,这时需要指定web服务的Url//soapRequestData是传递的soap协议的信息,可以通过soap建立,也可以直接StringPostMethod postMethod =new PostMethod("http://localhost:88/webServiceWS/wsWSPort");byte[] b = soapRequestData.getBytes("utf-8");InputStream is =new ByteArrayInputStream(b,0,b.length);//RequestEntity re = new InputStreamRequestEntity(is,b.length,"application/soap+xml; charset=utf-8");//不能设置后面的内容,设置了报415错误RequestEntity re =new InputStreamRequestEntity(is,b.length);postMethod.setRequestEntity(re);HttpClient httpClient =new HttpClient();int statusCode = httpClient.executeMethod(postMethod);//请求状态200 okString result =postMethod.getResponseBodyAsString();//返回的字符串形式的soap,进一步解析System.out.println(statusCode);System.out.println(result.toString());6.xfire框架下生成的客户端也是通过wsdl生成客户端程序后调用,至于soap header的验证,使用map加入验证信息后验证具体的操作,在我工作文档中,有一个短信平台接口文档有详细的xfire的使用过程,通用性不错注意,以上关于soap信息,我是根据生成的本地调用类的注释,编写soap信息,此外可以直接使用String类型的字符串,只要你熟悉soap的格式,就可以手动编写传递的soap消息。
java webservice 接口实现方式
Java Web Service接口可以通过以下几种方式来实现:
1. JAX-WS(Java API for XML Web Services):JAX-WS是Java EE的一部分,它提供了一套用于开发和部署Web服务的标准API。
使用JAX-WS,可以通过注解或者基于XML配置来定义和实现Web服务接口。
2. Apache Axis:Apache Axis是一个开源的Web服务框架,它提供了通过Java编程语言开发和部署Web服务的功能。
Apache Axis支持JAX-RPC标准和JAX-WS标准,并且提供了一套基于Java的API来创建和访问Web服务接口。
3. Spring Web Services:Spring Web Services是基于Spring框架的一组API,它支持开发和部署Web服务。
Spring Web Services提供了一套简单的API来创建和发布Web服务,可以通过注解或者基于XML配置来定义和实现Web服务接口。
4. Apache CXF:Apache CXF是一个开源的Web服务框架,它提供了一套用于开发和部署Web服务的功能。
Apache CXF 支持JAX-WS和JAX-RS标准,并且提供了一套基于Java的API来创建和访问Web服务接口。
这些实现方式各有优劣,选择适合自己项目的方式进行实现。
同时,可以根据项目具体需求和技术栈选择合适的工具和框架来开发和部署Web服务接口。
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容器中。
Visual Studio Code是一款功能强大的集成开发环境,它支持多种编程语言,包括Java。
在Java开发过程中,经常需要调用webservice方法来实现与其他系统的交互,本文将详细介绍在Visual Studio Code中如何调用webservice方法的各种方法。
1. 使用Axis2插件Axis2是一个流行的Java web服务框架,Visual Studio Code提供了Axis2插件来简化调用webservice方法的过程。
首先需要在Visual Studio Code中安装Axis2插件,然后在项目中创建一个webservice客户端,通过Axis2插件生成客户端代码,最后调用webservice方法并处理返回结果。
2. 使用JAX-WSJAX-WS是Java API for XML Web Services的缩写,它提供了一种简单的方式来创建和调用webservice方法。
在Visual Studio Code中,可以使用JAX-WS来生成webservice客户端代码,并通过调用客户端代码来实现与webservice的交互。
需要注意的是,JAX-WS需要依赖一些Java EE的库,在使用时需要将相关的库文件添加到项目中。
3. 使用第三方库除了Axis2和JAX-WS之外,还可以使用一些第三方的Java库来简化调用webservice方法的过程。
例如,Apache CXF是一个流行的Java webservice框架,它提供了丰富的工具和库来简化webservice的开发和调用。
在Visual StudioCode中,可以使用Apache CXF来创建webservice客户端,并通过调用客户端代码来实现与webservice的交互。
4. 使用Spring框架Spring框架是一个流行的Java开发框架,它提供了丰富的工具和库来简化Java开发过程。
在Visual Studio Code中,可以使用Spring框架来创建webservice客户端,并通过调用客户端代码来实现与webservice的交互。
axis2开发的webservice的客户端⽣成、webservice的报⽂封装、解析、w。
根据wsdl和axis2 ⽣成webservice的客户端,具体做法参照这篇随笔<!-- ========报⽂⼊参======= --><?xml version="1.0" encoding="GBK" standalone="no" ?><ROOT><SERVICE_NO type="string">136********</SERVICE_NO><MASTER_SERV_ID type="string">1001</MASTER_SERV_ID><REQUEST_INFO><OPR_INFO><PROVINCE_GROUP type="string">10010</PROVINCE_GROUP><OPEN_TIME type="string">20120301212121</OPEN_TIME><LOGIN_NO type="string">aa1868</LOGIN_NO><SERVICE_NO type="string">136********</SERVICE_NO><ACT_ID type="string">201304161360175132</ACT_ID><CONTACT_ID type="string"></CONTACT_ID><MEANS_ID type="string">201304161360175139</MEANS_ID><CUST_ADVINCE type="string"></CUST_ADVINCE><RECOMMEND_NO type="string"></RECOMMEND_NO><CHANNEL_TYPE type="string">11</CHANNEL_TYPE><TO_GROUP_ID type="string"></TO_GROUP_ID><SERIAL_NO type="string"></SERIAL_NO><JOIN_TERMI_FLAG type="string">JH111</JOIN_TERMI_FLAG><TAINFO_LIST><TA_INFO><PHONE_NO type="string"></PHONE_NO><ID_NO type="string"></ID_NO></TA_INFO></TAINFO_LIST></OPR_INFO><PARAMS><A06><PRC_INFO_LIST><PRC_INFO><PROD_PRCID type="string"></PROD_PRCID><PRC_INFO_LIST><PRC_INFO><PROD_PRCID type="string"></PROD_PRCID></PRC_INFO></PRC_INFO_LIST><SERV_NO type="string"></SERV_NO></B06><B02><SERV_NO type="string"></SERV_NO></B02><B10><SERV_NO type="string"></SERV_NO></B10><A11><RESOURCE_LIST><RESOURCE_INFO><RECEIVE_PHONE type="string">136********</RECEIVE_PHONE> <IMEI_NO type="string">869412018032158</IMEI_NO><COLOR_ID type="string">10000000</COLOR_ID></RESOURCE_INFO></RESOURCE_LIST></A11><A14><PHONE_NO type="string"></PHONE_NO></A14><A17><CONDCLASS_0178 type="string">0987</CONDCLASS_0178></A17><A24><SCORE_MONEY type="string"></SCORE_MONEY></A24><A26><IMEI_NO type="string"></IMEI_NO><PHONE_NO type="string"></PHONE_NO></A26></REQUEST_INFO></ROOT><!-- 报⽂出参: --><?xml version="1.0" encoding="GBK" standalone="no" ?><ROOT><RETURN_CODE type="long">0</RETURN_CODE> // 1<RETURN_MSG type="string">ok!</RETURN_MSG> // 2<USER_MSG type="string">ok!</USER_MSG> // 3<DETAIL_MSG type="string">OK!</DETAIL_MSG> // 4<PROMPT_MSG type="string"></PROMPT_MSG> // 5当封装报⽂时,这⾥1,2,3,4,5部分封装成了⼀个对象:ResponseHead<OUT_DATA><ORDER_ID type="string">O1113052800212745</ORDER_ID><CREATE_ACCEPT type="long">101973397749</CREATE_ACCEPT> <PASS_FLAG type="string">Y</PASS_FLAG></OUT_DATA></ROOT>封装⼊参报⽂对象package com.*.s4035IntCfm;import java.util.ArrayList;import java.util.List;public class S4035IntCfmRequest {private String serviceNo;private String masterServId;private String provinceGroup;private String loginNo;private String phoneNo;private String actId;private String meansId;private String contactId;private String channelType;private String custAdvince;private String recommendNo;private String serialNo;private String joinTermiFlag;private List<PrcInfo> prcInfoList =new ArrayList<PrcInfo>();private List<ResourceInfo> resourceInfo=new ArrayList<ResourceInfo>(); private String servNo;private String imeiNo;private String openTime;public String getOpenTime() {return openTime;}public void setOpenTime(String openTime) {this.openTime = openTime;}public String getImeiNo() {return imeiNo;}public void setImeiNo(String imeiNo) {this.imeiNo = imeiNo;}private String transferSNo;//TRANSFER_SERIALNOprivate String condclass;//CONDCLASS_0178private String scoreMoney;private String index;public String getIndex() {return index;}public void setIndex(String index) {this.index = index;}public String getScoreMoney() {return scoreMoney;}public void setScoreMoney(String scoreMoney) {this.scoreMoney = scoreMoney;}public String getCondclass() {return condclass;this.condclass = condclass;}public String getTransferSNo() {return transferSNo;}public void setTransferSNo(String transferSNo) {this.transferSNo = transferSNo;}public String getServNo() {return servNo;}public void setServNo(String servNo) {this.servNo = servNo;}public List<PrcInfo> getPrcInfoList() {return prcInfoList;}public void setPrcInfoList(List<PrcInfo> prcInfoList) {this.prcInfoList = prcInfoList;}public List<ResourceInfo> getResourceInfo() {return resourceInfo;}public void setResourceInfo(List<ResourceInfo> resourceInfo) { this.resourceInfo = resourceInfo;}public String getServiceNo() {return serviceNo;}public void setServiceNo(String serviceNo) {this.serviceNo = serviceNo;}public String getMasterServId() {return masterServId;}public void setMasterServId(String masterServId) {this.masterServId = masterServId;return provinceGroup;}public void setProvinceGroup(String provinceGroup) { this.provinceGroup = provinceGroup;}public String getLoginNo() {return loginNo;}public void setLoginNo(String loginNo) {this.loginNo = loginNo;}public String getPhoneNo() {return phoneNo;}public void setPhoneNo(String phoneNo) {this.phoneNo = phoneNo;}public String getActId() {return actId;}public void setActId(String actId) {this.actId = actId;}public String getMeansId() {return meansId;}public void setMeansId(String meansId) {this.meansId = meansId;}public String getContactId() {return contactId;}public void setContactId(String contactId) {this.contactId = contactId;}public String getChannelType() {return channelType;this.channelType = channelType;}public String getCustAdvince() {return custAdvince;}public void setCustAdvince(String custAdvince) {this.custAdvince = custAdvince;}public String getRecommendNo() {return recommendNo;}public void setRecommendNo(String recommendNo) { this.recommendNo = recommendNo;}public List<TaInfo> getTaInfoList() {return taInfoList;}public void setTaInfoList(List<TaInfo> taInfoList) {this.taInfoList = taInfoList;}public String getToGroupId() {return toGroupId;}public void setToGroupId(String toGroupId) {this.toGroupId = toGroupId;}public String getSerialNo() {return serialNo;}public void setSerialNo(String serialNo) {this.serialNo = serialNo;}public String getJoinTermiFlag() {return joinTermiFlag;}public void setJoinTermiFlag(String joinTermiFlag) { this.joinTermiFlag = joinTermiFlag;Request对象中引⽤类型属性TaInfopackage com.*.s4035IntCfm;public class TaInfo {private String phoneNo;//可空private String idNo;//可空public String getPhoneNo() {return phoneNo;}public void setPhoneNo(String phoneNo) {this.phoneNo = phoneNo;}public String getIdNo() {return idNo;}public void setIdNo(String idNo) {this.idNo = idNo;}}Request对象中引⽤类型属性PrcInfopackage com.*.s4035IntCfm;public class PrcInfo {private String prodPrcid;//给⽤户订购的资费,可空 public String getProdPrcid() {return prodPrcid;}public void setProdPrcid(String prodPrcid) {this.prodPrcid = prodPrcid;}}Request对象中引⽤类型属性ResourceInfo package com.*.s4035IntCfm;public class ResourceInfo {private String receivePhone;private String imeiNo;return receivePhone;}public void setReceivePhone(String receivePhone) { this.receivePhone = receivePhone;}public String getImeiNo() {return imeiNo;}public void setImeiNo(String imeiNo) {this.imeiNo = imeiNo;}public String getColorId() {return colorId;}public void setColorId(String colorId) {this.colorId = colorId;}}出参报⽂的封装对象的⽗类package com.*;public class ResponseHead {private String returnCode;private String returnMsg;private String userMsg;private String detailMsg;private String promptMsg;public String getReturnCode() {return returnCode;}public void setReturnCode(String returnCode) {this.returnCode = returnCode;}public String getReturnMsg() {return returnMsg;}public void setReturnMsg(String returnMsg) {this.returnMsg = returnMsg;return userMsg;}public void setUserMsg(String userMsg) {erMsg = userMsg;}public String getDetailMsg() {return detailMsg;}public void setDetailMsg(String detailMsg) {this.detailMsg = detailMsg;}public String getPromptMsg() {return promptMsg;}public void setPromptMsg(String promptMsg) {this.promptMsg = promptMsg;}}把出参报⽂为封装response对象,此处继承⼀个⾃定义的根据出参报⽂封装的⽗类package com.*.s4035IntCfm;import com.*.ResponseHead;public class S4035IntCfmResponse extends ResponseHead{private String orderId;private String createAccept;private String passFlag;public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId = orderId;}public String getCreateAccept() {return createAccept;}public void setCreateAccept(String createAccept) {this.createAccept = createAccept;return passFlag;}public void setPassFlag(String passFlag) {this.passFlag = passFlag;}}把S4035IntCfmRequest对象装换成⼊参报⽂public static String parseS4035IntCfmRequest2XML(S4035IntCfmRequest request){String xml=null;StringBuffer sb = new StringBuffer();sb.append("<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"no\" ?>").append("\n");sb.append("<ROOT>").append("\n");sb.append("<SERVICE_NO type=\"string\">"+request.getServiceNo()+"</SERVICE_NO>").append("\n");sb.append("<MASTER_SERV_ID type=\"string\">"+request.getMasterServId()+"</MASTER_SERV_ID>").append("\n");sb.append("<REQUEST_INFO>").append("\n");sb.append("<OPR_INFO>").append("\n");sb.append("<PROVINCE_GROUP type=\"string\">"+request.getProvinceGroup()+"</PROVINCE_GROUP>").append("\n"); sb.append("<OPEN_TIME type=\"string\">"+request.getOpenTime()+"</OPEN_TIME>").append("\n");sb.append("<LOGIN_NO type=\"string\">"+request.getLoginNo()+"</LOGIN_NO>").append("\n");// sb.append("<PHONE_NO type=\"string\">"+request.getPhoneNo()+"</PHONE_NO>").append("\n");sb.append("<SERVICE_NO type=\"string\">"+request.getServiceNo()+"</SERVICE_NO>").append("\n");sb.append("<ACT_ID type=\"string\">"+request.getActId()+"</ACT_ID>").append("\n");if(request.getContactId()==null){sb.append("<CONTACT_ID type=\"string\"></CONTACT_ID>").append("\n");}else{sb.append("<CONTACT_ID type=\"string\">"+request.getContactId()+"</CONTACT_ID>").append("\n");}sb.append("<MEANS_ID type=\"string\">"+request.getMeansId()+"</MEANS_ID>").append("\n");if(request.getCustAdvince()==null){sb.append("<CUST_ADVINCE type=\"string\"></CUST_ADVINCE>").append("\n");}else{sb.append("<CUST_ADVINCE type=\"string\">"+request.getCustAdvince()+"</CUST_ADVINCE>").append("\n");}if(request.getRecommendNo()==null){sb.append("<RECOMMEND_NO type=\"string\"></RECOMMEND_NO>").append("\n");}else{sb.append("<RECOMMEND_NO type=\"string\">"+request.getRecommendNo()+"</RECOMMEND_NO>").append("\n"); }sb.append("<CHANNEL_TYPE type=\"string\">"+request.getChannelType()+"</CHANNEL_TYPE>").append("\n");if(request.getToGroupId()==null){sb.append("<TO_GROUP_ID type=\"string\"></TO_GROUP_ID>").append("\n");}else{sb.append("<TO_GROUP_ID type=\"string\">"+request.getToGroupId()+"</TO_GROUP_ID>").append("\n");}if(request.getSerialNo()==null){sb.append("<SERIAL_NO type=\"string\"></SERIAL_NO>").append("\n");}else{sb.append("<SERIAL_NO type=\"string\">"+request.getSerialNo()+"</SERIAL_NO>").append("\n");}if(request.getJoinTermiFlag()==null){sb.append("<JOIN_TERMI_FLAG type=\"string\"></JOIN_TERMI_FLAG>").append("\n");}else{sb.append("<JOIN_TERMI_FLAG type=\"string\">"+request.getJoinTermiFlag()+"</JOIN_TERMI_FLAG>").append("\n"); }sb.append("<TAINFO_LIST>").append("\n");if(request.getTaInfoList()!=null&&request.getTaInfoList().size()>0){String phoneNo=null;String idNo=null;for(int i=0;i<request.getTaInfoList().size();i++){TaInfo taInfo=request.getTaInfoList().get(i);sb.append("<TA_INFO>").append("\n");phoneNo=taInfo.getPhoneNo()!=null?taInfo.getPhoneNo():"";idNo=taInfo.getIdNo()!=null?taInfo.getIdNo():"";sb.append("<PHONE_NO type=\"string\">"+phoneNo+"</PHONE_NO>").append("\n");sb.append("<ID_NO type=\"string\">"+idNo+"</ID_NO>").append("\n");sb.append("</TA_INFO>").append("\n");}}else{sb.append("<TA_INFO>").append("\n");sb.append("<PHONE_NO type=\"string\"></PHONE_NO>").append("\n");sb.append("<ID_NO type=\"string\"></ID_NO>").append("\n");sb.append("</TA_INFO>").append("\n");}sb.append("</TAINFO_LIST>").append("\n");sb.append("</OPR_INFO>").append("\n");sb.append("<PARAMS>").append("\n");sb.append("<A06>").append("\n");sb.append("<PRC_INFO_LIST>").append("\n");if(request.getPrcInfoList()!=null&&request.getPrcInfoList().size()>0){String prodPrcId=null;for(int i=0;i<request.getPrcInfoList().size();i++){PrcInfo prcInfo=request.getPrcInfoList().get(i);sb.append("<PRC_INFO>").append("\n");prodPrcId=prcInfo.getProdPrcid()!=null?prcInfo.getProdPrcid():"";sb.append("<PROD_PRCID type=\"string\">"+prodPrcId+"</PROD_PRCID>").append("\n"); sb.append("</PRC_INFO>").append("\n");}}else{sb.append("<PRC_INFO>").append("\n");sb.append("<PROD_PRCID type=\"string\"></PROD_PRCID>").append("\n");sb.append("</PRC_INFO>").append("\n");}sb.append("</PRC_INFO_LIST>").append("\n");sb.append("</A06>").append("\n");sb.append("<B06>").append("\n");sb.append("<PRC_INFO_LIST>").append("\n");if(request.getPrcInfoList()!=null&&request.getPrcInfoList().size()>0){String prodPrcId=null;for(int i=0;i<request.getPrcInfoList().size();i++){PrcInfo prcInfo=request.getPrcInfoList().get(i);sb.append("<PRC_INFO>").append("\n");prodPrcId=prcInfo.getProdPrcid()!=null?prcInfo.getProdPrcid():"";sb.append("<PROD_PRCID type=\"string\">"+prodPrcId+"</PROD_PRCID>").append("\n"); sb.append("</PRC_INFO>").append("\n");}}else{sb.append("<PRC_INFO>").append("\n");sb.append("<PROD_PRCID type=\"string\"></PROD_PRCID>").append("\n");sb.append("</PRC_INFO>").append("\n");}sb.append("</PRC_INFO_LIST>").append("\n");if(request.getServNo()==null){sb.append("<SERV_NO type=\"string\"></SERV_NO>").append("\n");}else{sb.append("<SERV_NO type=\"string\">"+request.getServNo()+"</SERV_NO>").append("\n");}sb.append("</B06>").append("\n");sb.append("<B02>").append("\n");if(request.getServNo()==null){sb.append("<SERV_NO type=\"string\"></SERV_NO>").append("\n");}else{sb.append("<SERV_NO type=\"string\">"+request.getServNo()+"</SERV_NO>").append("\n");}sb.append("</B02>").append("\n");sb.append("<B10>").append("\n");if(request.getServNo()==null){sb.append("<SERV_NO type=\"string\"></SERV_NO>").append("\n");}else{sb.append("<SERV_NO type=\"string\">"+request.getServNo()+"</SERV_NO>").append("\n");}sb.append("</B10>").append("\n");sb.append("<A11>").append("\n");sb.append("<RESOURCE_LIST>").append("\n");if(request.getResourceInfo()!=null&&request.getResourceInfo().size()>0){String recPhone=null;String imeiNo=null;String colorId=null;for(int i=0;i<request.getResourceInfo().size();i++){ResourceInfo resourceInfo=request.getResourceInfo().get(i);sb.append("<RESOURCE_INFO>").append("\n");recPhone=resourceInfo.getReceivePhone()!=null?resourceInfo.getReceivePhone():"";imeiNo=resourceInfo.getImeiNo()!=null?resourceInfo.getImeiNo():"";colorId=resourceInfo.getColorId()!=null?resourceInfo.getColorId():"";sb.append("<RECEIVE_PHONE type=\"string\">"+recPhone+"</RECEIVE_PHONE>").append("\n"); sb.append("<IMEI_NO type=\"string\">"+imeiNo+"</IMEI_NO>").append("\n");sb.append("<COLOR_ID type=\"string\">"+colorId+"</COLOR_ID>").append("\n");sb.append("</RESOURCE_INFO>").append("\n");}}else{sb.append("<RESOURCE_INFO>").append("\n");sb.append("<RECEIVE_PHONE type=\"string\"></RECEIVE_PHONE>").append("\n");sb.append("<IMEI_NO type=\"string\"></IMEI_NO>").append("\n");sb.append("<COLOR_ID type=\"string\"></COLOR_ID>").append("\n");sb.append("</RESOURCE_INFO>").append("\n");}sb.append("</RESOURCE_LIST>").append("\n");sb.append("</A11>").append("\n");sb.append("<A14>").append("\n");if(request.getPhoneNo()==null){sb.append("<PHONE_NO type=\"string\"></PHONE_NO>").append("\n");}else{sb.append("<PHONE_NO type=\"string\">"+request.getPhoneNo()+"</PHONE_NO>").append("\n");}sb.append("</A14>").append("\n");sb.append("<A17>").append("\n");if(request.getCondclass()==null){sb.append("<CONDCLASS_0178 type=\"string\"></CONDCLASS_0178>").append("\n");}else{sb.append("<CONDCLASS_0178 type=\"string\">"+request.getCondclass()+"</CONDCLASS_0178>").append("\n"); }sb.append("</A17>").append("\n");sb.append("<A24>").append("\n");if(request.getScoreMoney()==null){sb.append("<SCORE_MONEY type=\"string\"></SCORE_MONEY>").append("\n");}else{sb.append("<SCORE_MONEY type=\"string\">"+request.getScoreMoney()+"</SCORE_MONEY>").append("\n");}sb.append("</A24>").append("\n");sb.append("<A26>").append("\n");if(request.getImeiNo()==null){sb.append("<IMEI_NO type=\"string\"></IMEI_NO>").append("\n");}else{sb.append("<IMEI_NO type=\"string\">"+request.getImeiNo()+"</IMEI_NO>").append("\n");}if(request.getPhoneNo()==null){sb.append("<PHONE_NO type=\"string\"></PHONE_NO>").append("\n");}else{sb.append("<PHONE_NO type=\"string\">"+request.getPhoneNo()+"</PHONE_NO>").append("\n");}sb.append("</A26>").append("\n");sb.append("<A04>").append("\n");if(request.getIndex()==null){sb.append("<INDEX type=\"string\"></INDEX>").append("\n");}else{sb.append("<INDEX type=\"string\">"+request.getScoreMoney()+"</INDEX>").append("\n");}sb.append("</A04>").append("\n");sb.append("</PARAMS>").append("\n");sb.append("</REQUEST_INFO>").append("\n");sb.append("</ROOT>").append("\n");xml = sb.toString();return xml;}把调⽤接⼝获得的出参报⽂转换成⾃⼰封装的S4035IntCfmResponse对象public static S4035IntCfmResponse parseXML2S4035IntCfmResponse(String xml) throws DocumentException{ Document document =DocumentHelper.parseText(xml);S4035IntCfmResponse response =new S4035IntCfmResponse();Element root = document.getRootElement();String DETAIL_MSG = root.elementTextTrim("DETAIL_MSG");String PROMPT_MSG = root.elementTextTrim("PROMPT_MSG");String RETURN_CODE = root.elementTextTrim("RETURN_CODE");if(RETURN_CODE!=null&&(RETURN_CODE.equals("0")||RETURN_CODE.equals("0"))){Element OUT_DATA = root.element("OUT_DATA");String ORDER_ID = OUT_DATA.elementTextTrim("ORDER_ID");String CREATE_ACCEPT = OUT_DATA.elementTextTrim("CREATE_ACCEPT");String PASS_FLAG = OUT_DATA.elementTextTrim("PASS_FLAG");response.setOrderId(ORDER_ID);response.setCreateAccept(CREATE_ACCEPT);response.setPassFlag(PASS_FLAG);}response.setDetailMsg(DETAIL_MSG);response.setPromptMsg(PROMPT_MSG);response.setReturnCode(RETURN_CODE);return response;}在service层调⽤webservice接⼝并把⼊参和出参报⽂记录到数据库public S4035IntCfmResponse S4035IntCfm(S4035IntCfmRequest request,String url) {S4035IntCfmResponse response = null;String xml = MyParseXML.parseS4035IntCfmRequest2XML(request);System.out.println(xml);("========⼊参=======" + xml);try {S4035IntCfmStub stub = new S4035IntCfmStub(url);S4035IntCfmStub.CallService call = new S4035IntCfmStub.CallService();call.setPin(xml);S4035IntCfmStub.CallServiceResponse response2 = stub.callService(call);String xml1 = "";xml1 = response2.get_return();System.out.println(xml1);("========出参=======" + xml1);// 记录⼊参报⽂和出参报⽂TOperationLogDTO oper = new TOperationLogDTO();oper.setOperateTime(new Date());oper.setOperateUser("商城 ");oper.setOperateDesc("⼊参:" + xml + "\n出参:" + xml1);oper.setOperateAction("⾃主开通合约");oper.setOperateObjectId(request.getServiceNo());oper.setOperateObjectReason("");oper.setOperateName(request.getPhoneNo());//底层通过this.getHibernateTemplate().save(dto);保存到数据中this.operationLogManagerImpl.save(oper);response = MyParseXML.parseXML2S4035IntCfmResponse(xml);} catch (Exception e) {e.printStackTrace();}return response;}这样在Action层,传⼊指定的参数,就可调⽤S4035IntCfm(S4035IntCfmRequest request,String url)⽅法了,并且可以通过调⽤接⼝的返回值S4035IntCfmResponse进⾏判断处理保存⼊参和出参时涉及到java类和相关⽂件import ng.builder.EqualsBuilder;import ng.builder.HashCodeBuilder;/*** <ul>* <li> <b>⽬的:</b> <br />* <p>* 表T_OPERATION_LOG的映射类,*/public class TOperationLogDTO extends AbstractTOperationLogDTO{private static final long serialVersionUID = 8980322235903658767L;public TOperationLogDTO(){super();}public TOperationLogDTO(ng.String logId){super(logId);}public boolean equals(Object other){ if ( !(other instanceof TOperationLogDTO) )return false;TOperationLogDTO castOther = (TOperationLogDTO) other;return new EqualsBuilder().append(this.getLogId(), castOther.getLogId()).isEquals(); }public int hashCode(){return new HashCodeBuilder().append(getLogId()).toHashCode();}@Overridepublic String toString() {return super.toString();}}import com.*.common.model.util.PageObject;/*** <ul>* <li><b>⽬的:</b> <br />* <p>* 实体对象,请勿做客户化操作,对应表:T_OPERATION_LOG 商城对象操作履历表*/public abstract class AbstractTOperationLogDTO extends PageObject{private static final long serialVersionUID = -3633835505537085014L// 表IDprivate ng.String logId;// 操作时间private java.util.Date operateTime;//操作查询结束时间。
用Axis2开发Web Service及客户端在《使用Eclipse的Axis1.4插件开发Web Service及客户端》介绍的Axis是用的Axis1.x,而Axis2是改进版本,进行了重新的设计,应该是Axis的第二代,本文介绍Axis2的使用方法。
/axis2/是Axis2的主页,写这篇文章的时候最新版本是1.5,从/axis2/download/1_5/download.cgi下载axis2-1.5-bin.zip、axis2-1.5-war.zip。
axis2-1.5-war.zip是web发布版本,可以在网页上进行Web Service的动态部署,提供Web Service服务。
解压缩后把axis2.war放到tomcat的webapps下面,启动tomcat,在网页中输入http://localhost:8080/axis2(取决于tomcat的设置)就可以进行操作了。
这方面的资料很多,就不详细介绍了。
下面介绍使用Eclipse插件开发的方法,环境与《使用Eclipse的Axis1.4插件开发Web Service及客户端》的相同。
启动Eclipse后,首先设置Axis2的主目录,需要先解压缩axis2-1.5-bin.zip,然后把解压缩之后的路径填入Eclipse的Window|Preferences|Web Services|Axis2 Preferences的界面上,如下图所示:图1在Eclipse中设置Axis2的runtime建立一个简单的类:package demo.axis; public class User{public String sayHello(String userName){return "hello " + userName;}}把这个类发布为Web Service的步骤与《使用Eclipse 的Axis1.4插件开发Web Service及客户端》中的相同,只是要注意选择Axis2,生成之后的目录结构是:图2生成Web Service后的目录结构但生成之后的项目中缺少.jar文件,可以把%AXIS2-HOME%/lib下的所有文件复制到项目的WEB-INF/lib下面,部署到tomcat就可以运行了,在浏览器中输入http://localhost:8080/Axis2ServerDemo/services/User?wsd l就可以看到发布的Web Service的wsdl了。
最近一个项目需要调用一个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());}}。