一、基于EJB容器管理webservice:
1.首先建立一个Web services EndPoint:
packagecn.test.service.impl;importjava.util.ArrayList;importjava.util.List;importjavax.jws.WebMethod;importjavax.jws.WebService;importcn.test.Person;importcn.test.service.HelloWorld;
@WebServicepublic class HelloWorldImpl implementsHelloWorld {
@WebMethodpublic voidsay() {
System.out.println(" hello service");
}
@WebMethodpublicPerson getPersonById( String id) {
System.out.println(" id = "+id);return new Person("aaa", "123", 5);
}
@WebMethodpublic ListgetAll() {
List list = new ArrayList();for (int i = 0; i < 5; i++) {
list.add(new Person("100"+i, "kk"+i, 12+i));
}returnlist;
}
@WebMethodpublicString insert(Person p) {
System.out.println(p);return p.getId()+"java";
}
}
2. 进入src目录下使用apt编译Hello.java(例:apt -d [存放编译后的文件目录] Hello.java ) ,会生成 jaws目录。例如:D:\dianzi\Test\src>apt -d . cn/test/service/impl/HelloWorldImpl.java
3.使用java Hello.Hello运行,然后将浏览器指向http://localhost:8080/hello?wsdl就会出现下列显示
4.使用wsimport 生成客户端
使用如下:D:\dianzi\Test\src>wsimport -p cn.client -keep http://localhost:8080/helloWorld?wsdl
这时,会在当前目录中生成如下文件:
5.客户端测试:
public classT {public static voidmain(String[] args) {
HelloWorldImplService service= newHelloWorldImplService();
HelloWorldImpl helloWorld=(HelloWorldImpl) service.getHelloWorldImplPort();
System.out.println(helloWorld.getAll().size());
System.out.println(helloWorld.getPersonById(""));
}
}
6、不用生成代码,通过jboss服务器进行管理:
例如下面的类写好之后,发布到服务器上,通过地址 http://127.0.0.1/root/CompanyService?wsdl 就可以查看发布情况,其中“contextRoot”表示根目录,urlPattern表示匹配路径。
@Stateless
@WebService
@WebContext(contextRoot= "/root", urlPattern = "/CompanyService")
@SOAPBinding(style= SOAPBinding.Style.RPC,use=SOAPBinding.Use.LITERAL, parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)public classCompanyWSBean implements CompanyWS {
Logger logger=Logger.getLogger(CompanyWSBean.class);
@EJBprivateCompanyServiceLocal companyServiceLocal;
@WebMethod
@WebResult(partName= "return")publicTBLCompany find(String id) {try{returncompanyServiceLocal.find(id);
}catch(Exception e) {
logger.error(e);
}return null;
}
}
二、将第一种webservice移动到 WEB层,就是通过WEB容器模式管理:
1、准备pojo对像:接口和实现类
开发步骤如下:
建立一个POJO端点--在web.xml中--------将这个POJO端点配置成一个Servlet-----------将这个POJO端点打包成一个应用(war包或ear)
packagecn.test.ws.web.intf;importcom.cjonline.foundation.evisa.entity.TBLOperator;public interfaceHelloWorld {publicString say(String s);publicString eat(String s);publicTBLOperator findOperator();
}
packagecn.test.ws.web.impl;importjavax.jws.WebMethod;importjavax.jws.WebService;importcn.test.ws.web.intf.HelloWorld;importcom.cjonline.comm.util.EJBAssistant;importcom.cjonline.foundation.evisa.entity.TBLOperator;importcom.cjonline.foundation.evisa.exception.ServiceException;importcom.cjonline.foundation.evisa.service.intf.OperatorServiceRemote;
@WebServicepublic class HelloWorldImpl implementsHelloWorld{private OperatorServiceRemote userService =EJBAssistant.getEJB("OperatorServiceBean/remote", OperatorServiceRemote.class);
@WebMethodpublicString say(String s) {
System.out.println(" web say : "+s);return " web say : "+s;
}
@WebMethodpublicString eat(String s) {
System.out.println(" web eat : "+s);return " web eat : "+s;
}
@WebMethodpublicTBLOperator findOperator(){try{return userService.findAll1().get(0);
}catch(ServiceException e) {
e.printStackTrace();
}return null;
}
}
2、在web.xml中将它配置成一个Servlet:
HelloService
cn.test.ws.web.impl.HelloWorldImpl
HelloService
/hello
3、进入到jbossws管理服务中,通过地址 http://lenovo-pc//hello?wsdl可以查看发布的信息,就可以调用方法。
三、使用xfire,我这里使用的是myeclipse集成的xfire进行测试的:
利用xfire开发WebService,可以有三种方法:
1一种是从javabean 中生成;
2 一种是从wsdl文件中生成;
3 还有一种是自己建立webservice
步骤如下:
用myeclipse建立webservice工程,目录结构如下:
首先建立webservice接口,代码如下:
1
packagecom.myeclipse.wsExample;2//Generated by MyEclipse34publicinterfaceIHelloWorldService{56publicString example(String message);78}
接着实现这个借口:
1
packagecom.myeclipse.wsExample;2//Generated by MyEclipse34publicclassHelloWorldServiceImplimplementsIHelloWorldService{56publicString example(String message){7returnmessage;8 }910}
修改service.xml 文件,加入以下代码:
1
2HelloWorldService34 com.myeclipse.wsExample.IHelloWorldService567 com.myeclipse.wsExample.HelloWorldServiceImpl8910literal11application12
把整个项目部署到tomcat服务器中 ,打开浏览器,输入http://localhost:8989/HelloWorld/services/HelloWorldService?wsdl,可以看到如下:
然后再展开HelloWorldService后面的wsdl可以看到:
客户端实现如下:
1
packagecom.myeclipse.wsExample.client;23importjava.net.MalformedURLException;4importjava.net.URL;56importorg.codehaus.xfire.XFireFactory;7importorg.codehaus.xfire.client.Client;8importorg.codehaus.xfire.client.XFireProxyFactory;9importorg.codehaus.xfire.service.Service;10importorg.codehaus.xfire.service.binding.ObjectServiceFactory;1112importcom.myeclipse.wsExample.IHelloWorldService;1314publicclassHelloWorldClient{15publicstaticvoidmain(String[] args)throwsMalformedURLException, Exception{16//TODO Auto-generated method stub17Service s=newObjectServiceFactory().create(IHelloWorldService.class);18XFireProxyFactory xf=newXFireProxyFactory(XFireFactory.newInstance().getXFire());19String url="http://localhost:8989/HelloWorld/services/HelloWorldService";2021try22{2324 IHelloWorldService hs=(IHelloWorldService) xf.create(s,url);25 String st=hs.example("zhangjin");26 System.out.print(st);27 }28catch(Exception e)29{30 e.printStackTrace();31 }32 }3334}35
这里再说点题外话,有时候我们知道一个wsdl地址,比如想用java客户端引用.net 做得webservice,使用myeclipse引用,但是却出现无法通过验证的错误,这时我们可以直接在类中引用,步骤如下:
1
publicstaticvoidmain(String[] args)throwsMalformedURLException, Exception{2//TODO Auto-generated method stub3Service s=newObjectServiceFactory().create(IHelloWorldService.class);4 XFireProxyFactory xf=newXFireProxyFactory(XFireFactory.newInstance().getXFire());567//远程调用.net开发的webservice8Client c=newClient(newURL("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"));9 Object[] o=c.invoke("qqCheckOnline",newString[]{"531086641","591284436"});1011//调用.net本机开发的webservice12Client c1=newClient(newURL("http://localhost/zj/Service.asmx?wsdl"));13Object[] o1=c1.invoke("HelloWorld",newString[]{});1415}
四、使用axis1.4调用webservice方法
前提条件:下载axis1.4包和tomcat服务器 ,并将axis文件夹复制到tomcat服务器的webapp文件夹中
这里我就说一下最简单的方法:
首先建立一个任意的java类(例如:HelloWorld.java),复制到axis文件夹下,将其扩展名改为jws,然后重新启动tomcat,在浏览器中输入http://localhost:8989/axis/HelloWorld.jws?wsdl,就会得到一个wsdl文件,其客户端调用方法如下:
1
importjavax.xml.rpc.Service;2importjavax.xml.rpc.ServiceException;3importjavax.xml.rpc.ServiceFactory;45importjava.net.MalformedURLException;6importjava.net.URL;7importjava.rmi.RemoteException;89importjavax.xml.namespace.QName;1011publicclassTestHelloWorld{121314publicstaticvoidmain(String[] args)throwsMalformedURLException, ServiceException, RemoteException{15//TODO Auto-generated method stub1617 String wsdlUrl="http://localhost:8989/axis/HelloWorld.jws?wsdl";18 String nameSpaceUri="http://localhost:8989/axis/HelloWorld.jws";19 String serviceName="HelloWorldService";20 String portName="HelloWorld";2122 ServiceFactory serviceFactory=ServiceFactory.newInstance();23 Service afService=serviceFactory.createService(newURL(wsdlUrl),newQName(nameSpaceUri, serviceName));24 HelloWorldInterface proxy=(HelloWorldInterface)afService.getPort(newQName(nameSpaceUri, portName),HelloWorldInterface.class);25 System.out.println("return value is"+proxy.getName("john") ) ;2627 }2829}30
五、使用axis2开发webservice
使用axis2 需要先下载
axis2-1.4.1-bin.zip
axis2-1.4.1-war.zip
同理,也需要将axis2复制到webapp目录中
在axis2中部署webservice有两种方法,
第一种是pojo方式,这种方式比较简单,但是有一些限制,例如部署的类不能加上包名
第二种方式是利用xml发布webservice,这种方法比较灵活,不需要限制类的声明
下面分别说明使用方法:
1.pojo方式:在Axis2中不需要进行任何的配置,就可以直接将一个简单的POJO发布成WebService。其中POJO中所有的public方法将被发布成WebService方法。先实现一个pojo类:
1
publicclassHelloWorld{2publicString getName(String name)3{4return"你好"+name;5 }6publicintadd(inta,intb)7{8returna+b;9 }10}11
由于这两个方法都是public类型,所以都会发布成webservice。编译HelloWorld类后,将HelloWorld.class文件放到%tomcat%\webapps\axis2\WEB-INF\pojo目录中(如果没有pojo目录,则建立该目录),然后打开浏览器进行测试:输入一下url:
会列出所有webservice
这是其中的两个webservice列表,接着,在客户端进行测试:
首先可以写一个封装类,减少编码,代码如下:
1
packageMZ.GetWebService;2importjavax.xml.namespace.QName;34importorg.apache.axis2.AxisFault;5importorg.apache.axis2.addressing.EndpointReference;6importorg.apache.axis2.client.Options;7importorg.apache.axis2.rpc.client.RPCServiceClient;8910publicclassGetWSByAxis2{11privatestaticString EndPointUrl;12privatestaticString QUrl="http://ws.apache.org/axis2";13privateQName opAddEntry;14publicString WSUrl;15publicRPCServiceClient setOption()throwsAxisFault16{17 RPCServiceClient serviceClient=newRPCServiceClient();18 Options options=serviceClient.getOptions();19 EndpointReference targetEPR=newEndpointReference(WSUrl);20 options.setTo(targetEPR);21returnserviceClient;22 }2324publicQName getQname(String Option){2526returnnewQName (QUrl,Option);27 }28//返回String29publicString getStr(String Option)throwsAxisFault30{31 RPCServiceClient serviceClient=this.setOption();3233 opAddEntry=this.getQname(Option);3435 String str=(String) serviceClient.invokeBlocking(opAddEntry,36newObject[]{},newClass[]{String.class})[0];37returnstr;38 }39//返回一维String数组40publicString[] getArray(String Option)throwsAxisFault41{42 RPCServiceClient serviceClient=this.setOption();4344 opAddEntry=this.getQname(Option);4546 String[] strArray=(String[]) serviceClient.invokeBlocking(opAddEntry,47newObject[]{},newClass[]{String[].class})[0];48returnstrArray;49 }50//从WebService中返回一个对象的实例51publicObject getObject(String Option,Object o)throwsAxisFault52{53 RPCServiceClient serviceClient=this.setOption();54 QName qname=this.getQname(Option);55 Object object=serviceClient.invokeBlocking(qname,newObject[]{},newClass[]{o.getClass()})[0];56returnobject;57 }5859/ 读者可以自己封装数据类型,如int,byte,float等数据类型60}61
客户端调用方法:
MZ.GetWebService.GetWSByAxis2 ws=newMZ.GetWebService.GetWSByAxis2();
ws.WSUrl="http://localhost:8989/axis2/services/HelloWorld";
HelloWorld hello=(HelloWorld)ws.getObject("getName", HelloWorld.class);
System.out.println(hello.getName("zhangjin"));
2.使用service.xml发布webservice,这种方式和直接放在pojo目录中的POJO类不同。要想将MyService类发布成Web Service,需要一个services.xml文件,这个文件需要放在META-INF目录中,该文件的内容如下:
HelloWorld webservice
service.HelloWorld
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
其中元素用于发布Web Service,一个元素只能发布一个WebService类,name属性表示WebService名,如下面的URL可以获得这个WebService的WSDL内容:
1
23 HelloWorld service456 service.HelloWorld789101112class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>141516
如果要发布多个webservice,可以在文件两段加上...发布