您的位置:首页 > 编程语言 > Java开发

用Java 开发 WebService Axis简单实例

2014-06-29 21:56 609 查看
在开发之前, 先了解一下AXIS,axis目前出现的2版本以其灵活性,快速开发工具的集成高于xfire而使用者居其上.用Eclipse开发,一开始就会想到xfire,它是集成与Eclipse的.所以

开发起来非常方便,现在我们来看看axis的开发是怎么样的? 看完本文后,你可以相互比较一下xfire与它的差别.

首先,创建axis环境 .(注:我事先说明.这是对此版本的基本功能与简单实例的描术)

本人的开发环境eclipse3.2 ,tomcat5.0.28 ,jdk1.4 axis_1.4目前最新版

这里主要讲一下webservice的一个开发过程,

1. 下载axis1.4最新版本http://apache.mirror.phpchina.com/ws/axis/1_4/

2. 将解压后的axis-1_4文件下的webapps目录下的axis目录考到

%TOMCAT_HOME%Webapps/目录下

3. 启动tomcat的.输入路径[b]http://localhost:8080/axis - 打开axis主界面[/b]

4. 点击页面上的[b]Validation ->查看一下你的axis 是否添加了完整的jar文件,注意,这[/b]

里要仔细看一下,自已少了什么 样的
jar文件,有时缺少了文件axis将无法正常工


作.补充一下:这里的xmlsec.jar文件如果缺少的话. 可以到这里

下载 [b]http://xml.apache.org/security/dist/java-library/ c++的与java两个目录.[/b]

下载后把xmlsec-1.4.0.jar考到axis的lib目录下.

上面的步骤如果进行正常将会在Validation页面中就看不到有Error与Warning的

信息.好了,接下来我们开始编写代码

Axis支持三种web service的部署和开发,分别为:

1、Dynamic Invocation Interface ( DII)

2、Stubs方式

3、Dynamic Proxy方式

这里主要讲一下我的开发过程,通过这样过程,你也将初步的掌握axis 开发Webservice

的整体过程.

第一种Dynamic Invocation InterFace(DII) 开发方式

步骤1:打开eclipse创建一个新项目编写一个类.代码如下:

public class SayHello {//这个类没有包,注意了.

public String say(String name){

[b] return " Hello ~~" + name;

}

}
[/b]

步骤2:

编写好上面的类(SayHello.java)后,将源代码copy到%tomcat_home%webapps

/axis/目录下.这里要注意了,只需要把类考备到这个目录下

,然后重命名为:SayHello.jws

步骤3:

打开你的浏览器:http://localhost:8080/axis/SayHello.jws 打开页面后你会看到

Click to see the WSDL <--点击链接,如果你上面的步骤都正常,类也没有带

包的话,那么就生成了wsdl了.

恭喜你!到这里DII方式的服务器端编写完成了.接下来我们来看一下客户端是怎么调

用的

步骤4:DII方式的客户端的调用.

首先将axis/web-inf/lib/目录下的axis.jar,commons-discovery-0.2.jar,

comm.ons-logging-1.0.4.jar导入到刚才的项目中,因为编写客户端时

要用到这些包.客户端代码如下:

package com.huwd.web;

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的绝对路径.也可以直接写成如下 ,这个没有区别.

//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);



}

}


运行结果输出:Hello ~~我是Blue’s Boy;

到此DII调用方式完成!接下来要讲的是第二种方式的调用.请继续学习第二种方式

第二种:Stubs 开发方式(stubs 故名思意,存根的方式)

Stubs 方式相对要复杂一点.不过如果学会了这种方式,嘿嘿,那你开发的时候

 就会明显比第一种方式快了,接下来,跟我一起学吧.

步骤1:

创建环境变量,设置AXIS的环境变量.

这种方式的编码,先要设置一下命令行的环境.右键我的电脑――>属性――>

选择高级选项卡――>新建用户变量――>输入用户变量如下:

变量名:AXIS_LIB

变量值: E:/tomcat5.28/Tomcat 5.0/webapps/axis/WEB-INF/lib(这是本人的)

变量名:CLASSPATH

变量值: .;%AXIS_LIB%/axis.jar;

%AXIS_LIB%/activation.jar;

%AXIS_LIB%/axis-ant.jar;

%AXIS_LIB%/commons-discovery-0.2.jar;

%AXIS_LIB%/commons-logging-1.0.4.jar;

%AXIS_LIB%/jaxrpc.jar;

%AXIS_LIB%/log4j-1.2.8.jar;

%AXIS_LIB%/mail.jar;

%AXIS_LIB%/saaj.jar;

%AXIS_LIB%/wsdl4j-1.5.1.jar;

%AXIS_LIB%/xmlsec-1.4.0.jar;

%AXIS_LIB%/dom4j-1.6.1.jar;

变量名:AXIS_HOME

变量值:E:/tomcat5.28/Tomcat 5.0/webapps/axis

新建好上述的三个变量后.确定退出.

步骤2:

编码开始!这里要稍讲得详细并复杂一点了,我们上面看到了,只设置了一个普通

的参数,这里我就写一下自定义数据类型参数的传递.网上很多文章只讲到了

普通数据类型做参数传递.

 服务器端的编写,代码与注释如下:

 首先定义自定义参数类(第一个类)

package com.web.test;

publicclass UserBean
{//自定义数据类型.

//很简单,只有一个String 与int 型

private String name="";

privateint age ;

publicint getAge()
{

returnage;

}

publicvoid setAge(int age)
{

this.age =
age;

}

public String
getName() {

returnname;

}

publicvoid setName(String
name) {

this.name =
name;

}

}

其次编写第二个类Webservice服务器端类

package com.web.test;

publicclass Server
{//服务器端

//服务端,传递的是一个自定义的数据类型.
UserBean

public String getBeanStr(UserBean bean){

return"You Name:"+bean.getName() +

" , You Age:" + bean.getAge();

}

}

最后编写一个deploy.wsdd文件如下:

<deployment xmlns="http://xml.apache.org/axis/wsdd/"

xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

<!—这里的stubs为wsdd描述符中的ServiceNamespace à

<service name="stubs" provider="java:RPC">

<!—这里的ClassName就是我的服务类了,这个服务主要功能就是传递一个自定义的对象 à

<parameter name="className" value="com.web.test.Server"/>

<!—这里描术的意思是,此服务类中的方法全部享出来.value值为*号 如果你只想让你的

客户端只能调用其中一个方法时,value值改为方法名就可以了.à

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

<!—这个typeMapping 是类型映射,使传递的参数序列化用反序列化,一个自定义类型

在要网络上传递,那就一定得让他序列化. -->

<typeMapping

<!—下面是反序列化类配置à

deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

encodingStyle=http://schemas.xmlsoap.org/soap/encoding/

<!—这是Qname名称的定义.à

qname="ns1:user"

   <!――序列化类配置――>

serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

<!—我的数据参数类型类路径à

type="java:com.web.test.UserBean"

<!—Qname对映的keyà

xmlns:ns1="urn:BeanService"

/>

</service>

</deployment>

到这一步,我们的服务端配置完成,整理一下思路,stubs方式调用需要

(这里主要是为了讲述自定义类的对像传递)

    1.一个自定义类.2,一个服务端类,3.一个wsdd文件服务描术符.OK接着看.

将上面写好的两个类的class文件复制到/axis/web-inf/class目录下,只要把整个包复制过来就

行了,然后在把deploy.wsdd文件复制到/axis/web-inf/目录下.

打开控制台进入你的axis目录:

>cd E:/tomcat5.28/Tomcat 5.0/webapps/axis/WEB-INF (我的目录)

>java org.apache.axis.client.AdminClient

–lhttp://localhost:8080/axis/services/stubs deploy.wsdd

(说明: stubs就是刚才我们在deploy.wsdd文件里配置的<service name="stubs" )

这里是关键.这个命令就是发布这个服务.你只需这样理解它.发布成功后,你在看下你的

