用
Java
开发
WebService Axis
简单实例
在开发之前, 先了解一下AXIS,axis目前出现的2版本以其灵活性,快速开发工具的集成高于xfire而使用者居其上.用Eclipse开发,一开始就会想到xfire,它是集成与Eclipse的.所以
开发起来非常方便,现在我们来看看axis的开发是怎么样的? 看完本文后,你可以相互比较一下xfire与它的差别.
首先,创建axis环境 .
(
注
:
我事先说明
.
这是对此版本的基本功能与简单实例的描术
)
本人的开发环境
eclipse3.2 ,tomcat5.0.28 ,jdk1.4 axis_1.4
目前最新版
这里主要讲一下
webservice
的一个开发过程
,
2.
将解压后的
axis-1_4
文件下的
webapps
目录下的
axis
目录考到
%TOMCAT_HOME%Webapps/
目录下
里要仔细看一下
,
自已
少了什么
样的
jar
文件
,
有时缺少了文件
axis
将无法正常工
作
.
补充一下
:
这里的
xmlsec.jar
文件如果缺少的话
.
可以到这里
下载后把
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){
return " Hello ~~" + name;
}
}
return " Hello ~~" + name;
}
}
步骤
2
:
编写好上面的类
(
SayHello.java
)
后
,
将源代码
copy
到
%tomcat_home%webapps
/axis/
目录下
.
这里要注意了
,
只需要把类考备到这个目录下
,
然后重命名为
:
SayHello.jws
步骤
3
:
打开你的浏览器
:http://localhost:8080/axis/SayHello.jws
打开页面后你会看到
包的话
,
那么就生成了
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;
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 的绝对路径 . 也可以直接写成如下 , 这个没有区别.
//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);
}
}
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;
public
class
UserBean {
//
自定义数据类型
.
//
很简单
,
只有一个
String
与
int
型
private
String
name
=
""
;
private
int
age
;
public
int
getAge() {
return
age
;
}
public
void
setAge(
int
age) {
this
.
age
= age;
}
public
String getName() {
return
name
;
}
public
void
setName(String name) {
this
.
name
= name;
}
}
其次编写第二个类
Webservice
服务器端类
package
com.web.test;
public
class
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"
<!—
这是
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 (
我的目录
)
控制台命令
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;
public
class
Test {
public
static
void
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),
new
BeanDeserializerFactory(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;
public
interface
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;
public
class
Test2 {
public
static
void
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!"
));
}
}
//Out.print Hi~~ Blue boy!
好了,到现在为止三种调用方式都描术完了,不知道你有没有学会.如果还有什么问题,可
以给我留言,我会给你及时回复.如有不对的地方请指出.
Thank you !