加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService-AXIS高级特性 传递复杂对象

发布时间:2020-12-16 23:58:12 所属栏目:安全 来源:网络整理
导读:从客户端除了传递字符串以外还可以传递复杂对象(对象必须序列化了),List,Map,数组和文件。 (1)定义一个对象实现了serializable 接口 package cn.com.chenlly.ssh.webservice.axis; import java.io.Serializable; import java.util.ArrayList; import java.u

从客户端除了传递字符串以外还可以传递复杂对象(对象必须序列化了),List,Map,数组和文件。


(1)定义一个对象实现了serializable 接口
package cn.com.chenlly.ssh.webservice.axis;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
?* @Class Address.java
?* @Description?
?* @Copyright (c) 2010,正辰科技有限公司 All rights reserved.
?* @Author Chenlly?
?* @Version 1.0
?* @Date Apr 19,2010 5:03:23 PM
?*/
public class Address implements Serializable {
?
?private Integer identifier;
?
?private String address;
?
?private String city;
?
?private String province;
?
?private String country;
?
?private String []array;
?
?private List<Integer> list;
?
?private boolean isExst;
?
?
?//constructor
?public Address(){
??
??list = new ArrayList<Integer>();
??
??list.add(1);
??
??list.add(2);
??
??list.add(3);
?}
?public Integer getIdentifier() {
??return identifier;
?}

?public void setIdentifier(Integer identifier) {
??this.identifier = identifier;
?}

?public String getAddress() {
??return address;
?}

?public void setAddress(String address) {
??this.address = address;
?}

?public String getCity() {
??return city;
?}

?public void setCity(String city) {
??this.city = city;
?}

?public String getProvince() {
??return province;
?}

?public void setProvince(String province) {
??this.province = province;
?}

?public String getCountry() {
??return country;
?}

?public void setCountry(String country) {
??this.country = country;
?}

?public String[] getArray() {
??return array;
?}

?public void setArray(String[] array) {
??this.array = array;
?}

?public List<Integer> getList() {
??return list;
?}

?public void setList(List<Integer> list) {
??this.list = list;
?}

?public boolean isExst() {
??return isExst;
?}

?public void setExst(boolean isExst) {
??this.isExst = isExst;
?}
}

?

(2)定义server-config.wsdd文件

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
?xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
?<handler name="URLMapper"
??type="java:org.apache.axis.handlers.http.URLMapper" />
?<handler name="wsTestHandler"
??type="java:cn.com.chenlly.ssh.webservice.axis.WSTestServiceHandle">
??<parameter name="status" value="success" />
?</handler>
?<!-- 自定义服务 -->
?<service name="ws" provider="java:RPC">
??<parameter name="className"
???value="cn.com.chenlly.ssh.webservice.axis.WSTestServiceImpl" />
??<parameter name="allowedMethods" value="*" />
??<parameter name="scope" value="request" />
??
??<responseFlow>
???<handler type="wsTestHandler" />
??</responseFlow>
??
??<requestFlow>
???<handler type="wsTestHandler" />
??</requestFlow>
??
??<beanMapping qname="myNSD:Address"
???xmlns:myNSD="urn:AddressManager"
???languageSpecificType="java:cn.com.chenlly.ssh.webservice.axis.Address">
??</beanMapping>
?</service>

?<transport name="http">
??<requestFlow>
???<handler type="URLMapper" />
??</requestFlow>
?</transport>
</deployment>

//主要是<beanMapping>标签中名字空间和qname写法
第一个你自定义的命名空间和第二个节点本地部分会组成一个新的QName。
在IE 中打开链接
http://192.168.1.98:8082/SSHProject/services/ws?wsdl
生成的WSDL有如下一段
- <schema targetNamespace="urn:AddressManager" xmlns="http://www.w3.org/2001/XMLSchema">
? <import namespace="http://192.168.1.98:8082/SSHProject/services/ws" />
? <import namespace="http://xml.apache.org/xml-soap" />
? <import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
- <complexType name="Address">
- <sequence>
? <element name="address" nillable="true" type="soapenc:string" />
? <element name="array" nillable="true" type="impl:ArrayOf_soapenc_string" />
? <element name="city" nillable="true" type="soapenc:string" />
? <element name="country" nillable="true" type="soapenc:string" />
? <element name="exst" type="xsd:boolean" />
? <element name="identifier" nillable="true" type="soapenc:int" />
? <element name="list" nillable="true" type="impl:ArrayOf_xsd_anyType" />
? <element name="province" nillable="true" type="soapenc:string" />
? </sequence>
? </complexType>
? </schema>
这个新的schema就是把对象序列化以后生成了xml流文件。

?

(3) webService 服务方法
public Address dealAddress(Address address) {
?? System.out.println("service exst:"+address.isExst());
?? //客户端对象传递过来设置标志为true
?? address.setExst(true);
?? return address;
}

?

(4) 客户端
package cn.com.chenlly.ssh.webservice.axis;

import java.util.ArrayList;
import java.util.List;

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

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;

/**
?* @Class WSTestService.java
?* @Description 客户端调用远程的service
?* @Copyright (c) 2010,正辰科技有限公司 All rights reserved.
?* @Author Chenlly
?* @Version 1.0
?* @Date Apr 9,2010 3:57:26 PM
?*/
public class WSTestServiceClient {
?public static void main(String[] args) {
??Service service = new Service();
??try {
???Call call = (Call) service.createCall();
???String url = "http://192.168.1.98:8082/SSHProject/services/ws?wsdl";
???call.setTargetEndpointAddress(new java.net.URL(url));
??????????????????????? //定义对象
???Address address = new Address();
???address.setIdentifier(1);
???address.setProvince("湖南");
???address.setCity("长沙");
???address.setExst(false);

???QName qn = new QName("urn:AddressManager","Address");//第一个参数名字空间URI,第二个参数本地部分,注意这两部分在server-config.wsdd文件中标签beanMapping配置 ???call.registerTypeMapping(Address.class,qn,?????new BeanSerializerFactory(Address.class,qn),//序列化 ?????new BeanDeserializerFactory(Address.class,qn)); ??? ???call.setOperationName(new QName(url,"dealAddress")); ??? ???call.addParameter("arg0",ParameterMode.IN);//定义一个参数类型,如果是String类型的参数可以不需要这句话 ???call.setReturnClass(Address.class);//指定返回类型 ??? ???Address result = (Address) call.invoke(new Object[]{address});//这里传递给service的是一个对象 ???System.out.println(result.isExst()); ??} catch (Exception e) { ???e.printStackTrace(); ??} ?} } //在服务器端打印的isExst()方法是false;然后设置address的exst为true;最后又传送到客户端打印的result结果为true

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读