Axis/web-inf/目录下,多了一个server-config.wsdd文件,你可打开它看下里成的描述符

是不是跟我们写的deploy.wsdd相类似呢?

如果发布失败,那么在控制台下你将会看到一些错误信息,并仔细的解决它.

(注:一般错误的原因有这么几点,我个人在开发学习时,可能是类路径没有写对,也

可能是你的<service name="stubs" 这个名称有点错误,你要么改成别的名称试试

也有可能是你的wsdd文件里面写得不规范,最后可能就是你的命令无效,

ClassNotFoundException 错误,这个错误是因为你没有配置好axis的环境造

成的.)

发布成功后在控制台下会有提示:

Processing file deploy.wsdd

<Admin>Done processing</Admin>

OK当您发布成功后.可以开始往下写了.

步骤3:

嘿.完成了上面两个步骤,接下来的工作就是很轻松的了,我们来生成一个客户端

>cd E:/tomcat5.28/Tomcat 5.0/webapps/axis/WEB-INF (我的目录)控制台命令

>java org.apache.axis.wsdl.WSDL2Java –p client http://localhost:8080/axis/

services/stubs?wsdl

打开axis/web-inf/目录下可以看到生成了一个client目录,OK,复制client目录,到你

的项目中.这个client就是我们的客户端代码了.

Client目录生成了:

Server.java

ServerService.java

ServerServiceLocator.java

StubsSoapBindingStub.java

User.java

java文件;

接下来的工作就是编写一个调用类测试.代码与注释如下

package myclient;

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;

publicclass Test
{

publicstaticvoid main(String
[]args) throws Exception {

QName qname = new QName("urn:BeanService","user");

Service s = new Service();

Call call = (Call)s.createCall();

//注册这个bean为可序列化的.传递参数

call.registerTypeMapping(User.class,
qname, new BeanSerializerFactory(User.class,qname), newBeanDeserializerFactory(User.class,qname));

//设置一下调用方法名.不设置肯定会报错的哦

call.setOperationName("getBeanStr");

//设置一下这个服务的绝对路径.

call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/services/stubs?wsdl"));

//实例化一个User,这个User是生成出来的User哦.,不是原先那个,

User u = new User();

u.setAge(23);

u.setName("do WebService!");

//通知方法,并返回结果

String str = (String)call.invoke(new Object[]{u});

System.out.println(str);

//out.print ==> You Name:do WebService! , You Age:23

}

}

好了,这下完成了stubs的方式.看起来很累,其实当你开发第二个例子的时候

就不会这么累了.我已经满头大汗了,公司没开空调.

接下来就是第三种方式了,其实第三种方式更简单了,我这里还是稍微讲一下:

第三种: Dynamic Proxy方式 (代理方式)

这个例子就以第一种方式为基础,因这服务端类的编写是一样的.

那么服务端类就是第一种方式的类了,(完成第一种方式的3个步骤)

主要讲一下客户端通过代理接口的方式调用.

接口这义

import java.rmi.Remote;

import java.rmi.RemoteException;

publicinterface SayHelloInter extends Remote{

public String say(String
name) throws RemoteException;

}

//客户端的调用类如下:

import java.net.URL;

import javax.xml.namespace.QName;

import javax.xml.rpc.Service;

import javax.xml.rpc.ServiceFactory;

publicclass Test2 {

publicstaticvoid main(String
[]args) throws Exception{

String wsdlname = "http://localhost:8080/axis/SayHello.jws?wsdl";

//服务路径

String namespaceUrl = "http:// localhost:8080/axis/SayHello.jws";

//服务名

String serviceName = "SayHelloService";

//服务

String portName = "SayHello";

//创建代理对像

ServiceFactory service = ServiceFactory.newInstance();

//创建远程服务

Service s = service.createService(new URL(wsdlname), new QName(namespaceUrl,serviceName));

//向上转型为接口

AxisWebInter inter = (AxisWebInter)s.getPort(new QName(namespaceUrl,portName), AxisWebInter.class

);

System.out.println(inter.getName("Blue
boy!"));

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: