WebService几种实现方式
WebService使得运行在不同机器上的应用无需借助附加的、专门的第三方软件即可进行数据交换或集成,由于其与平台、编程语言、协议的无关性,它是目前应用程序间最常用的一种通讯方式,要学习WebService,首先要了解与其相关的几种关键技术和规则。 在构建和使用Web Service时,主要用到以下几个关键的技术和规则: ? 目前比较流行的webservice的实现方式大致有四种,包括JWS、axis2、XFire和CXF。本文主要介绍前两种方法。 1、JWS是jdk1.6之后新增的对webservice的支持,下面通过一个简单的例子学习通过JWS实现webservice服务器端和客户端的过程。 (1)定义接口,并将接口发布成webservice package com.web.service; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import com.model.User; @WebService @SOAPBinding(style = SOAPBinding.Style.RPC) public interface IMyService { @WebResult(name="Result") public int add(@WebParam(name="a")int a,@WebParam(name="b")int b); @WebResult(name="User") public User login(@WebParam(name="username")String username,@WebParam(name="password")String password); } ? (2)实现该接口 package com.web.service; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import com.model.User; @WebService(endpointInterface="com.web.service.IMyService") public class MyServiceImpl implements IMyService { @Override public int add(int a,int b) { System.out.println(a + "+" + b + "=" + (a + b)); return a+b; } @Override public User login(@WebParam(name = "username") String username,@WebParam(name = "password") String password) { System.out.println(username + " is logging"); User user = new User(); user.setId("1"); user.setUsername(username); user.setPassword(password); return user; } }
package com.web.service; import javax.xml.ws.Endpoint; public class MyServer { public static void main(String[] args){ String address = "http://localhost:8888/ns"; Endpoint.publish(address,new MyServiceImpl()); } }
package com.web.service; import java.net.MalformedURLException; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; public class TestClient { public static void main(String[] args){ try { //创建访问WSDL服务地址的URL URL url = new URL("http://localhost:8888/ns?wsdl"); //通过QName指明服务的和具体信息 QName sname= new QName("http://service.web.com/","MyServiceImplService"); //创建服务 Service service = Service.create(url,sname); //实现接口 IMyService ms =service.getPort(IMyService.class); System.out.println(ms.add(10,25)); IMyService ms1 = service.getPort(IMyService.class) ; ms1.login("xiaoli","12345"); } catch (MalformedURLException e) { e.printStackTrace(); } } } 从上面的例子中可以看到,系统间进行webservice调用时,需要知道对方的接口和实现类。但在实际中,调用方往往不知道对方的接口和实现类。这时,可以通过jdk的导出功能来解决,将wsdl中的接口描述来生成这个接口以及实现类,然后将生成的接口和实现类应用在我们自己的java程序中就可以了,具体的生成命令是: Wsimport -d E:/我的工程/java项目/webservice/? -keep -verbose?http://localhost:8888/ns?wsdl?。 ? 2、JWS是轻量级的实现,使用较方便,如果确定是Java语言所编写的应用程序之间的调用,JWS是最佳选择。与JWS相比,axis2则是一种重量级的框架,不过其功能也更强大,它不仅能完成Java语言环境中webservice客户端和服务端,还可以生成其他语言中的webservice客户端和服务端,下面一起来学习一下通过axis2发布webservice。 (1) 首先需要下载axis2.war包,将其放在tomcat的webapp目录下。启动tomcat,访问http://localhost:8080/axis2/,显示如下界面则说明发布成功: ? (2)编写实现具体功能的Java类,主要类不要放在包中,放在src下 public class MyService { public String sayHello(String name,boolean isMan) { if(isMan) { return "Hello,Mr "+name+"! Welcome to Webservice"; } else { return "Hello,Miss "+name+"! Welcome to Webservice"; } } } (3)将我们写好的class类放在tomcat%webappsaxis2WEB-INFpojo文件夹下(如果没有该文件夹请新建一个并以pojo命名)。做完这一步之后启动tomcat,访问http://localhost:8080/axis2/services/listServices,如果出现如下界面则说明发布成功: package com.unimas.datacollection.webservices.client; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; import javax.xml.namespace.QName; public class Client { public static void main(String[] args) throws Exception { // 使用RPC方式调用WebService RPCServiceClient serviceClient = new RPCServiceClient(); Options options = serviceClient.getOptions(); // 指定调用WebService的URL EndpointReference er = new EndpointReference( "http://localhost:8080/axis2/services/MyService"); options.setTo(er); // 指定sayHello方法的参数值 Object[] opAddArgs = new Object[] { "张三",false }; // 指定sayHello方法返回值的数据类型的class对象 Class[] classs = new Class[] { String.class }; // 指定要调用的sayHello方法及wsdl文件的命名空间,第一个参数表示WSDL文件的命名空间 // 通过访问http://localhost:8080/axis2/services/MyService?wsdl 就可以看见 // 元素的targetNamespace属性值 QName qname = new QName("http://ws.apache.org/axis2","sayHello"); // 调用sayHello方法并输出该方法的返回值 // 这里有三个参数的意思:1.是QName对象,表示要调用的方法名;2.webservice的参数值,参数类型是Object[];3.返回值class对象,参数类型是Class[] System.out.println(serviceClient.invokeBlocking(qname,opAddArgs,classs)[0]); } }通过执行客户代码,即可在控制台中输出结果,这就是通过axis2实现webservice的整个过程。两种方法进行比较,可以发现第一种实现功能较灵活 ,第二种比较简单,我们只需开发一个Java类,然后放在相应文件夹下即可。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |