Axis开发webservice的简单实例
blog迁移至:http://www.micmiu.com
本文主要记录Axis开发webservice简单实例的详细过程和步骤:
Axis官方网站:http://ws.apache.org/axis/
可以在官网下载最新1.4的包:axis-bin-1_4.zip
将解压后的axis-1_4\webapps\下的axis目录考到%TOMCAT_HOME%/Webapps/目录下
启动tomcat后在浏览器里输入http://localhost:8082/axis会看到下图所示(ps:本人的tomcat端口为8082)
点击上图中的Validataion链接,页面上会提示已经有的包和缺少的包的信息,根据提示将必须的包下载全,将这些类包复制到 %tomcathome%/webapps/axis/WEB-INF/lib/目录下重新启动tomcat,直到Validation页面中看不到有Error与Warning的提示信息。
如果提示缺少xmlsec.jar可以到http://santuario.apache.org/dist/java-library/下载.
Axis支持三种web service的客户端访问方式,分别为:Dynamic Invocation Interface ( DII)Dynamic Proxy方式Stubs方式PS:看到很多资料将上述方式列为Web Servcie的三种“部署和开发方法,个人觉得有些欠妥
下面介绍axis部署和发布web service的方式:
一、JWS
JWS(Java Web Service)是最简单的一种方式。Axis允许把普通Java类的源文件的扩展名改为.jws,然后把它简单的copy到AXIS_HOME下。这样,Axis 会自动编译.jws文件,并把它自动加入到Java Web Servie的服务中。具体过程如下
1.用Eclipse或者文本编辑器编写一个java类SayHello.java(此类不含包名)
public class SayHello{public String sayMsg(String name){return "Hello,"+name;}}
import org.apache.axis.client.Call;import org.apache.axis.client.Service;/** * axis client * @author Michael sun */public class TestClient { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String wsdlUrl = "http://localhost:8082/axis/SayHello.jws"; // String wsdlUrl=”http://localhost:8080/axis/SayHello.jws?wsdl” Service s = new Service(); Call call = (Call) s.createCall(); call.setOperationName("sayMsg");// 这里是要调用的方法名 call.setTargetEndpointAddress(wsdlUrl);// 设置调用的wsdl String val = (String) call.invoke(new Object[] { "My Michael Sun" }); System.out.println("这是webservice服务器返回的信息:" + val); }}public interface SayHelloInterface extends java.rmi.Remote { public String sayMsg(String name) throws java.rmi.RemoteException;}import java.net.URL;import javax.xml.namespace.QName;import javax.xml.rpc.Service;import javax.xml.rpc.ServiceFactory;/** * test Dynamic Proxy client * @author Michael sun */public class TestProxyClient { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String wsdlname = "http://localhost:8088/axis/SayHello.jws?wsdl"; // 服务路径 String namespaceUrl = "http://localhost:8088/axis/SayHello.jws"; // 服务名 String serviceName = "SayHelloService"; // 服务 String portName = "SayHello"; // 创建代理对像 ServiceFactory service = ServiceFactory.newInstance(); // 创建远程服务 Service s = service.createService(new URL(wsdlname), new QName( namespaceUrl, serviceName)); SayHelloInterface proxy = (SayHelloInterface) s.getPort(new QName( namespaceUrl, portName), SayHelloInterface.class); System.out.println(proxy.sayMsg("Blue boy!")); }}package wsaxis.bean;/** * bean * @author Michael sun */public class UserBean { private String userName; private Integer age; /** * @return the userName */ public String getUserName() { return userName; } /** * @return the age */ public Integer getAge() { return age; } /** * @param pUserName the userName to set */ public void setUserName(String pUserName) { userName = pUserName; } /** * @param pAge the age to set */ public void setAge(Integer pAge) { age = pAge; }}package wsaxis;import wsaxis.bean.UserBean;/** * axis server * @author Michael sun */public class MessageService { /** * getBeanStr * @param bean * @return String */ public String getBeanStr(UserBean bean) { return "You Name:" + bean.getUserName() + " , You Age:" + bean.getAge(); } /** * checkUser * @param bean * @return String */ public String checkUser(UserBean bean) { if ("Michael".equals(bean.getUserName())) { return "Michael welcome to axis "; } else { return bean.getUserName() + " can't access this ws"; } }}<deployment name="test" xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="MessageService" provider="java:RPC" style="rpc" use="encoded"> <parameter name="className" value="wsaxis.MessageService"/> <parameter name="allowedMethods" value="*"/> <typeMapping xmlns:ns1="http://wsaxis.michael.com" qname="ns1:userBean" type="java:wsaxis.bean.UserBean" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </service></deployment>
<undeployment xmlns="http://xml.apache.org/axis/wsdd/"> <!-- Services from MessageService WSDL service --> <service name="MessageService"/></undeployment>

import java.net.URL;import javax.xml.namespace.QName;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import org.apache.axis.encoding.ser.BeanDeserializerFactory;import org.apache.axis.encoding.ser.BeanSerializerFactory;import stubclient.UserBean;/** * test stub client * @author Michael sun */public class TestStubClient { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { QName qname = new QName("http://wsaxis.michael.com", "user"); Service s = new Service(); Call call = (Call) s.createCall(); // 注册这个bean为可序列化的.传递参数 call.registerTypeMapping(UserBean.class, qname, new BeanSerializerFactory(UserBean.class, qname), new BeanDeserializerFactory(UserBean.class, qname)); // 设置一下调用方法名. call.setOperationName("getBeanStr"); // 设置一下这个服务的绝对路径. call.setTargetEndpointAddress(new URL( "http://localhost:8082/axis/services/MessageService?wsdl")); // 实例化一个UserBean,这个UserBean是生成client的UserBean UserBean u = new UserBean(); u.setAge(28); u.setUserName("Michael"); // 通知方法,并返回结果 String str = (String) call.invoke(new Object[] { u }); System.out.println("web service 返回信息:" + str); }}