首先,在服务端程序中编写提供服务的接口,以及接口中方法要调用或要返回的javabean对象(必须序列化),当然还有实现接口的类,不过不用写具体处理过程。
<o:p> </o:p>
package com.interfacepackge;<o:p></o:p> public interface ServerProtInterface {<o:p></o:p> public GoPO getElement(GoVO vo);}<o:p></o:p> |
import java.io.Serializable;<o:p></o:p> public class GoPO implements Serializable{<o:p></o:p> private static final long serialVersionUID = 5292943075702291483L;<o:p></o:p> private String add;<o:p></o:p> public String getAdd(){return add;}<o:p></o:p> public void setAdd(String add){this.add = add;}<o:p></o:p> }<o:p></o:p> |
import java.io.Serializable;<o:p></o:p> public class GoVO implements Serializable{<o:p></o:p> private static final long serialVersionUID = -8563449093441945059L;<o:p></o:p> private String title;<o:p></o:p> public String getTitle() {return title;}<o:p></o:p> public void setTitle(String title) {this.title = title;}<o:p></o:p> }<o:p></o:p> |
public class ServiceProtInterfaceImpl implements ServiceProtInterface {<o:p></o:p> public GoPO getElement(GoVO vo) {<o:p></o:p> return null;<o:p></o:p> }<o:p></o:p> }<o:p></o:p> |
<o:p> </o:p>
然后把包含有接口和bean对象的文件拷贝到AXIS目录下的WEB-INF目录下,使用如下指令:(是一句命令!!)
<o:p> </o:p>
java -Djava.ext.dirs=lib org.apache.axis.wsdl.Java2WSDL -o temp.wsdl –l "http://localhost:8090/axis/services/WS_UP_OBJ" -n "urn:WS_UP_OBJ" -p"com.lovo.upobj,com.lovo.upobj.po" "urn:WS_UP_OBJ" com.lovo.upobj.bo.UpObjIface<o:p></o:p> |
<o:p> </o:p>
//WS_UP_OBJ 是 web service 的服务名,8090 是web服务的端口 ,WS_UP_OBJ可以修改为你自己定义的web service 的服务名
//com.lovo.upobj,com.lovo.upobj.po 接口中方法要调用或要返回的javabean对象
//com.lovo.upobj.bo.UpObjIface 为服务端 接口
运行上述命令 后,在当前目录可以得到 temp.wsdl 服务描述文件
<o:p> </o:p>
2:有了temp.wsdl服务描述文件,就可以使用它来生成JAX-RPC 的框架,这个框架使得我们编程变得简单,在AXIS目录下的WEB-INF子目录,使用以下的命令就可以生成这个框架:(也是一句命令哦!!)
<o:p> </o:p>
java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java -o . -d Session -s -S true -Nurn:WS_UP_OBJ com.lovo.upobj.bo temp.wsdl<o:p></o:p> |
<o:p> </o:p>
//WS_UP_OBJ 是 web service 的服务名,com.lovo.upobj.bo 为服务端 接口 UpObjIface 所在的包
<o:p> </o:p>
使用这个命令后将 在 包含有接口和bean对象的文件 中 生成以下新文件:
<o:p> </o:p>
*Interface.java:新的*Interface接口,它扩展了java.rmi.Remote接口;(客户端要用) *InterfaceService.java:客户端服务接口,用来获得*Interface对象的引用;(客户端要用) *InterfaceServiceLocator.java:在客户端使用,主要用来服务定位;(客户端要用) *SoapBindingImpl.java:服务端实现类,它实现了*Interface接口,服务端的业务方法实现代码就在这里编写; *SoapBindingSkeleton.java:服务端Skeleton; *SoapBindingStub.java:客户端Stub;(客户端要用) GoVO.java:新的GoVO序列化对象;(客户端要用)- GoPO.java:新的GoVO序列化对象;(客户端要用) deploy.wsdd:部署这个Web服务的脚本; undeploy.wsdd:卸载这个Web服务的脚本。 |
<o:p> </o:p>
然后可以摒弃我们刚才写的那些代码,把以上生成的框架拷贝到我们的工程中。并在*SoapBindingImpl.java编写服务端的业务方法实现代码;
<o:p> </o:p>
然后在***SoapBindingStub.java 文件 的对应位置添加如下代码:(目的是把我们在传输过程中使用的传输对象进行注册。以便它以流的方式传输。)
<o:p> </o:p>
QName qn = new QName( "OO", "OO"); _call.registerTypeMapping(com.interfacepackge.GoPO.class, qn, new org.apache.axis.encoding.ser.BeanSerializerFactory(com.interfacepackge.GoPO.class, qn), new org.apache.axis.encoding.ser.BeanDeserializerFactory(com.interfacepackge.GoPO.class, qn));
QName qn1 = new QName( "OO", "OO"); _call.registerTypeMapping(com.interfacepackge.GoVO.class, qn1, new org.apache.axis.encoding.ser.BeanSerializerFactory(com.interfacepackge.GoVO.class, qn1), new org.apache.axis.encoding.ser.BeanDeserializerFactory(com.interfacepackge.GoVO.class, qn1)); |
<o:p> </o:p>
接着,把编译后的服务端程序的class文件连同完整的包目录 拷贝到服务器相应部署目录下的 AXIS\WEB-INF\class子目录。
然后开始部署(此处需要把deploy.wsdd拷贝到WEB-INF目录下)
在控制台中,转到AXIS\WEB-INF,执行以下的命令就可以完成部署
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8090/axis/services/AdminService deploy.wsdd<o:p></o:p> |
<o:p> </o:p>
OK,服务端完成了,接着我们需要干的是编写我们的客户端代码,在这之前需要把前面标有“客户端要用”的类的类文件打包,以便我们客户端导入。
客户端程序为:(需要导入AXIS引擎中lib里所有的jar文件)
public class ClientText { public static void main(String [] args){ GoVO vo = new GoVO(); vo.setTitle("丁一郎"); ServerProtInterfaceServiceLocator locator = new ServerProtInterfaceServiceLocator(); ServerProtInterface inter; try { inter = locator.getWS_UP_OBJ (); GoPO po = inter.getElement(vo); System.out.println(po.getAdd()); } catch (ServiceException e) { // TODO 自动生成 catch 块 e.printStackTrace(); } catch (RemoteException e) { // TODO 自动生成 catch 块 e.printStackTrace(); } } } |
<o:p> </o:p>
如果要远程调用此WebService,则应该把ServerProtInterfaceServiceLocator.源文件的URL地址改为IP地下。
private java.lang.String /WS_UP_OBJ _address = "http://localhost:8080/axis/services//WS_UP_OBJ "; |
<o:p> </o:p>
这样就可以实现对远程访问了。以上客户端运行结果为:
丁一郎 |
<o:p> </o:p>
以上为WebService传输复杂数据类型,主要是通常三条命令来完成,其间生成的框架为我们的开发做了很多实质性的东西,至此WebService可以说是入门了吧!