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

Axis webservice 传递自定义类型和接收自定义类型返回值

阅读更多

1、建立web 工程,)引入axis相关jar包,编写webservice服务器端(这里为DataTransService.java)

DataTransService.java

package com.trs.service;

import net.sf.json.JSONObject;
import com.trs.entity.CPDetailResult;
import com.trs.entity.CPListResult;
import com.trs.entity.CPQuery;
import com.trs.entity.ExplainData;

public class DataTransService{

	public String Explain() {
		System.out.println("method Explain() excuted");
		ExplainData explainData = new ExplainData();
		/**测试部分开始...*/
		explainData.setName("TRSSERVER数据库");
		/**测试部分结束...*/
		System.out.println("######## "+explainData.getName());
		/**
		 * 这里完成检索代码
		 */
		String jSonString = objectToJsonString(explainData);
		return jSonString;
	}
	
	public CPListResult GetList(CPQuery q) {
		System.out.println("method GetList() excuted");
		CPListResult listResult = new CPListResult();
		System.out.println("CPQuery DBName: "+q.getDBName());
		listResult.setMessage(q.getDBName());
		/**
		 * 这里完成检索代码
		 */
		String jSonString = objectToJsonString(listResult);
		return listResult;
	}

	public String GetDetail(long detailid){
		System.out.println("method GetDetail() excuted");
		CPDetailResult detailResult = new CPDetailResult();
		/**
		 * 这里完成检索代码
		 */
		String jSonString = objectToJsonString(detailResult);
		return jSonString;
	}
	
	private String objectToJsonString(Object o) {
		//对象转json
		JSONObject jObject = JSONObject.fromObject(o);		
		return jObject.toString();
	}

}
 

2、在工程目录zb_service\WebRoot\WEB-INF目录下新建一个deploy.wsdd文件,文件内容为:

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <service name="DataTransService" provider="java:RPC">
        <parameter name="className" value="com.trs.service.DataTransService"/>
        <parameter name="allowedMethods" value="*"/>
    </service>
</deployment>
 

3、在E:\workspace\zb_service\WebRoot\WEB-INF目录下运行:

java -Djava.ext.dirs=E:\workspace\zb_service\WebRoot\WEB-INF\lib  org.apache.axis.client.AdminClient -lhttp://localhost:8080/zb_service/services/AdminService deploy.wsdd

则在zb_service\WebRoot\WEB-INF目录下会生成一个文件server-config.wsdd,文件内容为:

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
 <globalConfiguration>
  <parameter name="sendMultiRefs" value="true"/>
  <parameter name="disablePrettyXML" value="true"/>
  <parameter name="adminPassword" value="admin"/>
  <parameter name="attachments.Directory" value="D:\Tomcat6.0\webapps\zb_service\WEB-INF\attachments"/>
  <parameter name="dotNetSoapEncFix" value="true"/>
  <parameter name="enableNamespacePrefixOptimization" value="false"/>
  <parameter name="sendXMLDeclaration" value="true"/>
  <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
  <parameter name="sendXsiTypes" value="true"/>
  <requestFlow>
   <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="session"/>
   </handler>
   <handler type="java:org.apache.axis.handlers.JWSHandler">
    <parameter name="scope" value="request"/>
    <parameter name="extension" value=".jwr"/>
   </handler>
  </requestFlow>
 </globalConfiguration>
 <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
 <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
 <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
 <service name="AdminService" provider="java:MSG">
  <parameter name="allowedMethods" value="AdminService"/>
  <parameter name="enableRemoteAdmin" value="false"/>
  <parameter name="className" value="org.apache.axis.utils.Admin"/>
  <namespace>http://xml.apache.org/axis/wsdd/</namespace>
 </service>
 <service name="DataTransService" provider="java:RPC">
  <parameter name="allowedMethods" value="*"/>
  <parameter name="className" value="com.trs.service.DataTransService"/>
    <!-- 这里定义了方法的参数以及返回值 -->
	 <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"   
	 encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
	 qname="ns:CPQuery"
	 serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
	 type="java:com.trs.entity.CPQuery" xmlns:ns="urn:MyService"/>
	 
	 <typeMapping
	 deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"    
	 	encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
	 qname="ns:CPListResult"    
	 serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"    
	 type="java:com.trs.entity.CPListResult" xmlns:ns="urn:MyService"/>
	 
	 <typeMapping
	 deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"    
	 	encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
	 qname="ns:CPRecord"    
	 serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"    
	 type="java:com.trs.entity.CPRecord" xmlns:ns="urn:MyService"/>	

 
 </service>
 <service name="Version" provider="java:RPC">
  <parameter name="allowedMethods" value="getVersion"/>
  <parameter name="className" value="org.apache.axis.Version"/>
 </service>
 <transport name="http">
  <requestFlow>
   <handler type="URLMapper"/>
   <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
  </requestFlow>
  <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
  <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
  <parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler"/>
  <parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/>
  <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
  <parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
 </transport>
 <transport name="local">
  <responseFlow>
   <handler type="LocalResponder"/>
  </responseFlow>
 </transport>
