Axis2发布webservice(1)--0配置发布

Axis2发布webservice(1)--0配置发布webservice

一、 准备工作

1、下载axis2程序包:   http://axis.apache.org/axis2/java/core/download.cgi

     下载时选择Binary Distribution版本的zip格式文件和WAR Distribution的zip格式文件,总共2个zip文件:

     axis2-1.6.2-bin.zip:包含axis2是所有jar包,再编程时根据需要将解压后的lib文件夹下的相应的jar包添加到build path中;

     axis2-1.6.2-war.zip:用于将WebService发布到Web容器中。

  

   解压axis2-1.6.2-war.zip,将目录中的axis2.war文件放到<Tomcat安装目录>\webapps目录中(本文使用的Tomcat的版本是8.x),并启动Tomcat。

在浏览器中输入:http://localhost:8080/axis2/,出现如下欢迎界面则表示安装成功:

    

 

2、下载和安装axis2的eclipse插件: http://yunpan.cn/QCJ4ESKJIscc3(提取码:f733)

     下载到的是一个axis2_eclipse_codegen & service_plugin.zip文件,解压,得到2个zip文件,继续解压,得到plugins文件夹,将该文件夹下的文件复制到eclipse根目录下的plugins文件夹下。

     重启eclipse,点击file->new->other->Axis2 Wizards会看到如下效果,:

 

3、分析axis2-bin文件目录结构,解压axis2-1.6.2-bin.zip文件得到的目录结构如下:

-bin文件夹是axis2的常用工具,其中有将wsdl文件转换成客户端调用的wsdl2java工具及将java转换成wsdl文件的工具

-conf存放axis2的配置文件(XML文件)

-lib存放运行所要的依赖库(jar文件)

-repository存放是发布过的axis服务和文件

-sample寸存放的是示例

-webapp存放web文件和jsp页面等

 

二、 Axis2的简单WebService示例

1、在eclipse里面新建一个java project,添加一个HelloWorldService的简单类,书写如下代码:

import java.util.Random;

public class HelloWorldService {

    public String sayHello(String name) {

        return name + " say: hello [axis2]";

}

public int getAge(int i) {

        return i + new Random().nextInt(100);

}}

注意,利用0配置的方法发布webservice时,要被发布为webservice的类是不能放在任何package下的。比如HelloWorldService没有放在任何package下。

在编写完webservice之后,我们需要编译该java文件,得到最终我们需要的class文件(发布的是class文件)。可以在该类中新添加一个空的main方法,然后在该类上右键->run as->java application,运行完成之后,在eclipse的workspace的该项目文件夹下的bin目录中可以找到所需的HelloWorldService.class文件。

 

2、复制该class文件到tomcat目录下的webapps\axis2\WEB-INF\pojo文件夹下。如果没有pojo这个目录就手动创建一个opjo文件夹。然后在浏览器输入:

http://localhost:8080/axis2/点击Services的链接,或者直接在浏览器地址栏输入:http://localhost:8080/axis2/services/listServices

就可以看到我们发布的WebService了,因为该类中的两个方法都是public方法,所以这两个方法都被发布成webservice接口。

 

点击链接可以查看该service的wsdl文件内容。(wsdl即webservicedefinition language,是webservice的定义语言)

 

三、改变webservice的发布目录:

    打开axis2的配置文件:[tomcat_home]/webapps/axis2/WEB-INF/conf/axis2.xml

    该文件中有这样一行代码:

    <deployer extension=".class" directory="pojo" class="org.apache.axis2.deployment.POJODeployer"/>,

    表示POJO目录可以存放发布为webservice的class文件。我们可以自定义一个发布目录,比如,在:[tomcat_home]/webapps/axis2/WEB-INF/目录下新建一个my_service文件夹,然后在axis2.xml中添加一条语句:

<deployer extension=".class" directory="my_service" class="org.apache.axis2.deployment.POJODeployer"/>,

    就可以在my_service中发布class文件了。自定义的文件夹和POJO文件夹是等价的,不能同时在两个文件夹中发布名字一样的webservice。

 

四、浏览器访问WebService:

     在浏览器中访问:http://localhost:8080/axis2/services/HelloWorldService/sayHello?name=jack;其中,http://localhost:8080/axis2/services/HelloWorldService这个是WebService的网络地址。/sayHello是方法名称,?name=jack是参数名称和值。

     在浏览器中输入上面的地址后,可以看到如下效果:

 

ns:sayHelloResponse是方法名称,所有的方法名称后都会带上Response。后面的ns:http://ws.apache.org/axis2当前方法在服务器中的位置。这里是默认的package,即默认的axis2的域名。

同样,getAge方法,也是一样的调用方法。

