webservice学习之二实体类的传递 收藏.docx
《webservice学习之二实体类的传递 收藏.docx》由会员分享,可在线阅读,更多相关《webservice学习之二实体类的传递 收藏.docx(43页珍藏版)》请在冰豆网上搜索。
webservice学习之二实体类的传递收藏
webservice学习之二(实体类的传递)收藏
SOAP、WSDL、UDDI,这些名词相信只要了解过WebService的都不陌生,根据Apache的定义,Axis是一种W3CSOAP实现,国内有些介绍还特别注明了:
Axis并不完全是SOAP引擎,它还包括独立的SOAP服务器、嵌入Servlet引擎的服务器、支持WSDL并提供转化WSDL为Java类的工具、例子程序、TCP/IP数据包监视工具,等等。
Axis部署WebSerive有两种方式,最简单的是拷贝java源代码文件到web文件夹下把扩展名改为.jws直接调用,可参考这篇文章:
用Axis1.1forJava进行WebServices开发
(1)。
另一种方式是通过WSDD(WebServices描述文档)部署,可参考:
使用Axis发布简单的Web服务。
在我的应用中,使用的是后者,以便Axis进行自动序列化/反序列化处理。
实现一次SSO登陆验证,最少要传入用户名、密码。
为了达到这种目的,在客户端我们构造User对象(本文中User对象仅包含用户名和密码),并通过Axis自动序列化传递出去;到了SSO端,Axis自动反序列化之后还原成User对象;最后返回给客户端说明本次登陆的结果,返回的结果不仅仅包含例如“登陆成功”之类的简单信息,也许还有很多其他信息,看来创建一个叫做Respond的对象(本文中Respond对象仅包含登陆ID和结果描述)很有必要了,把Respond传回给客户端说明登陆结果。
暴露给客户端供登陆验证的服务类是AuthService。
该类代码简单表示如下:
publicclassAuthService{
/**
*验证用户名和密码
*@paramStringuserName用户名
*@paramStringpassWord密码
*@returnRespond登陆验证后返回
*/
publicRespondlogin(Useruser){
Stringname=user.getName();
Stringpassword=user.password();
//进行数据库验证
//..
//
Respondrespond=newRespond();
respond.setId("123");
respond.setDesc("登陆成功");
returnrespond;
}
}
User和Respond以及服务类都写好了。
通过命令行方式,我生成了server-config.wsdd,内容如下:
xmlversion="1.0"encoding="UTF-8"?
>
//xml.apache.org/axis/wsdd/"xmlns:
java="http:
//xml.apache.org/axis/wsdd/providers/java">
\workspace\SSO\web\WEB-INF\attachments"/>
org.apache.axis.handlers.JWSHandler">
org.apache.axis.handlers.JWSHandler">
org.apache.axis.transport.local.LocalResponder"/>
org.apache.axis.handlers.http.URLMapper"/>
org.apache.axis.handlers.SimpleAuthenticationHandler"/>
RPC">
sso.Respond"qname="ns:
resp"xmlns:
ns="urn:
BeanService"/>
sso.User"qname="ns:
user"xmlns:
ns="urn:
BeanService"/>
MSG">
http:
//xml.apache.org/axis/wsdd/
RPC">
org.apache.axis.handlers.http.HTTPAuthHandler"/>
list"value="org.apache.axis.transport.http.QSListHandler"/>
wsdl"value="org.apache.axis.transport.http.QSWSDLHandler"/>
method"value="org.apache.axis.transport.http.QSMethodHandler"/>
要说明的是,深究上述配置文件具体含义不是本文的目的,要对其具体了解,请参考Axis文档。
其中,只有下面的XML才是我们感兴趣的:
RPC">
sso.Respond"qname="ns:
resp"xmlns:
ns="urn:
BeanService"/>
sso.bo.User"qname="ns:
user"xmlns:
ns="urn:
BeanService"/>
注:
sso.Respond为要注册的类,全路径和类名
为了完成自动序列化/反序列化,我们使用“beanMapping”元素指定要进行处理的bean文件。
只有在WSDD中定义了这些,才能享受到Axis带来的自动序列化/反序列化优势。
客户端代码:
publicclassTestClient{
publicstaticvoidmain(String[]args){
try{
Stringendpoint="http:
//127.0.0.1:
8080/services/AuthService?
wsdl";
Serviceservice=newService();
Callcall=(Call)service.createCall();
QNameqn=newQName("urn:
BeanService","resp");
QNameqx=newQName("urn:
BeanService","user");
//注册bean
call.registerTypeMapping(Respond.class,qn,newBeanSerializerFactory(Respond.class,qn),newBeanDeserializerFactory(Respond.class,qn));
call.registerTypeMapping(User.class,qx,newBeanSerializerFactory(User.class,qx),newBeanDeserializerFactory(User.class,qx));
call.setTargetEndpointAddress(new.URL(endpoint));
call.setOperationName(newQName("http:
//soapinterop.org/","login"));
Useruser=newUser();
mul.setName("test");
mul.setPassword("test");
Respondrespond=(Reopond)call.invoke(newObject[]{user});
System.out.println("登陆,返回'"+respond.getDesc()+"'。
");
}catch(Exceptione){
e.printStackTrace();
}
}
}
正如我们期望的,打印出“登陆成功”。
通过上面的范例,我们发现,Axis的自动序列化/反序列化机制还是很方便的,除了bean以外,其他类型的对象也可以让Axis来完成,具体参考Axis文档,如果要传递的对象Axis未提供自动序列化/反序列化支持,请考虑人工实现,参考:
深度编程Axis序列化/反序列化器开发指南。
webservice学习之二(实体类的传递)收藏
SOAP、WSDL、UDDI,这些名词相信只要了解过WebService的都不陌生,根据Apache的定义,Axis是一种W3CSOAP实现,国内有些介绍还特别注明了:
Axis并不完全是SOAP引擎,它还包括独立的SOAP服务器、嵌入Servlet引擎的服务器、支持WSDL并提供转化WSDL为Java类的工具、例子程序、TCP/IP数据包监视工具,等等。
Axis部署WebSerive有两种方式,最简单的是拷贝java源代码文件到web文件夹下把扩展名改为.jws直接调用,可参考这篇文章:
用Axis1.1forJava进行WebServices开发
(1)。
另一种方式是通过WSDD(WebServices描述文档)部署,可参考:
使用Axis发布简单的Web服务。
在我的应用中,使用的是后者,以便Axis进行自动序列化/反序列化处理。
实现一次SSO登陆验证,最少要传入用户名、密码。
为了达到这种目的,在客户端我们构造User对象(本文中User对象仅包含用户名和密码),并通过Axis自动序列化传递出去;到了SSO端,Axis自动反序列化之后还原成User对象;最后返回给客户端说明本次登陆的结果,返回的结果不仅仅包含例如“登陆成功”之类的简单信息,也许还有很多其他信息,看来创建一个叫做Respond的对象(本文中Respond对象仅包含登陆ID和结果描述)很有必要了,把Respond传回给客户端说明登陆结果。
暴露给客户端供登陆验证的服务类是AuthService。
该类代码简单表示如下:
publicclassAuthService{
/**
*验证用户名和密码
*@paramStringuserName用户名
*@paramStringpassWord密码
*@returnRespond登陆验证后返回
*/
publicRespondlogin(Useruser){
Stringname=user.getName();
Stringpassword=user.password();
//进行数据库验证
//..
//
Respondrespond=newRespond();
respond.setId("123");
respond.setDesc("登陆成功");
returnrespond;
}
}
User和Respond以及服务类都写好了。
通过命令行方式,我生成了server-config.wsdd,内容如下:
xmlversion="1.0"encoding="UTF-8"?
>
//xml.apache.org/axis/wsdd/"xmlns:
java="http:
//xml.apache.org/axis/wsdd/providers/java">
\workspace\SSO\web\WEB-INF\attachments"/>
org.apache.axis.handlers.JWSHandler">
org.apache.axis.handlers.JWSHandler">
org.apache.axis.transport.local.LocalResponder"/>
org.apache.axis.handlers.http.URLMapper"/>
org.apache.axis.handlers.SimpleAuthenticationHandler"/>
RPC">
sso.Respond"qname="ns:
resp"xmlns:
ns="urn:
BeanService"/>
sso.User"qname="ns:
user"xmlns:
ns="urn:
BeanService"/>
MSG">
http:
//xml.apache.org/axis/wsdd/
RPC">
org.apache.axis.handlers.http.HTTPAuthHandler"/>
list"value="org.apache.axis.transport.http.QSListHandler"/>
wsdl"value="org.apache.axis.transport.http.QSWSDLHandler"/>
method"value="org.apache.axis.transport.http.QSMethodHandler"/>