首页 > 编程语言 >用Java 开发 WebService Axis简单实例

用Java 开发 WebService Axis简单实例

时间:2023-09-26 18:03:21浏览次数:49  
标签:Java String jar WebService import apache java Axis axis


[code]
本人的开发环境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
变量值: D:\diaoer_beyondsoft\tools\tomcat6.0\apache-tomcat-6.0.20\webapps\axis\WEB-INF\lib(这是我自己的,你改成你的就可以了)
变量名:classpath
变量值:.;%axis_lib%\activation.jar;%axis_lib%\axis.jar;%axis_lib%\axis-ant.jar;%axis_lib%\commons-discovery-0.2.jar;%axis_lib%\commons-logging-1.1.1.jar;%axis_lib%\jaxrpc.jar;%axis_lib%\log4j-1.2.8.jar;%axis_lib%\mailapi-13-1.jar;%axis_lib%\saaj.jar;%axis_lib%\wsdl4j-1.5.1.jar;%axis_lib%\xercesImpl-2.6.2.jar;(同上) 注意这里要用commons-logging-1.1.1.jar包,因为如果用commons-logging-1.0.4.jar包可能会出现Exception in thread "main" java.lang.NoClassDefFoundError: org.apache.commons.logging.LogFactory...错误的。
变量名:axis_home
变量值:D:\diaoer_beyondsoft\tools\tomcat6.0\apache-tomcat-6.0.20\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"Your Name:"+bean.getName() + 

 " , Your 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="ns1:user" 

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

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

 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 D:\diaoer_beyondsoft\tools\tomcat6.0\apache-tomcat-6.0.20\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), 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; 

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!")); 

 } 

} 


[/code]

标签:Java,String,jar,WebService,import,apache,java,Axis,axis
From: https://blog.51cto.com/u_16087012/7611134

相关文章

  • 修改java项目启动后在jps展示的名称
    问题在服务器上启动jar包的时候,通过jps查看java进程只展示个jar解决,指定jar包的全路径java-jar/root/test/aaa.jarjps查看494976aaa.jarmaven打包修改jar名称修改build下的finalName即可:<build><finalName>springboot-yida-aaa</finalName></build>......
  • JavaScript——判断0, NaN, false, null, underfined, 空字符串
    1.判断NaN//NaN出现的原因:(NotaNumber)//操作两个类型不一致的数、用NaN值计算最终得到NaN、不合法运算(如0/0)letnum=0/0;if(isNaN(num)){console.log("num为NaN!")}2.判断undefinedlettemp=undefined//方法一if(typeof(temp)=="undefined"......
  • java八股文
     java的单继承,实现runable接口,本质上都是这样来执行线程的 runable是函数接口,lambda表达式,启动线程,Callable接口,Futuretask传给Thread,thread执行外方法,实际上也是runable线程池来创建线程 ......
  • Java 21 正式 GA,虚拟线程真的来了
    UTC时间2023年9月19日,期盼已久的Java21终于发布正式版!本文一起来看看其中最受Java开发者关注的一项新特性:Loom项目的两个新特性之一的”虚拟线程(VirtualThread)“(另外一个新特性是”结构化并发(StructuredConcurrency)“,当前是预览状态),它被称之为Java版的”协......
  • java枚举
    packagecom.xn.enums;publicenumTestEnum{RED1("RED",1),GREEN("GREEN",2),BLACK("BLACK",3);privateStringcolor;privateintori;//构造方法privateTestEnum(Stringcolor,intori){......
  • 在Java中线程有几种状态?
    一、Java中线程六种状态线程在自身的生命周期中,并不是固定地处于某个状态,而是随着代码的执行在不同的状态之间进行切换......
  • 基于Java的高校竞赛管理系统设计与实现(亮点:发起比赛、报名、审核、评委打分、获奖排名
    高校竞赛管理系统一、前言二、我的优势2.1自己的网站2.2自己的小程序(小蔡coding)2.3有保障的售后2.4福利三、开发环境与技术3.1MySQL数据库3.2Vue前端技术3.3SpringBoot框架3.4微信小程序四、功能设计4.1主要功能描述4.2系统角色五、系统主要功能展示5.1前端展示5.1.1......
  • 基于Java的高校实习管理系统设计与实现(亮点:实习记录、实习打分、实习作业,功能新颖、老
    高校实习管理系统一、前言二、我的优势2.1自己的网站2.2自己的小程序(小蔡coding)2.3有保障的售后2.4福利三、开发环境与技术3.1MySQL数据库3.2Vue前端技术3.3SpringBoot框架3.4微信小程序四、功能设计4.1主要功能描述五、系统主要功能5.1管理员功能5.2公司功能5.3老师......
  • 基于Java的大学生汉服租赁网站的设计与实现(亮点:在线支付、ECharts图表展示、完整下单
    大学生汉服租赁网站一、前言二、我的优势2.1自己的网站2.2自己的小程序(小蔡coding)2.3有保障的售后2.4福利三、开发环境与技术3.1MySQL数据库3.2Vue前端技术3.3SpringBoot框架3.4微信小程序四、功能设计4.1主要功能描述五、系统实现5.1前端实现5.1.1汉服租赁5.1.2汉服......
  • 基于Java的大学生选修选课系统设计与实现(亮点:多角色、贴近现实的选课流程、好看的系统
    大学生选修选课系统一、前言二、我的优势2.1自己的网站2.2自己的小程序(小蔡coding)2.3有保障的售后2.4福利三、开发环境与技术3.1MySQL数据库3.2Vue前端技术3.3SpringBoot框架3.4微信小程序四、功能设计4.1主要功能描述五、系统实现5.1管理员端功能5.1.1学生管理5.1.2......