</deployment>
 

黑体部分为后来加入的设置

 

客户端代码:

package com.trs.client;

import javax.xml.namespace.QName;

import net.sf.json.JSONObject;

import org.apache.axis.Constants;
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.trs.entity.*;

public class DataTransClient {
	
	//创建访问点
	private static String ENDPOINT = "http://localhost:8080/zb_service/services/DataTransService";
	
	//获取数据库相关说明服务名
	private static String DATAEXPLAIN = "Explain";
	
	//获取数据列表服务名
	private static String GETLIST = "GetList";
	
	//获取数据细缆服务名
	private static String GETDETAIL = "GetDetail";
	
	public void ExplainData(){
	  try{
	   //创建service
	   Service service = new Service();
	   Call call = null;
	   //创建call
	   call = (Call) service.createCall();
	   //设置操作名
	   call.setOperationName(new QName(ENDPOINT,DATAEXPLAIN));
	   //设置访问点
	   call.setTargetEndpointAddress(new java.net.URL(ENDPOINT));
	   //调用服务,返回值
	   String ret = (String) call.invoke(new Object[]{});
	   JSONObject jsObject = JSONObject.fromObject(ret);
	   System.out.println(("name:" + jsObject.getString("name")));
	  }catch (Exception ex){
	   ex.printStackTrace();
	  }
	}
	
	public void getList(CPQuery query){
		try{
		   //创建service
		   Service service = new Service();
		   Call call = null;
		   //创建call
		   call = (Call) service.createCall();
		   QName qName1 = new QName("urn:MyService","CPQuery");
		   QName qName2 = new QName("urn:MyService","CPListResult");
		   QName qName3 = new QName("urn:MyService","CPRecord");
		   //设置操作名
		   call.setOperationName(new QName(ENDPOINT,GETLIST));
		   //设置访问点
		   call.setTargetEndpointAddress(new java.net.URL(ENDPOINT));
		   // 注册序列化和反序列化类
		   call.registerTypeMapping(CPQuery.class, qName1,
				new BeanSerializerFactory(CPQuery.class, qName1),
				new BeanDeserializerFactory(CPQuery.class, qName1));
		   
		   call.registerTypeMapping(CPListResult.class, qName2,
					new BeanSerializerFactory(CPListResult.class, qName2),
					new BeanDeserializerFactory(CPListResult.class, qName2));
		   
		   call.registerTypeMapping(CPRecord.class, qName3,
					new BeanSerializerFactory(CPRecord.class, qName3),
					new BeanDeserializerFactory(CPRecord.class, qName3));

		   //调用服务,返回值
		   CPListResult ret = (CPListResult) call.invoke(new Object[]{query});
		   System.out.println("返回的信息是:" + ret.getMessage()+ret.getRecords()[0].getDetailID());
		  }catch (Exception ex){
		   ex.printStackTrace();
		  }
	}

	public void getDetail(long id){
		try{
		    //创建service
		    Service service = new Service();
		    Call call = null;
		    QName QNAME = new QName(ENDPOINT,GETDETAIL);
		    //创建call
		    call = (Call) service.createCall();
		    //设置操作名
		    call.setOperationName(QNAME);
		    //设置访问点
		    call.setTargetEndpointAddress(new java.net.URL(ENDPOINT));
		    //调用服务,返回值
		    CPDetailResult ret = (CPDetailResult) call.invoke(new Object[]{id});
		    System.out.println("返回的信息是:" + ret);
		   }catch (Exception ex){
		    ex.printStackTrace();
		   }
	}
	
	public static void main(String args[]){
		DataTransClient client = new DataTransClient();
//		client.ExplainData();
		CPQuery query = new CPQuery();
		query.setDBName("oracle");
		client.getList(query);
//		long id = 100;
//		client.getDetail(id);
	}
}

  小结:当自定义类型参数或返回值里含有多个自定义类型对象时,对这些包含的自定义类型对象也如做如上的配置,这样看来,使用比较繁琐。Jeson类给我们提供了一个新的方式,在上面的服务器端代码里,jeson对自定义类型的参数和返回值做了字符串的转换,因此,传递自定义类型变成了传递字符串,我们只需在客户端和服务器端代码里对字符串进行jeson转换就可以了。如:

JSONObject jsObject = JSONObject.fromObject(ret);
	   System.out.println(("name:" + jsObject.getString("name")));
 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics