`
chnic
  • 浏览: 225825 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用AXIS开发Webservice(三) —— 如何传递JavaBean和你的对象

阅读更多

这几天貌似战斗力无穷,趁着有精力就多更新两篇。随着对Axis的研究加深,越感觉webservice是个很好玩的东西。这篇说一下如何传递一个JavaBean和你自己的一个special Object。

 

在第一篇介绍Axis的文章里,我们做了一个简单的webservice,我们client side传递了String和int类型的数据给service object。Service处理之后返回处理结果给Client。对于大多数需求,那个demo显然已经足够应付了。但是如果client端需要传输一个对象给server,那么那个demo就显得力不从心了。Axis中提供了远程传输对象的方法,通过那些方法我们同样可以随心的传递自己的对象。

 

我们先从传递一个JavaBean开始,首先编写一个JavaBean。

package com.chnic.bean;

public class OrderBean {
	private String name;
	private int age;
	private String[] items;
	private int[] price;
	private boolean checked;
	
	public OrderBean() {
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public boolean isChecked() {
		return checked;
	}
	public void setChecked(boolean checked) {
		this.checked = checked;
	}
	public String[] getItems() {
		return items;
	}
	public void setItems(String[] items) {
		this.items = items;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int[] getPrice() {
		return price;
	}
	public void setPrice(int[] price) {
		this.price = price;
	}
}

这个JavaBean的前4个属性都很清楚,要解释一下最后一个。因为这个JavaBean被传递到Service端处理之后要接着被传回,用来示例webservce传进和传出。这个变量用来区别传进和传出的差别。解释完我们来看下service

package com.chnic.webservice;

import com.chnic.bean.OrderBean;

public class AnalyzeOrder {
	
	public AnalyzeOrder(){	
	}
	
	public OrderBean process(OrderBean order){
		order.setChecked(true);
		System.out.println("name: " + order.getName() + " age: " + order.getAge());
		for(int i=0; i<order.getItems().length; i++)
			System.out.println("Item " + (i+1) + order.getItems()[i] + 
					" and price is " + order.getPrice()[i]);
		return order;
	}
}

 Service Object的代码很简单,就不解释了。惯例,我们来编写发布文件。

<deployment xmlns="http://xml.apache.org/axis/wsdd/" 
	xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
	
    <service name="CheckOrder" provider="java:RPC">
        <parameter name="className" value="com.chnic.webservice.AnalyzeOrder"/>
        <parameter name="allowedMethods" value="process"/>
        <beanMapping qname="myNS:Order" xmlns:myNS="urn:AnalyzeOrder" 
        	languageSpecificType="java:com.chnic.bean.OrderBean"/>
    </service>
</deployment>

 唯一不同的就是多了<beabMapping>这个节点。qname 表示 XML 规范中定义的限定名称,他由名称空间 URI、本地部分和前缀组成。除了本地部分其他都不是必须的另外QName是不可变的。xmlns后面的myNS是必须的。具体根据前面所指定的qname来决定。之后可以随意命名一个namespace。最后的languageSpecificType指定的是你传递的对象类型。第一个属性的本地部分和第二个节点你自定义的命名空间会组成一个新的QName,并将你要传输的对象mapping是上去。

 

发布这个webservice,编写测试代码

String targetEendPoint = "http://localhost:8080/axis/services/CheckOrder";  
		
OrderBean order = new OrderBean();
order.setName("Beckham");
order.setAge(32);
String [] items = new String[] { "Ipod", "ThinkPad" };
int [] price = new int [] { 999, 5000 };
order.setItems(items);
order.setPrice(price);
order.setChecked(false);
        
System.out.println(order.isChecked());
        
Service  service = new Service();
Call call = (Call) service.createCall();
QName qn = new QName("urn:AnalyzeOrder", "Order" );
call.registerTypeMapping(OrderBean.class, qn,
   new org.apache.axis.encoding.ser.BeanSerializerFactory(OrderBean.class, qn),        
   new org.apache.axis.encoding.ser.BeanDeserializerFactory(OrderBean.class, qn));
        
call.setTargetEndpointAddress( new java.net.URL(targetEendPoint) );
call.setOperationName( new QName("CheckOrder", "process") );
call.addParameter( "arg1", qn, ParameterMode.IN );
call.setReturnClass(OrderBean.class);
        
OrderBean result = (OrderBean) call.invoke( new Object[] {order} );
        
System.out.println("Success...");
System.out.println(result.isChecked())

 从控制台输出一些信息以便测试,里面大多代码都应该见过。new QName和之后的registerTypeMapping方法也是在实现我上面那段黑体字的内容。之后注册完参数和返回值类型运行。

会发现在tomcat控制台和本地控制台都会输出测试结果,值得注意的是checked这个属性在传入之前是false属性,传入之后我们改变了他的属性变为true。返回之后在本地控制台打印出来也为true。

 

事实上Axis除了可以传输JavaBean之外还可以传输一些自定义的类型。比如List、Map和时间日期类型。Axis也为他们提供了专门的SerializerFactory和DeserializerFactory。这些工厂类会产生串行化工具去序列化相应的对象。更多的Factory Object可以在org.apache.axis.encoding.ser下面找到。

 

对于自定义序列化,Axis也提供了相对性的配置节点。具体配置如下:

<typeMapping qname="ns:local" xmlns:ns="someNamespace"
             languageSpecificType="java:my.java.thingy"
             serializer="my.java.Serializer"
             deserializer="my.java.DeserializerFactory"
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

typeMapping的前三个属性和上面讲的beanMapping都一样。不一样的是后三个。serializer指定的是串行化类,dserializer指定的是反串行化类。最后一个指定的编码方式。其实对于typeMapping来说beanMapping只不过是他的一个简化版而已。因为beanMapping的串行化和反串行化工厂类都是固定的,而编码方式也是固定的。

 

因为typemapping和beanMapping很相似,在这里就不再写demo了。 有些人也许会问,既然能串行化对象那能不能“串行化”文件呢?这个问题留着下次再说吧。今天米动力了。confused

 

 

分享到:
评论
8 楼 jrd7777 2018-01-29  
将近十年了还是一篇好文,不过现在有JSON应该不用传递对象了
7 楼 kilery_019 2012-03-22  
zgl217 写道
发布的时候 tomcat服务器报错:- Unable to deploy typemapping:
java.lang.ClassNotFoundException: com.sinosoft.bean.OrderBean

怎么回事。。。。。。 


可能是你没有把你新编译的classes放到/TOMCAT_HOME/webapps/axis/WEB-INF/classes下去
6 楼 zgl217 2012-03-15  
发布的时候 tomcat服务器报错:- Unable to deploy typemapping:
java.lang.ClassNotFoundException: com.sinosoft.bean.OrderBean

怎么回事。。。。。。 
5 楼 lufengdie 2010-10-29  

mark·
4 楼 chnic 2008-04-28  
楼下的朋友,刚刚按照你的说的试了一下。
我在Client端new了一个Object 然后通过webservice transfer给server端
在server段 setName("hahaha") 返回这个Object
在后在客户端 getName 打出来的也是  hahaha
没有任何异常 或者错误
你再检查下自己的代码或者 wsdd发布文件吧。 
3 楼 tzming1212 2008-04-13  
运行成功!
但如果我在服务器中在加一个参数.order.setName("servericeName");
然后在客户端,得到javaBean,后,System.out.println(result.getName());
会报错.
这样得到并不是不整个javaBean(order),而只是javaBean中的某个字段.
这样的话,就不要用javaBean来当参数传递了.
2 楼 chnic 2008-04-11  
自己写的。
不知道为什么,我不太喜欢那个工具。 
1 楼 newerhi 2008-04-08  
请问一下,在测试代码中OrderBean 是自已写的还是wsdl2java来的...
     谢谢;

前面的几篇都很漂亮!期待中...

相关推荐

    WebService之AXIS传递javabean.7z

    WebService之AXIS传递javabean

    Axis2 WebService 开发指南 技术文档 入门文档

    Axis复杂对象类型的WebService Axis的辅助工具发布、调用WebService Axis WebService会话Session的管理 Axis用控制台Dos命令发布WebService Axis跨多个WebService管理Session Axis用Spring的JavaBean发布...

    axis2_WebService_开发指南

    Axis 复杂对象类型的WebService Axis 的辅助工具发布、调用WebService Axis WebService 会话Session 的管理 Axis 用控制台Dos 命令发布WebService Axis 跨多个WebService 管理Session Axis 用Spring 的JavaBean 发布...

    Axis webService 教程.pdf

    1 如何发布自己的webService 2 1.1 即时发布 JWS (Java Web Service) Files - Instant Deployment 2 1.2 定制发布 Custom Deployment - ...3 如何传递javabean和你的对象 14 4 如何抛出自定义异常 18 5 如何传递文件 25

    axis2;WebService

    Axis复杂对象类型的WebService Axis的辅助工具发布、调用WebService Axis WebService会话Session的管理 Axis用控制台Dos命令发布WebService Axis跨多个WebService管理Session Axis用Spring的JavaBean发布WebService ...

    axis2_webservice

    Axis复杂对象类型的WebService Axis的辅助工具发布、调用WebService AxisWebService会话Session的管理 Axis用控制台Dos命令发布WebService Axis跨多个WebService管理Session Axis用Spring的JavaBean发布WebService ...

    Webservice之Axis高级编程

    1.1 AXIS第一课:最简单的发布AXIS的Web Service 1.2 AXIS第二课:工程应用中的AXIS的发布方法Stub...1.5 AXIS第五课:AXIS高级应用,在AXIS服务间传递JavaBean及其安全解决 1.6 使用TCPMonitor监控WebService SOAP消息

    WebService大讲堂之Axis2

    WebService大讲堂之Axis2(7):将Spring的装配JavaBean发布成WebService ................................... 26 WebService大讲堂之Axis2(8):异步调用WebService ..................................................

    Axis高级编程

    最简单的发布AXIS的Web Service 工程应用中的AXIS的发布方法Stub AXIS高级应用,使用Handler来增强Web服务的功能 ...AXIS高级应用,在AXIS服务间传递JavaBean及其安全解决 使用TCPMonitor监控WebService SOAP消息

    Axis2教程 包含描述目录的内容

    WebService大讲堂之Axis2系列教程 1. 用POJO实现0配置的WebService 2. 复合类型数据的传递 3. 使用services.xml文件发布WebService 4. 二进制文件传输 5. 会话(Session)管理 6. 跨服务会话(Session)管理 ...

    axis2-1.4.1及教程

    2):复合类型数据的传递 3):使用services.xml文件发布WebService 4):二进制文件传输 5):会话(Session)管理 6):跨服务会话(Session)管理 7):将Spring的装配JavaBean发布成 8):异步调用WebService 9):编写...

    axis2 教程_个人备用文档

    1. 用POJO实现0配置的WebService 2. 复合类型数据的传递 ... 将Spring的装配JavaBean发布成WebService 8. 异步调用WebService 9. 编写Axis2模块(Module) 10. 使用soapmonitor模块监视soap请求与响应消息

    编程入门_Eclipse教程

    3.1.4. 用Spring创建的JavaBean发布成WebService 29 3.1.5. 异步调用WebService 32 4. Eclipse中安装 Lomboz 35 4.1. 持久化对象与OID 35 4.1.1. 对持久化对象的要求 35 4.1.2. OID 36 5. Eclipse使用技巧 36 5.1. ...

Global site tag (gtag.js) - Google Analytics