http://localhost:8080/axis2/services/HelloWorldService/getAge?i=22

结果如下:

 

五、axis2的热发布和热更新

Axis2在默认情况下可以热发布WebService,也就是说,将WebService的.class文件复制到pojo目录中时,Tomcat不需要重新启动就可以自动发布WebService。如果想取消Axis2的热发布功能,可以打开<Tomcat安装目录>\webapps\axis2\WEB-INF\conf\axis2.xml,找到如下的配置代码:

 

<parameter name="hotdeployment">true</parameter>

 

将true改为false即可。要注意的是,Axis2在默认情况下虽然是热发布,但并不是热更新,也就是说,一旦成功发布了WebService,再想更新该WebService,就必须重启Tomcat。这对于开发人员调试WebService非常不方便,因此,在开发WebService时,可以将Axis2设为热更新。在axis2.xml文件中找到

 

<parameter name="hotupdate">false</parameter>,

 

将false改为true即可。

六、客户端访问webservice

    WebService是为程序服务的,只在浏览器中访问WebService是没有意义的。因此,使用Java实现了一个控制台程序来调用发布的WebService。在HelloWorldService项目文件的src目录下创建一个包client,在client包里新建一个RPCClient类,因为访问webservice需要用到axis2的库文件,所以需要先将axis2解压目录下的lib文件夹中的jar文件添加到build path

    书写代码如下:

 

package client;

import javax.xml.namespace.QName;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class RPCClient{
    public static void main(String[] args) throws Exception{

        //  使用RPC方式调用WebService
        RPCServiceClient serviceClient = new RPCServiceClient();
        Options options = serviceClient.getOptions();

        //  指定调用WebService的URL
        EndpointReference targetEPR = new EndpointReference(
                "http://localhost:8080/axis2/services/HelloWorldService");
        options.setTo(targetEPR);

        //  指定getGreeting方法的参数值
        Object[] opAddEntryArgs = new Object[] {"超人"};
        //  指定getGreeting方法返回值的数据类型的Class对象
        Class[] classes = new Class[] {String.class};

         //  指定要调用的SayHello方法及WSDL文件的命名空间
        QName opAddEntry = new QName("http://ws.apache.org/axis2", "SayHello");

        //  调用SayHello方法并输出该方法的返回值
        System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);

       //  下面是调用getAge方法的代码,这些代码与调用getAge方法的代码类似
        classes = new Class[] {int.class};
        opAddEntry = new QName("http://ws.apache.org/axis2", "getAge");
        System.out.println(serviceClient.invokeBlocking(opAddEntry, new Object[]{new Integer(22)}, classes)[0]);
    }
}

    RPCClient.java是本地的一个Java文件,它的主要任务就是访问webservice,直接在eclipse中右键该类->run as –>java applicaton,运行得到如下结果:

 

   超人,say hello

    51

 

    RPCServiceClient类通过invokeBlocking方法调用WebService中的方法。invokeBlocking方法有三个参数:

    第一个参数的类型是QName对象,表示要调用的方法名;QName类的构造方法的第一个参数表示WSDL文件的命名空间名,第2个是方法名。

    第二个参数表示要调用的WebService方法的参数值,参数类型为Object[];

    第三个参数表示WebService方法的返回值类型的Class对象,参数类型为Class[]。

    当方法没有参数时,invokeBlocking方法的第二个参数值不能是null,而要使用new Object[]{}。

  

     如果被调用的WebService方法没有返回值,应使用RPCServiceClient类的invokeRobust方法,该方法只有两个参数,它们的含义与invokeBlocking方法的前两个参数的含义相同。

七、 返回复杂对象类型的WebService

webservice不仅可以返回基本类型返回值,还能返回数组、对象等复杂类型的返回值。

下面的WebService返回值是自定义的JavaBean对象、一维数组、二维数组。

在eclipse总新建java project,命名为ComplexTypeService,

首先在src目录下新建一个data包,在data包下新建User类,因为User类知识webservice需要引用的一个自定义类,不是要发布的webservice,所以可以将User类添加到包中,User类代码如下:

package data;

import java.io.Serializable;

public class User implements Serializable {

    private static final long serialVersionUID = 677484458789332877L;

    private int id;

    private String name;

    private String email;

    private String address;

getter和setter方法省略...................

    @Override

    public String toString() {

    return this.id + "#" + this.name + "#" + this.email + "#" + this.address;

}

}

上面的类实现了Serializable接口,如果不知道怎么添加serialVersionUID,可以先不定义变量,eclipse会给出错误提示,在提示上右键选择相应的选项就行了。

eclipse中还提供了自动添加setter和getter的方法:按住shift+Alt+s键,选择generate setter and getter根据提示操作就行了,tostring()和构造方法也可以用相同的方法添加。

 

