上海门户网站论坛,wordpress 本地文章,专业的培训行业网站模板,网站备案多久可以注销简介 WebService是一种服务的提供方式#xff0c;通过WebService#xff0c;不同应用间相互间调用变的很方便#xff0c;网络上有很多常用的WebService服务#xff0c;如#xff1a;http://developer.51cto.com/art/200908/147125.htm#xff0c;不同的语言平台对…简介 WebService是一种服务的提供方式通过WebService不同应用间相互间调用变的很方便网络上有很多常用的WebService服务如http://developer.51cto.com/art/200908/147125.htm不同的语言平台对WebService都有实现Java的WebService实现比较流行的有Axis2、Jaxws本文介绍的是Axis2。 Axis2下载和部署 Axis2是Apache开发的一个开源项目再次感叹Apache的伟大 下载地址 http://mirror.bit.edu.cn/apache//axis/axis2/java/core/1.6.2/axis2-1.6.2-war.zip 将其内axis2.war解压到Tomcat安装目录/webapps下启动Tomcatwar包会自动解压 访问http://localhost:8080/axis2/如果看到欢迎主页则说明部署成功。 配置Axis2 Tomcat安装目录/webapps/axis2/WEB-INF/conf/axis2.xml配置其内两个属性以便调试。 [html] view plaincopy print? parameter namehotdeploymenttrue/parameter!-- 开启热部署不需要重启即可部署服务 -- parameter namehotupdatetrue/parameter!-- 开启热更新不需要重启即可更新服务 -- 编写服务 所谓服务就是编写一个类写一些方法方法返回数据WebService客户端获取数据。 [java] view plaincopy print? public class HelloService { public String sayHello() { return hello; } } 0配置POJO发布服务 服务类创建好后我们需要发布到服务器上将HelloService.class放到Tomcat安装目录/webapps/axis2/WEB-INF/pojo下pojo没有需要创建。 至此我们已经成功的创建了一个WebService服务了so easy 再次访问http://localhost:8080/axis2/点击Services可以发现可用services中多了一个HelloService其内有一个可用操作sayHello说明发布成功。 [java] view plaincopy print? HelloService Service Description : No description available for this service Service EPR : http://localhost:8080/axis2/services/HelloService Service Status : Active Available Operations sayHello 访问http://localhost:8080/axis2/services/HelloService页面输出正是我们的返回值。 [html] view plaincopy print? ns:sayHelloResponse xmlns:nshttp://ws.apache.org/axis2 returnhello/return /ns:sayHelloResponse 这里有两点需要注意 - POJO发布的类不能放在包里既不能使用package关键字 - 默认的发布目录是pojo可以在Tomcat安装目录/webapps/axis2/WEB-INF/conf/axis2.xml中增加目录 [html] view plaincopy print? deployer extension.class directory要增加的目录名称 classorg.apache.axis2.deployment.POJODeployer / 要注意多个目录见WebService要唯一否则会重名重名后先部署的会成功后部署的会报错。 services.xml配置文件发布服务 虽然POJO的方式不需要配置文件但是其服务类不能放在包内显然是不符合我们日常开发的Axis2也允许带包的类发布WebService如果不允许估计就没人用了。 首先写一个较复杂的服务类多个方法带参数有返回值的。 [java] view plaincopy print? package webservice.test; /** * 计算器运算 * * author gaoshuang */ public class CalculateService { // 加法 public float plus(float x, float y) { return x y; } // 减法 public float minus(float x, float y) { return x - y; } // 乘法 public float multiply(float x, float y) { return x * y; } // 除法 public float divide(float x, float y) { if (y ! 0) return x / y; else return -1; } } 然后编写services.xml该文件需要放在META-INF文件夹下。 [html] view plaincopy print? ?xml version1.0 encodingUTF-8? !-- 服务名称 -- service nameCalculateService !-- 服务描述 -- description 加减乘除计算服务 /description !-- 设置服务类 -- parameter nameServiceClass com.runqianapp.webservice.test.CalculateService /parameter !-- 方法 -- operation nameplus !-- 方法处理器RPCMessageReceiver为带返回值的处理器 RPCInOnlyMessageReceiver为不带返回值的处理器 -- messageReceiver mephttp://www.w3.org/2004/08/wsdl/in-out classorg.apache.axis2.rpc.receivers.RPCMessageReceiver / /operation operation nameminus messageReceiver mephttp://www.w3.org/2004/08/wsdl/in-out classorg.apache.axis2.rpc.receivers.RPCMessageReceiver / /operation operation namemultiply messageReceiver mephttp://www.w3.org/2004/08/wsdl/in-out classorg.apache.axis2.rpc.receivers.RPCMessageReceiver / /operation operation namedivide messageReceiver mephttp://www.w3.org/2004/08/wsdl/in-out classorg.apache.axis2.rpc.receivers.RPCMessageReceiver / /operation /service 最后将这两个文件打成jar包不论用工具还是手动打打的都是最外层的文件夹。 我打的名字是server.jar更改后缀为aar所以最后是server.aarAxis2建议使用aar发布WebService 将server.aar放到Tomcat安装目录/webapps/axis2/WEB-INF/services下访问http://localhost:8080/axis2/services/listServices 多出了一个CalculateService说明发布成功。 [java] view plaincopy print? CalculateService Service Description : CalculateService Service EPR : http://localhost:8080/axis2/services/CalculateService Service Status : Active Available Operations divide plus minus multiply 分别访问 http://localhost:8080/axis2/services/CalculateService/plus?x1y2 http://localhost:8080/axis2/services/CalculateService/divide?x1y2 http://localhost:8080/axis2/services/CalculateService/minus?x1y2 http://localhost:8080/axis2/services/CalculateService/multiply?x1y2 也可以发布多个WebService可以使用serviceGroup标签。 [html] view plaincopy print? serviceGroup service namemyService1 ... /service service namemyService2 ... /service /serviceGroup 客户端实现 以上介绍的都是WebService服务创建及发布那么有了一个WebService服务后我们如何调用呢只在浏览器上访问是没有意义的。 下载Axis2客户端压缩包http://mirror.esocc.com/apache//axis/axis2/java/core/1.6.2/axis2-1.6.2-bin.zip并解压。 新建工程WebServiceClientTest将Axis2客户端安装目录/lib下所有jar包添加到工程中 编写客户端代码 [java] view plaincopy print? package webservice.client.test; import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; public class Client1 { /** * param args * throws AxisFault */ public static void main(String[] args) throws AxisFault { // 使用RPC方式调用WebService RPCServiceClient serviceClient new RPCServiceClient(); Options options serviceClient.getOptions(); // 指定调用WebService的URL EndpointReference targetEPR new EndpointReference( http://localhost:8080/axis2/services/CalculateService); options.setTo(targetEPR); // 调用方法的参数值 Object[] entryArgs new Object[] {1, 2}; // 调用方法返回值的数据类型的Class对象 Class[] classes new Class[] { float.class }; // 调用方法名及WSDL文件的命名空间 // 命名空间是http://localhost:8080/axis2/services/CalculateService?wsdl中wsdl:definitions标签targetNamespace属性 QName opName new QName(http://test.webservice, plus); // 执行方法获取返回值 // 没有返回值的方法使用serviceClient.invokeRobust(opName, entryArgs) Object result serviceClient.invokeBlocking(opName, entryArgs, classes)[0]; System.out.println(result); // out: 3.0 } } 以上是实现了一个简单的WebSerivce客户端调用CalculateService中的plus方法由代码可见这种调用方式比较杂乱代码不太友好。 wsdl2java简化客户端 Axis2客户端安装目录/bin目录其内有两个batwsdl2java.bat和java2wsdl.bat可以实现WSDL文件和Java之间的互相转换。 考虑到我们以后可能经常使用这些命令设置环境变量方便以后调用。在系统变量中加入AXIS2_HOMEAxis2客户端安装目录path中追加;%AXIS2_HOME%\bin。 启动命令提示符进入WebServiceTestClient所在目录运行 [plain] view plaincopy print? wsdl2java -uri http://localhost:8080/axis2/services/CalculateService?wsdl -p webservice.client.test -s 参数说明uri - wsdl文件路径网络路径或本地路径p - 打包这里和上一个客户端实现类打在了一个包里wsdl2java有很多参数详细可以运行该命令去查看。 执行后如果没有报错说明运行成功刷新项目该包下多出了一个CalculateServiceStub类里面的代码极其复杂还乱呼呼的这我们不用管调用该类。 [java] view plaincopy print? package webservice.client.test; import java.rmi.RemoteException; import webservice.client.test.CalculateServiceStub.Plus; public class Client2 { /** * param args * throws RemoteException */ public static void main(String[] args) throws RemoteException { CalculateServiceStub stub new CalculateServiceStub(); Plus plus new Plus(); plus.setX(1); plus.setY(2); float result stub.plus(plus).get_return();// 返回值自动转型这也是强大之处 System.out.println(result); } } 如此做的好处就是调用时不需要在去查看WSDL和正常使用一个类一样对WebService的封装都由wsdl2java自动生成代码更优雅、简洁。 利用wsdl2java轻松使用第三方WebService服务 有了wsdl2java已知一个WSDL文件我们就可以轻松的生成WebService客户端供我们调用给我们服务。文章开头给出的链接包含了一些第三方服务有一个服务是生成随机个数中文WSDLhttp://www.webxml.com.cn/WebServices/RandomFontsWebService.asmx?wsdl同样启动命令提示符进入项目路径执行 [plain] view plaincopy print? wsdl2java -uri http://www.webxml.com.cn/WebServices/RandomFontsWebService.asmx?wsdl -p webservice.client.test -s 调用该类 [java] view plaincopy print? package webservice.client.test; import java.rmi.RemoteException; import webservice.client.test.RandomFontsWebServiceStub.ArrayOfString; import webservice.client.test.RandomFontsWebServiceStub.GetChineseFonts; public class ThirdClient { /** * param args * throws RemoteException */ public static void main(String[] args) throws RemoteException { RandomFontsWebServiceStub stub new RandomFontsWebServiceStub(); GetChineseFonts getChineseFonts new GetChineseFonts(); getChineseFonts.setByFontsLength(10);// 免费使用有限制最多8个 ArrayOfString result stub.getChineseFonts(getChineseFonts).getGetChineseFontsResult(); for(String str : result.getString()) { System.out.println(str); } } } 转载于:https://www.cnblogs.com/wlming/p/5466288.html