Java/WebService 对象传输

使用WebService来传输简单类型,不需要太复杂的操作,很简单的就可以实现,但是

如果你想传输一些大对象或者是自定义的类对象,则需要定义好相应的serializer和
deserializer,如果还是使用简单的SimpleDeserializer,那么很可能不会成功。

一、开发服务端
使用Eclipse开发一个服务类,他提供服务允许客户端访问本地的一个对象。
/////////////////////////////////////////////////////////////////
package samland.webservice.demo.mytestprj;

public class UserInfo implements java.io.Serializable {
 private static final long serialVersionUID = 2766274206307532403L;
 private String address;
 private int appid;
 private java.util.Date birthday;
 private String city;
 private String country;
 private String duty;
 private String email;
 private String faxno;
 private int gender;
 private String loginname;
 private String nickname;
 private String phoneno;
 private String province;
 private String sbirthday;
 private String url;
 private String userdesc;
 private int user2Orgid;
 private String username;
 private String zip;
 
 //setters and getters
 ...
}
/////////////////////////////////////////////////////////////////
package samland.webservice.demo.mytestprj;

import javax.xml.rpc.soap.SOAPFaultException;

public class UserManager {
 /**
  * 应用系统验证
  * @param token 应用系统管理员令牌字符串
  * @return true - 有对应服务的访问权限 <br> false - 无
  */
 public boolean authenticate(String token) {
  return true;
 }

 /**
  * 获取用户的详细资料
  * @param user2orgid 与组织关联的用户ID
  * @return 用户数据类对象
  */
 public UserInfo getUserInfo(int user2orgid) {
  UserInfo ui = new UserInfo();
  ui.setAddress("address");
  ui.setAppid(128);
  ui.setBirthday(new java.util.Date());
  ui.setGender(1);
  ui.setLoginname("loginname");
  ui.setNickname("nickname");
  ui.setUser2Orgid(user2orgid);
  ui.setUsername("username");
  ui.setZip("232323");
  return ui;
 }

}
/////////////////////////////////////////////////////////////////

二、发布
新建一个WebService,您可以使用Eclipse的向导:
New->Other...->Web Services->Web Service

Next:
选择一个WebService服务类,即UserManager。
Service implementation: samland.webservice.demo.mytestprj.UserManager
Configuration:
 Server: Tomcat v5.5
 Web service runtime: Apache Axis
 Service project:wsexample
 
下一步直至启动Tomcat v5.5服务器即可

三、开发客户端
在另外一个项目mytestprj中,新建一个WebService Client,你也可以使用Eclipse的向导:
New->Other...->Web Services->Web Service Client
选择一个wsdl文件,如:
Service definition: file:/X:/workspace/wsexample/WebContent/wsdl/UserManager.wsdl
Configuration:
 Server: Tomcat v5.5
 Web service runtime: Apache Axis
 Service project: mytestprj

Client Type: Java Proxy

下一步,选择输出文件夹,如
mytestprj/src/service

向导会在分析wsdl之后,在mytestprj/src/service下面生成这样一些文件:
samland/webservice/demo/mytestprj/UserInfo.java
samland/webservice/demo/mytestprj/UserManager.java
samland/webservice/demo/mytestprj/UserManagerProxy.java
samland/webservice/demo/mytestprj/UserManagerService.java
samland/webservice/demo/mytestprj/UserManagerServiceLocator.java
samland/webservice/demo/mytestprj/UserManagerSoapBindingStub.java

由于这些包路径与本项目不对应,我把他们都移动到这个目录下面
samland.mytestprj.webservices.impl,修改了文件中类的路径即可消除错误提示。

打开UserInfo.java仔细看看,他把自身的类型描述和serializer、deserializer等等
都定义好了,就不会担心SimpleDeserializer抛出错误了。摘要如下:
///////////////////////////////////////////////////////////////////////
// Type metadata
    private static org.apache.axis.description.TypeDesc typeDesc =
        new org.apache.axis.description.TypeDesc(UserInfo.class, true);

    static {
        typeDesc.setXmlType(new javax.xml.namespace.QName("http://gzgtj.demo.webservice.samland", "UserInfo"));
        org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("address");
        elemField.setXmlName(new javax.xml.namespace.QName("http://gzgtj.demo.webservice.samland", "address"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
        elemField.setNillable(true);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("appid");
        elemField.setXmlName(new javax.xml.namespace.QName("http://gzgtj.demo.webservice.samland", "appid"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "int"));
        elemField.setNillable(false);
        typeDesc.addFieldDesc(elemField);
        ...
    }

    /**
     * Return type metadata object
     */
    public static org.apache.axis.description.TypeDesc getTypeDesc() {
        return typeDesc;
    }

    /**
     * Get Custom Serializer
     */
    public static org.apache.axis.encoding.Serializer getSerializer(
           java.lang.String mechType, 
           java.lang.Class _javaType,  
           javax.xml.namespace.QName _xmlType) {
        return 
          new  org.apache.axis.encoding.ser.BeanSerializer(
            _javaType, _xmlType, typeDesc);
    }

    /**
     * Get Custom Deserializer
     */
    public static org.apache.axis.encoding.Deserializer getDeserializer(
           java.lang.String mechType, 
           java.lang.Class _javaType,  
           javax.xml.namespace.QName _xmlType) {
        return 
          new  org.apache.axis.encoding.ser.BeanDeserializer(
            _javaType, _xmlType, typeDesc);
    }
///////////////////////////////////////////////////////////////////////

四、测试
保持第二步的服务是启动的,编写下面的类代码并Run As Java Application测试:
package samland.mytestprj.webservices;

import java.rmi.RemoteException;

import samland.mytestprj.webservices.impl.UserInfo;
import samland.mytestprj.webservices.impl.UserManagerProxy;

public class UserTest {
 public static void main(String[] asss){
  samland.mytestprj.webservices.impl.UserManager a = new UserManagerProxy();
  try {
   UserInfo ti = (UserInfo)a.getUserInfo(256);
   System.out.println(ti.getUsername());
   
   boolean b = a.authenticate("te");
   System.out.println(b);
  } catch (RemoteException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
}
Console将会输出下面的结果:
username
true

你可能感兴趣的:(java,apache,eclipse,UI,webservice)