【Java】Axis1.4 简单样例

382 阅读2分钟

Axis1.4,都什么年代了还用这种技术吗?No,这只是将以前开发过程中遇到的关于Axis的使用样例搬过来而已(初发表2016年5月)

Axis安装

从Apache官网下载Axis项目,解压后将axis文件夹部署到Tomcat的webapps目录下,如下图:

1.png

PS:这个时候还在用tomcat6,这个东西有多旧可想而知。

进入${TOMCAT_HOME}\webapps\axis\WEB-INF\web.xml中可以看到的配置信息如下所示:

<listener>
    <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>AxisServlet</servlet-name>
        <display-name>Apache-Axis Servlet</display-name>
        <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>AdminServlet</servlet-name>
        <display-name>Axis Admin Servlet</display-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>
        <display-name>SOAPMonitorService</display-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>
  ...

从配置得知,AxisServlet和SOAP监控服务都会在Tomcat启动后100ms后自动启动并且访问AxisServlet路径为“/servlet/AxisServlet”和“/services/*”,文件后缀为jws。而SOAP监控服务访问地址为“/SOAPMonitor”,访问端口5001。

编写WebService服务端

public class HelloWorldServer {
   public HelloWorldServer(){
          System.out.println("--这是我的HelloWorldServer的构造函数--");
   }

   public String outputSay(String msg){
          return "Hello, " + msg + "!";
   }
}

服务端代码编写完成后即可进行部署,部署有两种方式。

方法1(直接将文件放入Tomcat内部署)

直接将HelloWorldServer.java文件拷贝到${TOMCAT_HOME}\webapps\axis目录下,直接重命名为HelloWorldServer.jws

有以下两点需要注意:
1. HelloWorldServer.java不能放在package中;
2. 有部分版本需要将${JAVA_HOME}\lib\tools.jar拷贝到${TOMCAT_HOME}\webapps\axis\WEB-INF\lib目录下;

之后就可以通过浏览器输入路径访问

http://localhost:8088/axis/HelloWorldServer.jws?wsdl

如果真的要使用这种方法那最起码要写个脚本在部署时将Java文件拷贝到Tomcat对应目录下。

方式2(项目编码部署)

  1. 创建一个新项目,并将axis相关的jar包引入到项目里面,接着就可以将HelloWorldServer.java放到io.yzh.ws包中。

  2. 接着写一个deploy.wsdd文件,如下图所示:

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
     <service name="HelloWorldServer" provider="java:RPC">
          <parameter name="className" value="io.yzh.ws.HelloWorldServer" />
          <parameter name="allowedMethods" value="*" />
          <parameter name="scope" value="application" />
     </service>
</deployment>
  1. 通过Axis提供的客户端工具org.apache.axis.client.AdminClient,可将HelloWorldServer部署到Tomcat。默认情况下Axis会寻址http://localhost:8080/axis,可以通过“-p” 参数指定其它端口。上面示例中webservice部署描述文件是deploy.wsdd,Tomcat端口是8088。运行后,可以看到${TOMCAT_HOME}\webapps\axis\WEB-INF目录下多了一个server-config.wsdd文件,打开后可以看到刚才写的deploy.wsdd的内容。

  2. 将编译后的HelloWorldServer.class部署到${TOMCAT_HOME}\webapps\axis\WEB-INF\classes目录。

  3. 在浏览器中输入:http://localhost:8088/axis/services/HelloWorldServer?wsdl即可访问.

编写WebService客户端

package io.yzh.ws;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class HelloServerClient {
     public static void main(String[] args) {
         try {
            String endpoint = "http://localhost:8088/axis/services/HelloWorldServer";
            Service service = new Service();
            Call call = (Call)service.createCall();
            call.setTargetEndpointAddress(new java.net.URL(endpoint));
            call.setOperationName(new QName("http://ws.yzh.io", "outputSay"));
            String rtn = (String)call.invoke(new String[]{"yzh你知道么"});
            System.out.println("Hello user, you send message to service and return '"+rtn+"'");
         } catch (Exception e) {
            e.printStackTrace();
         }
     }
}

执行输出 :

Hello user, you send message to service and return 'Hello, yzh你知道么!'

卸载WS服务

  1. 编写undeploy.wsdd文件
<undeployment name="test" xmlns="http://xml.apache.org/axis/wsdd/">
   <service name="HelloWorldServer"/>
</undeployment>
  1. 利用AdminClient工具执行卸载操作

  2. 执行成功后,可以看到server-config.wsdd中已经没了刚才的HelloWorldServer的描述

AdminClient常用方法介绍

1. 发布webservice服务到服务器端

deploy.wsdd –p 8088

2. 从服务器取消webservice服务

undeploy.wsdd -p 8088

3. 查看服务器所提供的所有的webservice服务列表

list -p 8088

4. 将ws部署到指定的WEB项目(要先将.jar及web.xml拷贝到自己的项目中来)

deploy.wsdd –p 8088 –s MyWebProject/servlet/AxisServlet