Axis 自动生成WebService

用wsdl2java简化客户端的编写
也许有很多读者会说“有没有搞错啊,只调用两个WebService方法用要写这么多代码,太麻烦了”。
不过幸好Axis2提供了一个wsdl2java.bat命令可以根据WSDL文件自动产生调用WebService的代码。

一、生成WDSL文件
首先在Service项目写接口类。如FeiAction

public interface FeiAction {
public String getGreeting(String name);
}

得到src下的class文件拷到classes的文件中。
更改Java2wsdl.bat的内容。指向FeiAction的位置。
[color=red]
设置WEB SERVICE的地址
要注意。一般为:
http://localhost:8080/projectName/services/WSDLNAM
[/color]
就生成name.wsdl。

二、生成java类
更改wsdl2java.bat的内容。
运行Java2wsdl.bat。可得到我们配置的文件。
把生成的java配置文件拷到service项目与Client项目之中。

三、并引用classes下所有的jar包到Serivice项目与Client项目中。

四、在web.xml中添加以下代码

<listener>
<listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
</listener>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>SOAPMonitorService</servlet-name>
<servlet-class>org.apache.axis.monitor.SOAPMonitorService</servlet-class>
<init-param>
<param-name>SOAPMonitorPort</param-name>
<param-value>5001</param-value>
</init-param>
<load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SOAPMonitorService</servlet-name>
<url-pattern>/SOAPMonitor</url-pattern>
</servlet-mapping>


五、在web-inf/server-config.wsdd中把生成deploy.wsdd的代码拷入。

六、启动Tomcat。用http://localhost:8080/projectName/services来查看是否成功。

七、在service项目中实现WDSL新生成的接口类。

八、客户端


package com.hongxing.soap.fei.service.action;

import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;

import com.hongxing.soap.fei.service.FeiActionServiceLocator;

public class StubClient {
private static String wsUrl="http://localhost:8080/wsdlService/services/Feiservice";
public static void main(String[] args){
FeiActionServiceLocator serviceLocator = new FeiActionServiceLocator();
try {
URL url = new URL(wsUrl);
com.hongxing.soap.fei.service.FeiAction ff= serviceLocator.getFeiservice(url);
String ff1 = ff.getGreeting("爱人");
System.out.println(ff1);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

上面的代码大大简化了调用WebService的步骤,并使代码更加简洁。但要注意的是,wsdl2java.bat命令生成的Stub类将WebService方法的参数都封装在了相应的类中,类名为方法名,例如,getGreeting方法的参数都封装在了GetGreeting类中,要想调用getGreeting方法,必须先创建GetGreeting类的对象实例。

[color=red]
在客户端调用应用服务器上发布出来的WSDL,以实现登陆时获取应用服务器上的某些信息反馈到客户端。现在就简单讲讲在客户端调用WSDL的步骤吧。之前写过两个不同应用服务器之间相互调用WSDL的程序,用的是axis。所以这里就把以前的代码拷贝过来,稍做修改,并且将“axis.jar”,“axis-ant.jar”,“commons-discovery-0.2.jar”,“jaxrpc.jar”,“saaj.jar”,“wsdl4j-1.5.1.jar”这些包拷到客户端的lib下(也不知道哪个有用,哪个没用,反正就拷了这些)。运行的时候,有错误,错误如下:

org.apache.axis.utils.JavaUtils isAttachmentSup
ported
警告: Unable to find required classes (javax.activation.DataHandler and javax.ma
il.internet.MimeMultipart). Attachment support is disabled.
Exception in thread "Thread-5" java.lang.NoClassDefFoundError: javax/wsdl/Operat
ionType……

[/color]
解决问题:把服务端用的jar包都引入

[color=red]
AxisFault
faultCode: {http://xml.apache.org/axis/}Server.NoService
faultSubcode:
faultString: The AXIS engine could not find a target service to invoke! targetService is null
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}hostname:hx-77d2243bcef6

The AXIS engine could not find a target service to invoke! targetService is null
[/color]
原因:这是因为url的址指向的不是所用的targetService而导致的。
解决问题:把url的地址指向server-config.wsdd中service name="serviceName"的地址即可。就是在Java2wsdl.bat设置WEB SERVICE的地址。

[color=brown]WSDL 文档在Web服务的定义中使用下列元素:
Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。
Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。
Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。
PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。
Binding - 特定端口类型的具体协议和数据格式规范的绑定。
Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
Service - 相关服务访问点的集合。 [/color]

最后,读取文件

try{
File file = new File(apkPath);
SAXReader reader = new SAXReader();
Document doc = (Document) reader.read(file);
Element root = (Element) doc.getRootElement();
Element foo;
Iterator it = root.elementIterator("update");

//遍历更新节点
while(it.hasNext()) {
foo = (Element) it.next();

//转到小写
String type = foo.attributeValue("type").trim().toLowerCase();
if(phoneType!=null && !"".equals(phoneType))
phoneType = phoneType.toLowerCase();

//如果节点中手机类型与终端上传手机类型不一致,则继续查找
if(!type.equals(phoneType)){
continue;
}else{//一致,返回相应型号机型apk所在目录及该机型的最新版本,用#隔开
versionResult = foo.attributeValue("filePath").trim() + "#" + foo.attributeValue("version").trim();
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值