新手学习Axis1过程中的一点理解

来源:互联网 发布:三国无双7猛将传数据 编辑:程序博客网 时间:2024/06/01 10:11

本文例子代码来源于网上,感谢代码作者!

 

<一>引入库以及添加环境变量

对于有时只需要将库导入工程,有时又需要将库加入环境变量Classpath中,感到很迷惑,为什么有的只引入工程就可以,有的就需要加入环境变量?

学习过程中稍微理解了一些:

1、当引入jar包到某个工程后,引入的库也只是在这个工程有效

2、将库的路径加入环境变量,这样就成了系统变量,当某些程序需要找寻库文件(例如include <>只去系统目录查找 ,而双引号“”则会先去当前目录找,找不到再去系统目录),如果为这个库设置了环境变量,则可以直接引用,就类似于系统库

 

库加入环境变量后可以直接在DOS调用

 

<二>axis开发webservice

Axis支持三种web service的部署和开发,分别为:
1、Dynamic Invocation Interface ( DII)
2、Stubs方式
3、Dynamic Proxy方式

 

只选择了前面2种方法来操作

 

DII方式

1、编写一个类,例如

public class SayHello{                 

public String say(String name){
                        return " Hello ~~" + name;
                    }
                }

然后将这个类保存成SayHello.JWS,然后放到tomcat的webapps的axis,然后运行tomcat,访问http://localhost:8080/axis/SayHello.jws,这个站点就是服务器端的webservice

 

2、编写客户端访问它

访问客户端webservice也可以有2种创建方式

(1)创建一个Java Project,并在src创建一个类,取名ToClient.java

  import org.apache.axis.client.Call;
          import org.apache.axis.client.Service;
  public class ToClient {
                public static void main(String args[]) throws Exception {
                           String urlname = "
http://localhost:8080/axis/SayHello.jws";
                            //这是wsdl的绝对路径.也可以直接写成如下 ,这个没有区别.
                           Service s = new Service();
                            Call call = (Call)s.createCall();
                          call.setOperationName("say");//注意。这里是要调用的方法名
                          call.setTargetEndpointAddress(urlname);//设置调用的目标url
                           String val = (String)call.invoke(new Object[]{"我是Blue’s Boy!"}); //设置调用方法中的参数
                           System.out.println("这是webservice服务器返回给你的:>>>>"+val);
 
                     }
               }

然后引入库,右键工程build path->add externel archives->然后找到axis下lib内的库

右键工程run as->java application,双击它,Main class里选择Toclient,然后运行就可以看到返回结果

 

(2)创建一个文本文件,将代码写入,保存成ToClient.java,放到任意目录,比如c盘,然后运行cmd,然后到保存ToClient.java的目录,

然后javac ToClient.java编译成类文件ToClient.class,然后执行java ToClient (如果需要端口-p8080),然后就可以看到返回的结果了

 

Stubs方式

1、创建一个web Project,然后将axis的lib复制到工程的lib以及web.xml覆盖工程的web.xml

2、写一个简单的服务器类

public class SayHello { 

     public String say(String name){
                        return " Hello ~~" + name;
                    }
                }

3、新建一个deploy.wsdd文件,内容为

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
           xmlns:java="
http://xml.apache.org/axis/wsdd/providers/java">
<service name="stubs" provider="java:RPC">

<parameter name="className" value="SayHello"/>

<parameter name="allowedMethods" value="*"/>

 

 </service>
</deployment>

注:deploy.wsdd中的service name="stubs"可以换成自己想要的名字,server-config.wsdd这个文件内包含的就是webservice上看到的这些服务,所以如果想去掉某个服务,只要去掉server-config.wsdd中的对应的<service></service>就可以

 

4、然后将这个工程发布到tomcat的webapps下,操作步骤:右键工程->myeclipse->add and remove project deployment->add,然后选择之前配置好的tomcat,然后点ok,工程就发布到了tomcat的webapps下

