




已阅读5页,还剩53页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java与net编写的webservice互调最近由于开发工作中用到了webservice,特意研究了一下,为了不使自己忘记,也为了其他正在寻找相关资料的朋友少走弯路,简单记录了一下,以供大家参考。简单的说:webservice是远程服务器上暴露出来的一些函数接口,通过调用它,即可在客户端展现服务端执行的结果。这里只探讨webservice服务端和客户端用java或.net编写的情况,这又分为四种类型:1、 服务端、客户端都是用.net编写的,这里以为例。2、 服务端、客户端都是用java编写的。3、 服务端是java编写的,客户端是.net编写的。4、 服务端是.net编写的,客户端是java编写的。开发环境:jdk1.6 + eclipse3.6 + 2010下面对这四种类型的编写方法一一详细讲解。一、 服务端、客户端都是用.net编写的。选择“新建项目”,如下图:添加一个webservice,如下图:V默认会添加一个HelloWorld方法,替换成如下函数。WebService1.asmx _ Public Function HelloWorld(ByVal Name As String) As String Return Hi, + Name + ,这是.net WebService,21的系统时间为 + Now.ToString(yyyy-MM-dd HH:mm:ss)End Function在“解决方案资源管理器”上选中WebService.asmx,点击右键,将WebService1.asmx设为“起始页”,如下图:按F5运行,.net 编写的webservice就编写好了,怎么样,很简单吧。以上只是服务端,现在还需要一个客户端来验证一下。选择新建一个空项目,如下图在解决方案资源管理器,右键选择添加Web引用出现如下画面在URL栏输入如下信息报错,这是怎么回事呢?原来是需要在IIS上进行登记,在Internet信息服务添加虚拟目录,如下图好了,这下不报错了。目录结构如下:再选择“添加”-“添加新建项”,添加一个webform1.aspx,如下图:在web窗体添加一个button和textbox加入如下button事件 Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click Dim s As New WebReference.WebService1 TextBox1.Text = s.HelloWorld(帅哥) End Sub在IIS上添加上客户端的目录MyCallNetService,步骤请参考上面的操作,操作后如下图现在可以执行看看结果了,在浏览器上键入点击按钮,出现下图:可以看到,执行的结果完全正确。还有一点需要提到的:在VS.net 2010已经找不到直接创建WebService的模板方式了, 如果你选择 .NET 4.0,会发现缺少了ASP.NET Web Services 模板。VS.net 2008的操作见下图:如果还想在VS.net 2010实现VS.net 2008的功能,那还可以吗?答案是肯定的,选择“新建项目”,如下图:二、 服务端、客户端都是用java编写的。使用java编写webservice的方法比较多,常用的有JAX_WS、XFire、AXIS2、CXF,下面一一示例。1) JAX_WS首先编写提供服务方法的类HelloWorld.javapackage hnntsx.xuzhe;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;/wsgen -cp bin hnntsx.xuzhe.HelloWorld -wsdl -s src -d bin -r .WebService(targetNamespace = )SOAPBinding(style = SOAPBinding.Style.DOCUMENT)public class HelloWorld WebMethod(action=toSayHello,operationName=toSayHello,exclude=false) WebResult(name=returnWord)/自定义该方法返回值在WSDL中相关的描述 public String sayHello(WebParam(name=userName)String userName) returnHello: + userName + 21; WebMethod public int getExp(int i, int j) return i / j; 接着使用wsgen工具自动生成服务端代码,并且产生可以生成客户端的wsdl文件,例如:在dos命令提示符,转到当前项目目录下,执行如下命令生成wsdl文件wsgen -cp bin hnntsx.xuzhe.HelloWorld -wsdl -s src -d bin -r .-cp定义classpath-wsdl生成wsdl文档-s源文件所在路径,本例为src-d生成文件class文件所在路径,本例为bin-r 生成wsdl路径,本例为当前路径.以上命令会在特定目录下默认生成一个jaxws的目录,里面有webservice暴露的方法的具体描述。结构如下:接下来发布WebService的程序StartService.javapackage hnntsx.xuzhe;import javax.xml.ws.Endpoint;/java hnntsx.xuzhe.StartServicepublic class StartService public static void main(String args) Endpoint.publish(21:8999/webservice/hws, new HelloWorld(); 在dos命令提示符,转到bin目录执行这个程序,java hnntsx.xuzhe.StartService目录不正确会报错提示“找不到class文件”执行正确画面如图:注意:必须先要启动webservice,否则无法用wsimport生成代理类。用wsimport自动生成客户端的代码即可实现调用webservice。wsimport -keep -d ./bin -s ./src -p webService.serv 21:8999/webservice/hws?wsdl用wsimport也可以生成.net 构建的webservice客户端程序,比如下面格式:wsimport -keep -d ./bin -s ./src -p webService.serv 24/MyWebService/Service1.asmx?wsdl-d 生成客户端执行类的 class 文件的存放目录 -s 生成客户端执行类的源文件的存放目录 -p 定义生成类的包名,本例为webService.serv21:8999/webservice/hws?wsdl为WSDL_URI将在webService.serv目录下生成代理类,这里还有个小技巧,通过修改HelloWorldService.java可以实现动态配置文件来调用webservice。我们打开HelloWorldService.java来看看他的内容,最重要的是下面几行:static URL url = null; try URL baseUrl; baseUrl = webService.serv.HelloWorldService.class.getResource(.); url = new URL(baseUrl, 21:8999/webservice/hws?wsdl); catch (MalformedURLException e) logger.warning(Failed to create URL for the wsdl Location: 21:8999/webservice/hws?wsdl, retrying as a local file); logger.warning(e.getMessage(); HELLOWORLDSERVICE_WSDL_LOCATION = url;可以看到 url = new URL(baseUrl, 21:8999/webservice/hws?wsdl);这一行记录的是webservice的地址,只要修改这个程序将他改成从配置文件读取,即大功告成了,代码如下:读取配置文件PropertiesConfig.javapackage webPack.serv;import java.io.FileInputStream;import java.util.Properties;public class PropertiesConfig public static String site; public static String getSite() Properties p = new Properties();tryp.load(new FileInputStream(./conf/perties);catch(Exception e)e.printStackTrace();site = p.getProperty(webservice_site);return site;Conf目录下perties配置如下行:webservice_site = 24/MyWebService/Service1.asmx修改后的HelloWorldService.java文件内容static URL url = null; String str = PropertiesConfig.getSite();/新增 try URL baseUrl; baseUrl = webPack.serv.XuzheService.class.getResource(.); url = new URL(baseUrl,str+?wsdl);/修改 catch (MalformedURLException e) logger.warning(Failed to create URL for the wsdl Location: 24/MyWebServiceService1.asmx?wsdl, retrying as a local file); logger.warning(e.getMessage(); XUZHESERVICE_WSDL_LOCATION = url; 这下就可以实现动态调用webservice了,如果你不想动态调用,直接使用java自动生成的 HelloWorldService.java就可以了。最后写个客户端ClientRun.java去调用这个webservice。package hnntsx.xuzhe;import webService.serv.*; /必须加上这个,否则会报错/*调用java编写的web service * * param args * java hnntsx.xuzhe.ClientRun */public class ClientRun public static void main(String args) HelloWorldService hws = new HelloWorldService(); webService.serv.HelloWorld hw=hws.getHelloWorldPort(); System.out.println(hw.getExp(100, 25); System.out.println(hws.getHelloWorldPort().toSayHello(hi,帅哥); 执行结果如下:需要注意的是:SOAPBinding(style = SOAPBinding.Style.DOCUMENT)不能是:SOAPBinding(style = SOAPBinding.Style.RPC)否则程序会抱错。原本想着正常运行了,通过eclipse开发工具run as 却报错了,错误信息如下:Exception in thread main java.lang.IllegalStateException: Could not initialize Service.at org.codehaus.xfire.jaxws.ServiceDelegate.(ServiceDelegate.java:77)at org.codehaus.xfire.jaxws.Provider.createServiceDelegate(Provider.java:32)at javax.xml.ws.Service.(Unknown Source)at webService.serv.HelloWorldService.(HelloWorldService.java:46)at hnntsx.xuzhe.ClientRun.main(ClientRun.java:13)Caused by: java.lang.NoSuchMethodException: webService.serv.HelloWorldService.getPortClassMap()at java.lang.Class.getMethod(Unknown Source)at org.codehaus.xfire.jaxws.ServiceDelegate.(ServiceDelegate.java:60). 4 more找了很长时间,终于从网上找到了解决方案。原来是xfire-all-1.2.6.jar惹的祸,从build path中去掉这个包,故障解除,怀疑是XFire与JAX_WS有冲突,标记一下。2) XFIRE另外再介绍一种使用XFire包编写服务端和客户端的方法。服务端:先编写接口程序FlexWebService.javapackage com.unutrip.remoting.ws;import java.util.Collection;public interface FlexWebService public abstract String helloWord(String username, String country);public abstract Collection getList();再编写实现类FlexWebServiceImpl.javapackage com.unutrip.remoting.ws;import java.util.ArrayList;import java.util.Collection;/* * * * author longgangbai * */public class FlexWebServiceImpl implements FlexWebService /* (non-Javadoc) * see com.unutrip.remoting.ws.FlexWebService#helloWord(java.lang.String, java.lang.String) */public String helloWord(String username, String country) String result = ;if (country = null | country.trim().length() = 0) result = hi , + username; else result = Hello , + username;return result;/* (non-Javadoc) * see com.unutrip.remoting.ws.FlexWebService#getList() */public Collection getList() Collection infos = new ArrayList();for (int i = 0; i File - Other - Axis2 wizards - Axis2 Services Archiver ,按照向导选择刚建立的类编译后的 class 文件。 (1)选择 class 文件目录,注意,不是 java 源文件,而是 classes 目录,这里需要注意由于你的类是带包hnntsx的,因此不要选到包这个目录。 (2)连按两次 “Next” ,选中 “Generate the service xml automatically”(3)按下一步,输入 service 名称和类名,我这里输入的服务名是:HelloService,类名是我们刚刚写的类名:hnntsx.xuzhe.Hello,这里需要注意加入完整的包名。(4) 按下一步,输入 service 文件的保存路径和文件名,完成。出现如下画面代表成功。我这里选择的是当前项目,然后将生成的helloservice.aar拷贝到C:apache-tomcat-7.0.6webappsaxis2WEB-INFservices目录下,也可以选择生成目录为刚才TOMCAT的AXIS2目录:C:apache-tomcat-7.0.6webappsaxis2WEB-INFservices,这样就不需要再拷贝了。在services.list中,添加HelloWorld.aar运行tomcat,在http:/localhost:8080/axis2/services/listServices中会看到发布的WebService如果不是借用AXIS2的目录,想重新建一个项目,可以如下操作:在Eclipse下新建Web Project,工程名:webservice_axis2_server。新建包hnntsx.xuzhe,新建类HelloWorld,代码如下:package com.cm.service;public class HelloWorld public String sayHello(String name)return Hello, +name+.;public String saySorry(String name)return Sorry,+name+.;public String getWorld()return Hello,World;在WEB-INF目录下修改web.xml文件,内容如下:AxisServletorg.apache.axis2.transport.http.AxisServlet1 AxisServlet /services/* index.jsp 把tomcat安装目录下的webapps/axis2/WEB-INF下的modules、service、conf、lib文件拷至项目下的WEB-INF目录下。然后在services下新建HelloWorld/META-INF路径,META-INF下新建services.xml,内容如下: HelloWorld Service Example hnntsx.xuzhe.HelloWorld 最后将项目下的web-inf目录整个都拷贝到TOMCAT新建的文件夹webservice_axis2_server下,classes也拷贝到webservice_axis2_server下,结构图如下:启动tomcat后访问:8080/webservice_axis2_server/services/HelloWorld?wsdl能看到类似如下图就说明发布service成功了。到此Axis2的WebService服务已成功发布客户端客户端的访问方式有两种:一种是通过服务器端产生的wsdl文件利用WSDL2Java工具生成Client Stub后访问,另外一种是通过axis实现的java里面的JAX-RPC进行动态调用,下面一一进行介绍。第一种方法是使用自动生成客户端stub的方式,具体步骤如下:转到C:axis2-1.6.2bin目录下,运行以下命令:WSDL2Java -uri 10:8080/axis2/services/HelloService?wsdl -p hnntsx.xuzhe -o build -d adb s会生成一个build目录Build目录下的文件结构图如下:将这个文件拷贝到前面的java项目中,见下图:编写测试客户端程序,代码如下:public static String callwebservice() try HelloServiceStub stub = new HelloServiceStub(10:8080/axis2/services/HelloService);SayHello sayHello = new SayHello();sayHello.setUser(xuzhe);SayHelloResponse res = stub.sayHello(sayHello);String result = res.get_return().toString();System.out.println(result);return result; catch (Exception e) e.printStackTrace();return null;在eclipse中选择run As java application,显示结果如下:第二种方法是远程方法调用方式,这种方式的最大好处是灵活,不需要太多生成步骤,直接附上代码:package hnntsx.xuzhe;import hnntsx.xuzhe.HelloServiceStub.SayHello;import hnntsx.xuzhe.HelloServiceStub.SayHelloResponse;import hnntsx.xuzhe.HelloServiceStub;import space.QName;import org.apache.axis2.addressing.EndpointReference;import org.apache.axis2.client.Options;import org.apache.axis2.rpc.client.RPCServiceClient;/* * author: 徐哲 hnfh-xuz * E-mail: * version: V * 创建时间: 2013-6-3 下午02:49:04 * 类说明: */public class AXIS2CallWebService public static void main(String args) callwebservice();CallAXIS2Service();public static String CallAXIS2Service() String xml = null;/ 调用AXIS2服务端 String url = 10:8080/axis2/services/HelloService;String method = sayHello;String xmlStr = 徐哲;long start = System.currentTimeMillis();try RPCServiceClient serviceClient = new RPCServiceClient();Options options = serviceClient.getOptions();EndpointReference targetEPR = new EndpointReference(url);options.setTo(targetEPR);/ 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL文件的命名空间名,也就是元素的targetNamespace属性值/ 调用JAX-WS服务端 参数不能传入QName opAddEntry = new QName(http:/xuzhe.hnntsx, method);/ 参数,如果有多个,继续往后面增加即可,不用指定参数的名称Object opAddEntryArgs = new Object xmlStr ;/ 返回参数类型,这个和axis1有点区别/ invokeBlocking方法有三个参数,其中第一个参数的类型是QName对象,表示要调用的方法名;/ 第二个参数表示要调用的WebService方法的参数值,参数类型为Object;/ 第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class。/ 当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object/ 如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,/ 该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同Class classes = new Class String.class ;xml = (String) serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes)0;System.out.println(xml); catch (Exception e) e.printStackTrace();long end = System.currentTimeMillis();System.out.println(客户端调用AXIS2 webservice所需时间: + (end - start) + ms);return xml;public static String CallJAXWSService() String xml = null;/ 调用JAX-WS服务端 参数不能传入String url = 10:8990/webservice/hws;String method = toSayHello;String xmlStr = 徐哲;long start = System.currentTimeMillis();try RPCServiceClient serviceClient = new RPCServiceClient();Options options = serviceClient.getOptions();Endp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校内德育工作方案
- 新疆师范大学《BM概论与实训》2024-2025学年第一学期期末试卷
- 2025-2030旅游饭店行业技术应用与创新趋势研究报告
- 2025-2030年亚麻坯布市场市场现状供需分析及投资评估规划分析研究报告
- 西安城市建设职业学院《ERP原理及其应用》2024-2025学年第一学期期末试卷
- 湖北生态工程职业技术学院《学前教育社会学》2024-2025学年第一学期期末试卷
- 南昌航空大学《数字图像处理与计算机视觉含实验》2024-2025学年第一学期期末试卷
- 陕西电子信息职业技术学院《文献检索与科技论文写作》2024-2025学年第一学期期末试卷
- 江南大学《教育政策与领导》2024-2025学年第一学期期末试卷
- 郑州铁路职业技术学院《景区规划设计》2024-2025学年第一学期期末试卷
- 2025至2030年中国互联网数据中心应用行业市场深度评估及投资战略规划报告
- 八师兵团职工考试题库及答案
- 2025临时工合同协议书模板
- 2025年学习贯彻全国教育大会精神网络培训考试答案
- 推拿学基础题库及答案
- 水利工程档案验收项目法人自检工作报告
- 工资管理课件
- 电商客服培训 课件
- 2025社区治理一表通应用规范
- 中国古诗词歌曲课件
- GB/T 26148-2025高压水射流清洗作业安全规范
评论
0/150
提交评论