用Java 开发 WebService Axis简单实例

转载 http://blog.csdn.net/kay5804/article/details/2382428 但是做了一定的修正

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考到axislib目录下.
上面的步骤如果进行正常将会在Validation页面中就看不到有ErrorWarning
信息.好了,接下来我们开始编写代码
Axis支持三种web service的部署和开发,分别为
1Dynamic Invocation Interface ( DII)
2Stubs方式
3Dynamic 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.web.test;

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";
		Service s = new Service();
		Call call = (Call) s.createCall();
		call.setOperationName("say");	//the invoked method name
		call.setTargetEndpointAddress(urlname);

		String val = (String) call.invoke(new Object[] { "Just want to say hello to you guys!" });	//Parameters

		System.out.println("Return from WebService" + val);
	}
}

到此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 {
	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 {

	public String getBeanString(UserBean bean){
		return "Your name is "+bean.getName()+", and the age is "+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  - l http://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:

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

import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;

import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;

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;

import com.web.test.UserBean;

public class Test {

	public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException {

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

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

		call.registerTypeMapping(UserBean.class, qname, new BeanSerializerFactory(UserBean.class, qname), 
				new BeanDeserializerFactory(UserBean.class,qname) );
		
		call.setOperationName("getBeanString");
		call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/services/stubs?wsdl"));
		
		UserBean u = new UserBean();
		u.setAge(26);
		u.setName("Scott");
		
		
		String str = (String)call.invoke(new Object[]{u});
		
		System.out.println(str);
	}
}



好了,这下完成了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!" ));
    }
}
//Out.print Hi~~ Blue boy!
好了,到现在为止三种调用方式都描术完了,不知道你有没有学会.如果还有什么问题,可
以给我留言,我会给你及时回复.如有不对的地方请指出. Thank you !
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值