然后在src目录的默认package下新建一个java类,ComplexTypeService.java(不能给该webservice类添加包声明),添加如下代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;

import data.User;

/**
 * 复杂数据类型的WebService,返回数组和JavaBean
 * */
public class ComplexTypeService {

    /*将字节保存到本地jsp文件中*/
    public String upload4Byte(byte[] b,int len){

        //输出文件路径
        String path = "";

        //文件输出流
        FileOutputStream fos = null;

        //此处用户工作目录为服务器的bin目录,比如我的是F:\install\tomcat8.0\apache-tomcat-8.0.9\bin\
        String dir = System.getProperty("user.dir"); 

        //新建file对象
        File file = new File(dir + "/" +(new Random().nextInt(100))+".jsp");

        try {
            fos = new FileOutputStream(file);

            //输出字节到文件
            fos.write(b,0,len);

            //获取文件的绝对路径
            path = file.getAbsolutePath();

            System.out.println("File path:"+path);

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }finally{//finally可以保证文件输出流正常关闭

            try{
                //关闭文件输出流
                fos.close();

            }catch(IOException e){

                e.printStackTrace();
            }
        }
        return path;
    }

    /*根据参数新建数组并返回*/
    public int[] getArray(int i){

        int[] arr = new int[i];

        //遍历数组给其元素赋予随机整数值
        for(int j=0;j<i;j++){

            arr[j] = new Random().nextInt(1000);
        }

        return arr;
    }

    /*返回多维字符串数组*/
    public String[][] getTwoArray(){

        return new String[][]{
                {"中国","北京"},
                {"日本","东京"},
                {"中国","上海","南京"}
        };
    }

    /*返回自定义对象*/
    public User getUser(){

        //自定义User对象
        User user = new User();

        //设置属性值
        user.setAddress("China");
        user.setName("jack");
        user.setEmail("[email protected]");
        user.setId(22);

        return user;
    }
}

 

在这个类中引用了data包中的User类,因此在eclipse中编译了所有类之后,ComplexTypeService.class放到POJO目录下。User.class放到[tomcat安装目录]\webapps\axis2\WEB-INF\data目录下,如package有多层,比如com.server.test等,就要将class文件放到[tomcat安装目录]\webapps\axis2\WEB-INF\com\server\test目录下。否则你的WebService将会出现ClassNotFontException异常。虽然axis2支持热部署,但是引用了自定义类的webservice在发布之后,需要重启tomcat。可以在浏览器中测试该webservice,不再赘述。

 

复杂类型客户端代码下:

package service.client;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.xml.namespace.QName;

import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

import data.User;

public class ComplexTypeServiceClient {

    public static void main(String[] args) throws IOException {

        //实例化RPC访问对象,并获取Options对象
        RPCServiceClient client = new RPCServiceClient();
        Options options = client.getOptions();

        //webservice的网络地址
        String address = "http://localhost:8080/axis2/services/ComplexTypeService";

        //实例化EPR对象,将客户端指向该webservice
        EndpointReference epr = new EndpointReference(address);
        options.setTo(epr);

        //方法upload4Byte在服务器上相应命名空间中的位置
        QName qname = new QName("http://ws.apache.org/axis2", "upload4Byte");

        //从本地读取文件,将byte数据存入数组
        String path = System.getProperty("user.dir");
        File file = new File(path + "/WebRoot/index.jsp");
        FileInputStream fis = new FileInputStream(file);
        int len = (int) file.length();
        byte[] b = new byte[len];
        fis.read(b);
        fis.close();

        //访问webservice,调用upload4Byte方法
        Object[] result = client.invokeBlocking(qname, new Object[] { b, len }, new Class[] { String.class });
        System.out.println("upload:" + result[0]);

        //方法getArray在服务器上相应命名空间中的位置
        qname = new QName("http://ws.apache.org/axis2", "getArray");
        result = client.invokeBlocking(qname, new Object[] { 3 },new Class[] { int[].class });
        int[] arr = (int[]) result[0];
        for (Integer i : arr) {
            System.out.println("int[] :" + i);
        }

        //方法getTwoArray在服务器上相应命名空间中的位置
        qname = new QName("http://ws.apache.org/axis2", "getTwoArray");
        result = client.invokeBlocking(qname, new Object[] {}, new Class[] { String[][].class });
        String[][] arrStr = (String[][]) result[0];
        for (String[] s : arrStr) {
            for (String str : s) {
                System.out.println("String[][]: " + str);
            }
        }

        //方法getUser在服务器上相应命名空间中的位置
        qname = new QName("http://ws.apache.org/axis2", "getUser");
        result = client.invokeBlocking(qname, new Object[] {}, new Class[] { User.class });
        User user = (User) result[0];
        System.out.println("User: " + user);
    }    }