5、进入cmd,然后进入到tomcat的webapps下的刚新发布的工程文件下的web-inf文件,然后输入

java org.apache.axis.client.AdminClient -l http://localhost:8080/axis_example/services/stubs deploy.wsdd

调用AdminClient这个类将deploy.wsdd的service服务stubs发布到http://localhost:8080/axis_example/services站点

并创建更新axis站点的默认发布文件service-config.wsdd,这个service-config.wsdd就是webservice服务默认读取的发布文件

 

 6.webservice站点服务就发布完成,读取流程为

tomcat是一个jsp/servlet容器,创建web工程,都会有web.xml.此时web.xml只是最基础的web站点配置,将axis的lib以及web.xml拷贝到工程,就相当于引入了axis框架,(添加struts框架也是这样,就是引入struts相关的库以及配置web.xml),这个站点一运行就读取web.xml以及引用需要的库,读取配置创建axis的Servlet,它引用的servlet类是org.apache.axis.transport.http.AxisServlet,设置拦截的类型,当客户访问http://localhost:8080/axis_sample/services,跟struts的.do一样,axis只要访问是/services,*.jws,/servlet/AxisServlet,则Servelet就会拦截下来进行处理,读取service-config.wsdd配置,显示发布的服务的wsdl

当客户端访问wsdl文件时,知道是以什么协议,什么类型的方法以及参数进行调用,然后就发送合适的soap请求,由axisServlet处理后返回soap消息,客户端根据wsdl来解析

 

soap是simple object access protocol简单对象访问协议,客户需要这个soap协议来调用公共服务

wsdl是web service decription language web服务描述语言,用于一套标准的方法向外界描述它提供的服务

 

7.写一个类来调用测试发布的webservice 服务

import org.apache.axis.client.Call;
          import org.apache.axis.client.Service;
  public class ToClient {
                public static void main(String args[]) throws Exception {
 
                           String urlname = "
http://localhost:8080/axis_simple/services/stubs?wsdl";
                            //这是wsdl的绝对路径.也可以直接写成如下 ,这个没有区别.
//String urlname=”http://localhost:8080/axis/SayHello.jws?wsdl”
                           Service s = new Service();
 
                            Call call = (Call)s.createCall();
 
                          call.setOperationName("say");//注意。这里是要调用的方法名
 
                          call.setTargetEndpointAddress(urlname);//设置调用的目标url
 
                           String val = (String)call.invoke(new Object[]{"我是Blue’s Boy!"});                  //设置调用方法中的参数
 
                           System.out.println("这是webservice服务器返回给你的:>>>>"+val);
 
                     }
               }

 

注:如果使用到javabean,一个自定义的对象当作参数传递,那么需要在deploy.wsdd在发布服务的时添加一个<typeMapping>来映射类型,作用是序列化参数,就在deploy.wsdd加入:

<typeMapping 
  deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
        encodingStyle=
http://schemas.xmlsoap.org/soap/encoding/
            qname="ns1:user"
       serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
        type="java:com.web.test.UserBean"
        xmlns:ns1="urn:BeanService"
 />

cmd调用java org.apache.axis.client.AdminClient -l http://localhost:8080/axis_simple/services/stubs deploy.wsdd后有一点不同,就是service-config.wsdd里的<service>增加了下面这行代码:

  <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" qname="ns1:user" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" type="java:com.web.test.UserBean" xmlns:ns1="urn:BeanService"/>

站点也发布成功,但是当你测试时,会出错,这是因为服务器端类使用javabean进行了类型序列化的映射后,不允许访问,这就是封装性,为了访问它,需要将webservice的服务类生成可提供调用的接口,进入cmd,进入到工程的web-inf目录,然后:

java org.apache.axis.wsdl.WSDL2Java –p client http://localhost:8080/axis_simple/services/stubs?wsdl

就是将服务映射成接口,并将这些接口类放在client文件夹中,客户需要调用的时候,只需要在将client文件夹复制到工程中就可以。


 

原创粉丝点击