Axis 的开发看起来比较繁琐,但搞多了你就会很快
总结出一定的套路。复杂的应用也是有简单组合起来的。
在进行开发之前,你需要先确定:这个Web Service需要向外部
提供那些接口。接口的参数和返回值。最好就写出个java接口文件。
然后先做个空的类来实现这个接口。
然后再针对这个类编写wsdd文件。然后照标准的方法deploy 这样就搭起了一个
框架。最后再在类中实现具体的功能。并编写客户端测试。
其中我认为比较核心的事情,就是对象序列化。
凡是不属于基本类型的对象都需要序列化。因为axis需要知道怎样
把对象解析称xml文本在后传输。
wsdd里最重要的内容也就是指明那些对象需要序列化。
下面是一个wsdd的例子:<deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
xmlns:ns="urn:Test"> <service name="MyService" provider="java:RPC" style="rpc" use="encoded"> <parameter name="wsdlTargetNamespace" value="Test"/>
<parameter name="className" value="com.xxx.xxx.MyServiceSOAPBindingImpl"/>
<parameter name="allowedMethods" value="*"/> <typeMapping
qname="ns:MyJavaBean"
type="java:com.xxx.xxx.MyJavaBean"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
/>
</service>
</deployment>
这里MyJavaBean是自定义的JavaBean,需要注册。
其他都是通用的套路。
如果你返回的是一个List 而这个List里包含多个JavaBean
那么List本身不需要注册 axis会认得。
至于发布的方法和客户端的代码示例,你可以参考axis上的例子。
总结出一定的套路。复杂的应用也是有简单组合起来的。
在进行开发之前,你需要先确定:这个Web Service需要向外部
提供那些接口。接口的参数和返回值。最好就写出个java接口文件。
然后先做个空的类来实现这个接口。
然后再针对这个类编写wsdd文件。然后照标准的方法deploy 这样就搭起了一个
框架。最后再在类中实现具体的功能。并编写客户端测试。
其中我认为比较核心的事情,就是对象序列化。
凡是不属于基本类型的对象都需要序列化。因为axis需要知道怎样
把对象解析称xml文本在后传输。
wsdd里最重要的内容也就是指明那些对象需要序列化。
下面是一个wsdd的例子:<deployment
xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
xmlns:ns="urn:Test"> <service name="MyService" provider="java:RPC" style="rpc" use="encoded"> <parameter name="wsdlTargetNamespace" value="Test"/>
<parameter name="className" value="com.xxx.xxx.MyServiceSOAPBindingImpl"/>
<parameter name="allowedMethods" value="*"/> <typeMapping
qname="ns:MyJavaBean"
type="java:com.xxx.xxx.MyJavaBean"
serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
/>
</service>
</deployment>
这里MyJavaBean是自定义的JavaBean,需要注册。
其他都是通用的套路。
如果你返回的是一个List 而这个List里包含多个JavaBean
那么List本身不需要注册 axis会认得。
至于发布的方法和客户端的代码示例,你可以参考axis上的例子。
解决方案 »
- 如何解决strut2参数2次传递的问题呢
- 【求助】公司内部系统登陆问题
- SSH2 脏话过滤
- 求助:数据库设计问题
- intellij部署问题
- webservice如何入门
- 我有一个项目,档案管理系统要开源,大家有什么建议
- TOMCAT5.5+J2SE5环境下不能运行JSP,急!!!
- static public int g() 和 public static int g()两个方法有什么区别
- 请教大虾,配置Servlet的那个鸟web.xml文件的几个serlet-name,servlet-class....是什么意思呀?
- 当一个网站每天的访问量达到几十万人的时候,你用什么方法保证你的系统不死机?
- RMI的问题-怎么把一个server的任务分配给多个server?
我就是按照你的这个思路去做的。整个开发框架的搭建我是理解的,我的主要问题还是出现在
在wsdd描述文件里配置复杂数据类型序列化上,上面这个javabean的例子我也是理解的,但是如果是LIst(包含多个bean)的话,虽然list本身axis是认识的,可是如果不声明它内部的
对象是那中bean类型的话,客户端如何反序列化呢??
我觉得wsdl文件里应该有类似下面的标记,客户端才明白吧(我乱写的):<complexType name="list">
<sequence>
<element name="item" >
<complexType>
<sequence>
<element name="key" type="anyType" />
<element name="value" type="com.....bean" />
</sequence>
</complexType>
</element>
</sequence> </complexType>
数组才是通用的,这样你的Web Service才能与其他语言的SOAP SDK交流,
否则与外界交流会出现很多麻烦。
客户端除了注册那个对象外也需要注册一个对象数组qname = new QName(uri, "ArrayOf_tns1_MyJavaBean");
map.register(
MyJavaBean[].class,
qname,
new ArraySerializerFactory(),
new ArrayDeserializerFactory());这样返回的结果就可以直接强制转换了。