在eclipse中运行代码的结果是:


upload:D:\tomcat-6.0.28\bin\28.jsp

int[] :548

int[] :201

int[] :759

String[][]: 中国

String[][]: 北京

String[][]: 日本

String[][]: 东京

String[][]: 中国

String[][]: 上海

String[][]: 南京

User: 22#jack#[email protected]#china

Axis2发布webservice(1)--0配置发布

时间: 2024-10-24 19:43:43

Axis2发布webservice(1)--0配置发布的相关文章

Axis2发布webservice(2)--利用eclipse的axis2插件打包为arr发布

一.编写webservice的java文件 在eclipse中新建java project,然后新建一个java类,我这里命名为:ManagerUserService.java,源代码: package com.hoo.service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import

tomcat 用AXIS2发布WebService 网站的方法

Axis2+tomcat7.0 实现webService 服务端发布与客户端的调用. Aixs2开发webService的方法有很多,在此只介绍一种比较简单的实现方法. 第一步:首先要下载开发所需要的jar包 下载: axis2-1.6.2-war.zip  http://www.apache.org/dist//axis/axis2/Java/core/1.6.2/ 下载完后将axis2.war放至tomcat安装目录下的webapps文件夹下,然后启动tomcat后,在webapps目录下会

用AXIS2发布WebService的方法(转)

Axis2+tomcat6.0 实现webService 服务端发布与客户端的调用. 第一步:首先要下载开发所需要的jar包 下载:axis2-1.6.1-war.zip http://www.apache.org/dist//axis/axis2/java/core/1.6.1/ 下载完后解压至tomcat安装目录下的webapps文件夹下,启动tomcat后,在webapps目录下会生成axis2文件夹. 访问http://localhost:8080/axis2/能看到以下页面表示axis

C# vs2010发布webservice

因为vs2010操作起来比较方便,有些使用大家比较熟悉了,介绍的比较少,我在最开始发布webservice的时候也是遇到了不少问题,这边记录一下.使用的IDE是vs2010,做的是本机发布. 总体讲发布webservice分为三步 编译发布webservice. 安装配置IIS 调试 编译发布webservice 编译好理解,就是创建webservice工程,写代码,进行编译.怎么创建可以参看. http://mingsuper.blog.51cto.com/8269088/1438850 然后

【webservice】发布axis2的webservice服务端

axis2版本:axis2-1.5.4 准备工作:下载axis2-1.5.4-war.zip(生成服务端).axis2-1.5.4-bin.zip(axis2的jar包),jdk5(及以上版本).tomcat(端口我设成8086了) 手把手超级详细介绍axis2的webservice服务端的生成与发布. 1. 解压axis2-1.5.4-war.zip得axis2.war,把axis2.war放到tomcat的webapps目录, 启动tomcat就能加载axis2.war并生成新的axis2目

spring与axis2整合发布webservice

最近在研究整合spring框架和axis2发布webservice服务,由于本人也才学java不久,为了便于以后的查看,在这里记录下发布过程. 所需的工具包,spring.jar和axis2链接地址为http://pan.baidu.com/s/1gdgVBoB,这里发布服务只需要两个包,spring-framework-3.2.1.RELEASE-dist.zip和axis2-1.6.2-war.zip.首先解压axis2-1.6.2-war.zip,得到axis2.war文件,放入tomca

JAVA利用axis2发布webservice

Axis2与CXF是现在很主流的WebService开发框架(java6也已经支持了),项目上还都是基本上用前两种做开发,今天记录一下我安装Axis2插件在eclipse中的安装和写一个简单的测试代码. 一. eclipse的版本为Luna Release (4.4.0) Axis2的版本是1.6.2 下载地址为: 1).Axis2 Binary Distribution(1.6.2):http://mirror.bjtu.edu.cn/apache//axis/axis2/java/core/

Axis2发布webservice(4)&mdash;webservice的异步调用

一,发布一个webservice,代码如下 package com.hoo.service; public class AsynchronousService { public String execute() throws InterruptedException{ //让当前线程睡眠5钟,展示异步调用 Thread.sleep(5000); return "done"; } } 二.发布Service,参见前面教程,不多讲 三.RPC方式异步调用: import java.io.I

Eclipse中Axis2发布WebService

介绍:Axis是apache下一个开源的webservice开发组件. l  开发工具下载: 1.  eclipse的Java EE版本.下载地址:http://www.eclipse.org/downloads/ 2.  axis2.下载地址:http://axis.apache.org/axis2/java/core/download.cgi 3.  eclipse的两个axis2插件: Axis2_Codegen_Wizard Axis2_Service_Archiver. 下载地址:ht