用 Java 开发 WebService Axis 简单实例
在开发之前, 先了解一下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 的 . 输入路径 http://localhost:8080/axis - 打开 axis 主界面
4. 点击页面上的 Validation -> 查看一下你的 axis 是否添加了完整的 jar 文件 , 注意 , 这
里要仔细看一下 , 自已 少了什么 样的 jar 文件 , 有时缺少了文件 axis 将无法正常工
作 . 补充一下 : 这里的 xmlsec.jar 文件如果缺少的话 . 可以到这里
下载 http://xml.apache.org/security/dist/java-library/ c++ 的与 java 两个目录 .
下载后把 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;
}
}
步骤 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;
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"
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;
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 !
用Java 开发 WebService Axis简单实例相关推荐
- java开发webservice简单实例_jsp实现的webservice的简单实例
jsp webservice用到的比较少但是用到就是一个大东西了经常用过其它的api形式了而webservice用到不多,下面我们来看一篇关于jsp实现的webservice的简单实例吧,具体如下. ...
- webservice实例java_Java WebService(实战) 简单实例
一.准备工作(以下为本实例使用工具) 1.MyEclipse10.7.1 2.JDK 1.6.0_22 二.创建服务端 1.创建[Web Service Project],命名为[TheService ...
- webservice java教程_[Java教程]JAVA开发Webservice——JAXB
[Java教程]JAVA开发Webservice--JAXB 0 2016-01-19 17:00:04 JAXB(Java API for JAXB 可以实现Java对象与 下面来了解一下如何通过标 ...
- vue 调用webservice_js跨域调用WebService的简单实例
步骤1. 在web.config中的system.web节点里加入 步骤2.webservice代码 using System; using System.Collections.Generic; u ...
- Appium+Java环境搭建及简单实例
Appium+Java环境搭建及简单实例 一.下载jdk并配置好环境 二.下载Android-sdk并配置好环境 三.下载Eclipse软件 四.下载Node.js 下载地址:https://node ...
- java开发webservice的几种方式
为什么80%的码农都做不了架构师?>>> webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录. 1.Axis ...
- Java开发WebService(使用Java-WS)
前言: 初学Java,因为工作需要,直接跳到开发WebService.以前用.NET开发过WebService,对比一下,Java的WebService开发部署难度高了不止一个档次.网上的教程各式各异 ...
- java 开发webservice
这几天用java开发一个webservice,搞死了.java果然很难侍候! 传说java搞webservice,有好几种途径(为什么不是一种?要搞这么多种,让人一听,头都大了.当然啦,生物多样性总是 ...
- 使用CXF发布WebService服务简单实例
一.说明: 前面介绍了使用axis2来发布Webservice服务,现在介绍一种更popular,更高效的Webservice服务发布技术:CXF Apache CXF = Celtix + XFir ...
最新文章
- oracle rac对心跳要求_关于心跳网络引起的Oracle RAC的节点驱逐(不是实例驱逐)...
- mysql tomcat 自动重连_基于tomcat+mysql的c/s模式下的系统自动更新
- linux libffi 简介 高级语言互调库
- Qt下使用Shader绘制三角形
- ubuntu 11.10上安装osdlyrics 歌词插件
- Android短视频中如何实现720P磨皮美颜录制
- PHP生成缩略图函数
- [转载] python+selenium定时爬取丁香园的新冠病毒每天的数据,并制作出类似的地图(部署到云服务器)
- linux 源代码安装mysql5.5_linux下通过源码包安装MySql5.5
- citrix服务器共享文件夹,如何使用citrix XenApp 发布远程共享文件夹,及其故障解决...
- Vue 自定义指令里面获取Vue实例 实现v-copy与i18n结合。
- 武汉科技大学计算机学院培养方案,武汉科技大学培养方案.DOC
- COJ 0358 xjr考考你数据结构(根号3)线段树区间修改
- WEB--3D立体魔方小游戏 (附源码)
- 学生鲜花网页设计作品静态HTML网页模板源码 大学生鲜花商城网站制作 简单鲜花网站网页设计成品
- 元宇宙也“炒房”?多个二手交易网站屏蔽元宇宙关键词
- Chrome 护眼插件
- 苹果a12_苹果扛起性价比大旗,A12+512GB,大降5000元
- MATLAB绘图_1绘制衰减震荡曲线
- 大话 AliPay踩的坑
热门文章
- P 算法与 K 算法
- 拉新促活:社交平台唤醒App的高效策略
- java.net.UnknownHostException: mybatis-plus
- python实现给视频添加字幕,并根据字幕添加语音
- 一周玩转示波器(六)
- Docker 安装最新版禅道16.5版本 原创
- Java基础3-循环
- 地图配色及网络地图比较
- PFO(DMP end capped) cas:195456-48-5聚合物光电材料
- Android事件分发简单介绍