Axis开发webservice的简单实例(转)

本文主要记录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/download.html下载.

Axis支持三种web service的客户端访问方式,分别为:

  • Dynamic Invocation Interface ( DII)
  • Dynamic Proxy方式
  • Stubs方式

PS:看到很多资料将上述方式列为Web Servcie的三种“部署和开发方法,个人觉得有些欠妥

下面介绍axis部署和发布web service的方式:

  • JWS -即时发布
  • WSDD – 定制发布

一、JWS

JWS(Java WebService)是最简单的一种方式。Axis允许把普通Java类的源文件的扩展名改为.jws,然后把它简单的copy到AXIS_HOME下。这
样,Axis 会自动编译.jws文件,并把它自动加入到Java Web Servie的服务中。非常简单和灵活,但是这种方式的缺点是:只能是java源代码,同时类中不能含有包名。具体过程如下

1.用Eclipse或者文本编辑器编写一个java类SayHello.java(此类不含包名)

1 public class SayHello{
2     public String sayMsg(String name){
3         return "Hello,"+name;
4     }
5 }

2.将上面的类(SayHello.java)copy到%tomcat_home%/webapps/axis/目录下,只需要把类的源文件(不是class)到这个目录下,重命名为:SayHello.jws

3.打开浏览器输入:http://localhost:8082/axis/SayHello.jws 会看到:


点击上图Click to see the WSDL 的链接,就可以看到生成的wsdl。

4.客户端Dynamic Invocation Interface ( DII)方式 实现如下:

1 import org.apache.axis.client.Call;
2 import org.apache.axis.client.Service;
3  
4 /**
5  * axis client
6  * @author Michael sun
7  */
8 public class TestClient {
9  
10     /**
11      * @param args
12      * @throws Exception
13      */
14     public static void main(String[] args) throws Exception {
15         String wsdlUrl = "http://localhost:8082/axis/SayHello.jws";
16         // String wsdlUrl=”http://localhost:8080/axis/SayHello.jws?wsdl
17         Service s = new Service();
18         Call call = (Call) s.createCall();
19         call.setOperationName("sayMsg");// 这里是要调用的方法名
20         call.setTargetEndpointAddress(wsdlUrl);// 设置调用的wsdl
21         String val = (String) call.invoke(new Object[] { "My Michael Sun" });
22         System.out.println("这是webservice服务器返回的信息:" + val);
23     }
24 }

5.客户端Dynamic Proxy方式 实现如下:

1 public interface SayHelloInterface extends java.rmi.Remote {
2  
3     public String sayMsg(String name) throws java.rmi.RemoteException;
4  
5 }
1 import java.net.URL;
2  
3 import javax.xml.namespace.QName;
4 import javax.xml.rpc.Service;
5 import javax.xml.rpc.ServiceFactory;
6  
7 /**
8  * test Dynamic Proxy client
9  * @author Michael sun
10  */
11 public class TestProxyClient {
12  
13     /**
14      * @param args
15      * @throws Exception
16      */
17     public static void main(String[] args) throws Exception {
18         String wsdlname = "http://localhost:8088/axis/SayHello.jws?wsdl";
19         // 服务路径
20         String namespaceUrl = "http://localhost:8088/axis/SayHello.jws";
21         // 服务名
22         String serviceName = "SayHelloService";
23         // 服务
24         String portName = "SayHello";
25         // 创建代理对像
26         ServiceFactory service = ServiceFactory.newInstance();
27         // 创建远程服务
28         Service s = service.createService(new URL(wsdlname), new QName(
29                 namespaceUrl, serviceName));
30  
31         SayHelloInterface proxy = (SayHelloInterface) s.getPort(new QName(
32                 namespaceUrl, portName), SayHelloInterface.class);
33         System.out.println(proxy.sayMsg("Blue boy!"));
34     }
35 }

二、WSDD(Web Service Deployment Descriptor)文件发布Web Service

1.自定义参数bean和server的代码如下:

1 package wsaxis.bean;
2  
3 /**
4  * bean
5  * @author Michael sun
6  */
7 public class UserBean {
8  
9     private String userName;
10  
11     private Integer age;
12  
13     /**
14      * @return the userName
15      */
16     public String getUserName() {
17         return userName;
18     }
19  
20     /**
21      * @return the age
22      */
23     public Integer getAge() {
24         return age;
25     }
26  
27     /**
28      * @param pUserName the userName to set
29      */
30     public void setUserName(String pUserName) {
31         userName = pUserName;
32     }
33  
34     /**
35      * @param pAge the age to set
36      */
37     public void setAge(Integer pAge) {
38         age = pAge;
39     }
40  
41 }
1 package wsaxis;
2  
3 import wsaxis.bean.UserBean;
4  
5 /**
6  * axis server
7  * @author Michael sun
8  */
9 public class MessageService {
10  
11     /**
12      * getBeanStr
13      * @param bean
14      * @return String
15      */
16     public String getBeanStr(UserBean bean) {
17         return "You Name:" + bean.getUserName() + " , You Age:" + bean.getAge();
18     }
19  
20     /**
21      * checkUser
22      * @param bean
23      * @return String
24      */
25     public String checkUser(UserBean bean) {
26         if ("Michael".equals(bean.getUserName())) {
27             return "Michael welcome to axis ";
28         } else {
29             return bean.getUserName() + " can't access this ws";
30         }
31  
32     }
33  
34 }

2.deploy.wsdd和undeploy.wsdd文件的编写如下:

deploy.wsdd 文件如下:

WSDD文件描述可参见:http://www.oio.de/axis-wsdd/

1 <deployment name="test" xmlns="http://xml.apache.org/axis/wsdd/"
3   <service name="MessageService" provider="java:RPC" style="rpc" use="encoded">
4     <parameter name="className" value="wsaxis.MessageService"/>
5     <parameter name="allowedMethods" value="*"/>
6         <typeMapping xmlns:ns1="http://wsaxis.michael.com" qname="ns1:userBean"
7             type="java:wsaxis.bean.UserBean"
8             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
9             deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
10         encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
11        />
12   </service>
13 </deployment>

undeploy.wsdd文件如下:

1 <undeployment
3   <!-- Services from MessageService WSDL service -->
4   <service name="MessageService"/>
5 </undeployment>

3.将上面写好的两个类的class文件复制到%tomcat_home%/axis/WEB-INF/class/目录下,完整的目录结构复制过来,然后在把两个wsdd文件复制到%tomcat_home%/axis/WEB-INF/目录下,打开控制台进入%tomcat_home%/axis/WEB-INF/目录下:

>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -p 8082 deploy.wsdd 

-s  参数指定了AxisServlet所在的应用程序路径
>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -p 8082 -s /axis/servlet/AxisServlet deploy.wsdd 

-l  参数指定目标应用的URL
>java -Djava.ext.dirs=lib 
org.apache.axis.client.AdminClient 
–lhttp://localhost:8082/axis/services/MessageService deploy.wsdd

这个命令就是发布这个服务,发布成功后在控制台下会有提示:

Processing file deploy.wsdd
<Admin>Done processing</Admin>

同时发布后会在%tomcat_home%/axis/目录下,多了一个server-config.wsdd文件.
在浏览器输入:http://localhost:8082/axis/services/MessageService会看到下图:


4.client的生成方法:

打开控制台进入%tomcat_home%/axis/WEB-INF/目录下:

>java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java -p client http://localhost:8082/axis/services/MessageService?wsdl

会在当前的目录下生成client文件夹,这个目录里文件就是客户端源码。

5.通过WSDD文件卸载发布的webservice:

打开控制台进入%tomcat_home%/axis/WEB-INF/目录下:
>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient undeploy.wsdd

如果不是默认8080端口需要加上参数-p:
>java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -p 8082 undeploy.wsdd

PS:java -Djava.ext.dirs=lib 也可以用java -cp “lib\*”

6.客户端Stubs方式实现如下:

1 import java.net.URL;
2  
3 import javax.xml.namespace.QName;
4  
5 import org.apache.axis.client.Call;
6 import org.apache.axis.client.Service;
7 import org.apache.axis.encoding.ser.BeanDeserializerFactory;
8 import org.apache.axis.encoding.ser.BeanSerializerFactory;
9  
10 import stubclient.UserBean;
11  
12 /**
13  * test stub client
14  * @author Michael sun
15  */
16 public class TestStubClient {
17  
18     /**
19      * @param args
20      * @throws Exception
21      */
22     public static void main(String[] args) throws Exception {
23         QName qname = new QName("http://wsaxis.michael.com", "user");
24         Service s = new Service();
25         Call call = (Call) s.createCall();
26         // 注册这个bean为可序列化的.传递参数
27         call.registerTypeMapping(UserBean.class, qname,
28                 new BeanSerializerFactory(UserBean.class, qname),
29                 new BeanDeserializerFactory(UserBean.class, qname));
30         // 设置一下调用方法名.
31         call.setOperationName("getBeanStr");
32  
33         // 设置一下这个服务的绝对路径.
34         call.setTargetEndpointAddress(new URL(
35                 "http://localhost:8082/axis/services/MessageService?wsdl"));
36         // 实例化一个UserBean,这个UserBean是生成client的UserBean
37         UserBean u = new UserBean();
38         u.setAge(28);
39         u.setUserName("Michael");
40         // 通知方法,并返回结果
41         String str = (String) call.invoke(new Object[] { u });
42  
43         System.out.println("web service 返回信息:" + str);
44  
45     }
46  
47 }

转载于:https://my.oschina.net/yanjianhai/blog/209967

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值