环境:aixs1_4 spring 2.0.8
1.构建webservice环境
axis的需要的包有:
axis.jar
activation.jar
axis-ant.jar
commons-discovery-0.2.jar
commons-logging-1.0.4.jar
jaxrpc.jar
log4j-1.2.8.jar
mail.jar
saaj.jar
wsdl4j-1.5.1.jar
xalan.jar
xmlsec-1.4.3.jar
在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>AdminServlet</servlet-name>
<servlet-class>
org.apache.axis.transport.http.AdminServlet
</servlet-class>
<load-on-startup>100</load-on-startup>
</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>
<!-- uncomment this if you want the admin servlet -->
<!--
<servlet-mapping>
<servlet-name>AdminServlet</servlet-name>
<url-pattern>/servlet/AdminServlet</url-pattern>
</servlet-mapping>
-->
<mime-mapping>
<extension>wsdl</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xsd</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
2.实现提供服务器端功能的接口与类:(这里需要一个接口,在与spring结合时会用到,这里会提供一些方法供client调用)
在这里有一点要注意,返回的结果最好不要是List,大家可以看到下面的接口所有的方法返回值都是数组,大家可以试下两种方式的区别,当返回list时,生成人wsdl文件中不会有自定义定型的详细描述,如这里的HttpHistoryRecord,如果返回list的话,wsdl中只知道返回的数组中是一个Object,不会有任何它的描述信息,而返回数组时,
HttpHistoryRecord中所有的字段信息都会在wsdl中出现,client根据这些能生成对应的本地类
public interface OperatorHistoryRecord
{
/**
*
* 功能简述:根据IP获取对应时间范围内的http测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public HttpHistoryRecord[] findHttpHistoryByUrl(String startTime,String endTime,String ip,String httpUrl);
/**
*
* 功能简述:根据IP获取对应时间范围内的http针对某个url的测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public HttpHistoryRecord[] findHttpHistory(String startTime,String endTime,String ip);
/**
*
* 功能简述:根据IP获取对应时间范围内的ICMP测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public IcmpHistoryRecord[] findIcmpHistory(String startTime,String endTime,String ip);
/**
*
* 功能简述:根据IP获取对应时间范围内的tcp测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public TcpHistoryRecord[] findTcpHistory(String startTime,String endTime,String ip);
/**
*
* 功能简述:根据IP获取对应时间范围内的tcp上行测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public TcpHistoryRecord[] findTcpUpHistory(String startTime,String endTime,String ip);
/**
*
* 功能简述:根据IP获取对应时间范围内的tcp下行测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public TcpHistoryRecord[] findTcpDownHistory(String startTime,String endTime,String ip);
/**
*
* 功能简述:根据IP获取对应时间范围内的udp测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public UdpHistoryRecord[] findUdpHistory(String startTime,String endTime,String ip);
/**
*
* 功能简述:根据IP获取对应时间范围内的udp上行测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public UdpHistoryRecord[] findUdpUpHistory(String startTime,String endTime,String ip);
/**
*
* 功能简述:根据IP获取对应时间范围内的udp下行测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public UdpHistoryRecord[] findUdpDownHistory(String startTime,String endTime,String ip);
}
public class OperatorHistoryRecordImpl implements OperatorHistoryRecord
{
private TestingHistoryService testingHistoryService;
public void setTestingHistoryService(TestingHistoryService testingHistoryService)
{
this.testingHistoryService = testingHistoryService;
}
/**
*
* 功能简述:根据IP获取对应时间范围内的http测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public HttpHistoryRecord[] findHttpHistoryByUrl(String startTime,String endTime,String ip,String httpUrl){
List<HttpHistoryRecord> httpHistorys = testingHistoryService.getHttpHistoryByUrl(startTime, endTime, ip, httpUrl);
return httpHistorys.toArray(new HttpHistoryRecord[0]);
}
/**
*
* 功能简述:根据IP获取对应时间范围内的http针对某个url的测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public HttpHistoryRecord[] findHttpHistory(String startTime,String endTime,String ip){
List<HttpHistoryRecord> httpHistorys = testingHistoryService.getHttpHistory(startTime, endTime, ip);
return httpHistorys.toArray(new HttpHistoryRecord[0]);
}
/**
*
* 功能简述:根据IP获取对应时间范围内的ICMP测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public IcmpHistoryRecord[] findIcmpHistory(String startTime,String endTime,String ip){
List<IcmpHistoryRecord> icmpHistorys = testingHistoryService.getIcmpHistory(startTime, endTime, ip);
return icmpHistorys.toArray(new IcmpHistoryRecord[0]);
}
/**
*
* 功能简述:根据IP获取对应时间范围内的tcp测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public TcpHistoryRecord[] findTcpHistory(String startTime,String endTime,String ip){
List<TcpHistoryRecord> tcpHistorys = testingHistoryService.getTcpHistory(startTime, endTime, ip);
return tcpHistorys.toArray(new TcpHistoryRecord[0]);
}
/**
*
* 功能简述:根据IP获取对应时间范围内的tcp上行测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public TcpHistoryRecord[] findTcpUpHistory(String startTime,String endTime,String ip){
List<TcpHistoryRecord> tcpHistorys = testingHistoryService.getTcpUpHistory(startTime, endTime, ip);
return tcpHistorys.toArray(new TcpHistoryRecord[0]);
}
/**
*
* 功能简述:根据IP获取对应时间范围内的tcp下行测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public TcpHistoryRecord[] findTcpDownHistory(String startTime,String endTime,String ip){
List<TcpHistoryRecord> tcpHistorys = testingHistoryService.getTcpDownHistory(startTime, endTime, ip);
return tcpHistorys.toArray(new TcpHistoryRecord[0]);
}
/**
*
* 功能简述:根据IP获取对应时间范围内的udp测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public UdpHistoryRecord[] findUdpHistory(String startTime,String endTime,String ip){
List<UdpHistoryRecord> udpHistorys = testingHistoryService.getUdpHistory(startTime, endTime, ip);
return udpHistorys.toArray(new UdpHistoryRecord[0]);
}
/**
*
* 功能简述:根据IP获取对应时间范围内的udp上行测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public UdpHistoryRecord[] findUdpUpHistory(String startTime,String endTime,String ip){
List<UdpHistoryRecord> udpHistorys = testingHistoryService.getUdpUpHistory(startTime, endTime, ip);
return udpHistorys.toArray(new UdpHistoryRecord[0]);
}
/**
*
* 功能简述:根据IP获取对应时间范围内的udp下行测试结果信息
* 功能详细描述:
* @param startTime 开始时间
* @param endTime 结束时间
* @param ip 用户IP
* @return
*/
public UdpHistoryRecord[] findUdpDownHistory(String startTime,String endTime,String ip){
List<UdpHistoryRecord> udpHistorys = testingHistoryService.getUdpDownHistory(startTime, endTime, ip);
return udpHistorys.toArray(new UdpHistoryRecord[0]);
}
}
3.与spring结合(建一个类继承ServletEndpointSupport,当client请求webservice时,它会来管理相应的实现类,接着继承OperatorHistoryRecord)
/**
* 功能简述:使用spring来管理soap对象
* 功能详细描述:
* @author 曾阁
* @version [1.0,2011-3-18 上午10:31:40]
*/
public class SpringOperatorHistoryRecord extends ServletEndpointSupport implements OperatorHistoryRecord
{
private OperatorHistoryRecord operatorHistoryRecord ;
@Override
protected void onInit() throws ServiceException
{
operatorHistoryRecord = (OperatorHistoryRecord)getApplicationContext().getBean("operatorHistoryRecord");
super.onInit();
}
public IcmpHistoryRecord[] findIcmpHistory(String startTime,
String endTime, String ip)
{
return operatorHistoryRecord.findIcmpHistory(startTime, endTime, ip);
}
public TcpHistoryRecord[] findTcpHistory(String startTime, String endTime,
String ip)
{
return operatorHistoryRecord.findTcpHistory(startTime, endTime, ip);
}
public HttpHistoryRecord[] findHttpHistoryByUrl(String startTime,
String endTime, String ip, String httpUrl)
{
return operatorHistoryRecord.findHttpHistoryByUrl(startTime, endTime, ip, httpUrl);
}
public UdpHistoryRecord[] findUdpHistory(String startTime, String endTime,
String ip)
{
return operatorHistoryRecord.findUdpHistory(startTime, endTime, ip);
}
public TcpHistoryRecord[] findTcpDownHistory(String startTime,
String endTime, String ip)
{
return operatorHistoryRecord.findTcpDownHistory(startTime, endTime, ip);
}
public TcpHistoryRecord[] findTcpUpHistory(String startTime,
String endTime, String ip)
{
return operatorHistoryRecord.findTcpUpHistory(startTime, endTime, ip);
}
public UdpHistoryRecord[] findUdpDownHistory(String startTime,
String endTime, String ip)
{
return operatorHistoryRecord.findUdpDownHistory(startTime, endTime, ip);
}
public UdpHistoryRecord[] findUdpUpHistory(String startTime,
String endTime, String ip)
{
return operatorHistoryRecord.findUdpUpHistory(startTime, endTime, ip);
}
public HttpHistoryRecord[] findHttpHistory(String startTime,
String endTime, String ip)
{
return operatorHistoryRecord.findHttpHistory(startTime, endTime, ip);
}
}
spring配置文件:
<bean id="operatorHistoryRecord" class="com.vixtel.soap.server.OperatorHistoryRecordImpl"></bean>
<bean id="testingHistoryService" class="com.vixtel.netmanager.service.impl.TestingHistoryServiceImpl"></bean>
operatorHistoryRecord为提供webservice功能的对象,它会用到testingHistoryService
4.生成webservice布署描述文件(deploy.wsdd)
在WEB-INF下面添加deploy.wsdd
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="OperatorHistoryRecord" provider="java:RPC">
<parameter name="className" value="com.vixtel.soap.server.SpringOperatorHistoryRecord"/>
<parameter name="allowedMethods" value="*" />
<beanMapping languageSpecificType="java:com.vixtel.soap.server.vo.HttpHistoryRecord" qname="myNS:HttpHistoryRecord" xmlns:myNS="urn:OperatorHistoryRecord"/>
<beanMapping languageSpecificType="java:com.vixtel.soap.server.vo.IcmpHistoryRecord" qname="myNS:IcmpHistoryRecord" xmlns:myNS="urn:OperatorHistoryRecord"/>
<beanMapping languageSpecificType="java:com.vixtel.soap.server.vo.TcpHistoryRecord" qname="myNS:TcpHistoryRecord" xmlns:myNS="urn:OperatorHistoryRecord"/>
<beanMapping languageSpecificType="java:com.vixtel.soap.server.vo.UdpHistoryRecord" qname="myNS:UdpHistoryRecord" xmlns:myNS="urn:OperatorHistoryRecord"/>
<parameter name="scope" value="request" />
</service>
</deployment>
这个文件用于描述提供的服务,如果没与spring结合的话
<parameter name="className" value="com.vixtel.soap.server.SpringOperatorHistoryRecord"/>
应该换成
<parameter name="className" value="com.vixtel.soap.server.OperatorHistoryRecordImpl"/>
<parameter name="allowedMethods" value="*" />表示SpringOperatorHistoryRecord中所有的方法都用于提供服务,当然继承来的不算
<beanMapping languageSpecificType="java:com.vixtel.soap.server.vo.HttpHistoryRecord" qname="myNS:HttpHistoryRecord" xmlns:myNS="urn:OperatorHistoryRecord"/>
用于描述自定义的类型,java:com.vixtel.soap.server.vo.HttpHistoryRecord表示类型,前面的java:不能少,后面的表示命名空间等等,不用太在意
此文件其实可以完全不要,因为最终它内部的的service内容会被添加到server-config.wsdd里面去,这才是最终用到的wsdd。一般会调用命令首先启动tomcat,进入WEB-INF目录下执行命令:
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd
这句命令执行后会在WEB-INF下面生成一个server-config.wsdd,并且会将deploy.wsdd的内容添加到server-config.wsdd之中。所以我们可以手动的将axis中的server-config.wsdd copy一份到WEB-INF下面,然后将deploy.wsdd中的内容添加到server-config.wsdd之中
server-config.wsdd
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
<parameter name="sendMultiRefs" value="true"/>
<parameter name="disablePrettyXML" value="true"/>
<parameter name="adminPassword" value="admin"/>
<parameter name="attachments.Directory" value="E:\zg\softInstall\Tomcat\webapps\axis\WEB-INF\attachments"/>
<parameter name="dotNetSoapEncFix" value="true"/>
<parameter name="enableNamespacePrefixOptimization" value="false"/>
<parameter name="sendXMLDeclaration" value="true"/>
<parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
<parameter name="sendXsiTypes" value="true"/>
<requestFlow>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="session"/>
</handler>
<handler type="java:org.apache.axis.handlers.JWSHandler">
<parameter name="scope" value="request"/>
<parameter name="extension" value=".jwr"/>
</handler>
</requestFlow>
</globalConfiguration>
<handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
<handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
<service name="AdminService" provider="java:MSG">
<parameter name="allowedMethods" value="AdminService"/>
<parameter name="enableRemoteAdmin" value="false"/>
<parameter name="className" value="org.apache.axis.utils.Admin"/>
<namespace>http://xml.apache.org/axis/wsdd/</namespace>
</service>
<service name="Version" provider="java:RPC">
<parameter name="allowedMethods" value="getVersion"/>
<parameter name="className" value="org.apache.axis.Version"/>
</service>
<!--只有这一段是所需要的,这里只是将原始的server-config.wsdd复制过来,然后将所需要的内容粘在这了,所以deploy.wsdd是可以不要的,并且也不用执行什么命令了-->
<service name="OperatorHistoryRecord" provider="java:RPC">
<parameter name="className" value="com.vixtel.soap.server.SpringOperatorHistoryRecord"/>
<parameter name="allowedMethods" value="*" />
<beanMapping languageSpecificType="java:com.vixtel.soap.server.vo.HttpHistoryRecord" qname="myNS:HttpHistoryRecord" xmlns:myNS="urn:OperatorHistoryRecord"/>
<beanMapping languageSpecificType="java:com.vixtel.soap.server.vo.IcmpHistoryRecord" qname="myNS:IcmpHistoryRecord" xmlns:myNS="urn:OperatorHistoryRecord"/>
<beanMapping languageSpecificType="java:com.vixtel.soap.server.vo.TcpHistoryRecord" qname="myNS:TcpHistoryRecord" xmlns:myNS="urn:OperatorHistoryRecord"/>
<beanMapping languageSpecificType="java:com.vixtel.soap.server.vo.UdpHistoryRecord" qname="myNS:UdpHistoryRecord" xmlns:myNS="urn:OperatorHistoryRecord"/>
<parameter name="scope" value="request" />
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
<handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
</requestFlow>
<parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
<parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
<parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler"/>
<parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/>
<parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
<parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
</transport>
<transport name="local">
<responseFlow>
<handler type="LocalResponder"/>
</responseFlow>
</transport>
</deployment>
这样一个webservice就建好了,并与spring结合好了,启动tomcat,进入http://localhost:8080/project_name/services就能看到相应的webservice的名称,点击链接进去就能看到对应的wsdl文件,用它来生成client调用的对象