使用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