APP下载

用XFire框架实现W ebService的研究与实践

2016-10-18王玲余秋桦

湖南邮电职业技术学院学报 2016年3期
关键词:计算机系王玲服务端

王玲,余秋桦

(广东邮电职业技术学院计算机系,广东广州510630)

用XFire框架实现W ebService的研究与实践

王玲,余秋桦

(广东邮电职业技术学院计算机系,广东广州510630)

XFire框架通过提供简单的API支持WebService各项标准协议,从而方便快速地开发WebService应用。XFire作为WebService的实现框架,它内部将功能各异的接口抽象成了具有共同行为和属性的服务。有两种方式将POJO发布成Web服务。一种方式是直接使用Web服务接口和Web服务实现类来发布;另一种方式是基于JSR181标准和注释技术将被注释的POJO发布成Web服务。

XFire;WebService;POJO

XFire是codeHaus组织提供的一个开源框架,主要功能就是支持将简单java对象(POJO)通过简单的方式发布成WebService,不仅充分发挥了POJO的作用,还简化了Java应用转化为WebService的步骤和过程。

1 XFire架构的基本结构

在xfire中是用org.codehaus.xfire.service.Service这个类来表示抽象出来的结果,如图1所示中可以看到其主要实现了两个接口:Visitable和HandlerSupport,继承了一个类AbstractContext。

图1 XFire框架基本结构图

Visitable接口就是可以被外界的系统访问。AbstractContext抽象类,其内部是一个map类,并提供了相应的setter、getter、remove方法来操作上下文信息。xfire将客户端、服务端的各种操作抽象为Handler,并且Handler除了必备的invoke外,还额外定义了其他几个属性:

1)getAfter:返回handler执行后要进行的动作。

2)handleFault:处理在handler执行过程中发生的错误。

3)Phase:这个handler所处于的阶段,每个phase有优先级的定义。

4)getBefore:返回handler执行前要进行的动作。

5)role:表示这个服务应用于那些角色。

XFire将各种handler又划分为3类:

6)FaultHandler发生异常时的各项操作,主要是FaultSender通过输出channel传输信息;CustomFault-Handler从异常信息中构建一个定制化的详情。

7)InHandler服务端进行的各项操作,主要是ServiceInvocationHandler获取传入的参数(InMessage)、执行service、创建返回结果(OutMessage);PostInvocationHandler发送结果到客户端。

8)OutHandler客户端进行的各项操作,主要是OutMessageSender根据输出渠道(Channel)发送消息。

Service给出了一个服务的整体模板。对于一个具体的服务所表示的接口及其所具备的方法功能,都存放在ServiceInfo这个类中,通过反射的方式将接口中方法信息类信息都进行了存放,供使用。功能的实现主要包括了两类:客户端的输出和服务端的输入处理及输出。

2 用XFire框架开发WebService案例实践

2.1服务器端配置文件

XFire的配置web.xml:

<?xm l version="1.0"encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/

javaee"xm lns:xsi="http://www.w3.org/2001/XMLSchema -instance"version="2.5"xsi:schemaLocation="http:// java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/

javaee/web-app_2_5.xsd">

<servlet>

<servlet-name>XFireServlet</servlet-name>

<servlet-class>org.codehaus.xfire.transport.http. XFireConfigurableServlet

</servlet-class>

<load-on-startup>0</load-on-startup></servlet>

<servlet-mapping>

<servlet-name>XFireServlet</servlet-name>

<url-pattern>/services/*</url-pattern>

</servlet-mapping>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

XFire默认加载services.xml:

<beans xmlns="http://xfire.codehaus.org/config/1. 0">

<service>

<name>driver</name>

<serviceClass>接口名</serviceClass>

<implementationClass>

实现类名

</implementationClass>

<style>wrapped</style>

<use>literal</use>

<scope>application</scope>

</service>

</beans>

2.2服务器端实现类实例

public class Driver implements IDriver{

private String key="";

//注册用户

public String registerUser(String userInfoRequest){

boolean isOK=true;

String returnData="";

JSONObject json=null;

try{

json=JSONObject.fromObject(userInfoRequest);

if(!String.valueOf(json.get("key")).equals(key)){

isOK=false;

returnData="系统验证错误";

}catch(Exception e){

isOK=false;

returnData="请求格式错误";

if(isOK){

HashMap<String,String>map=new HashMap<String,String>();

try{

String returnCode=DriverOP.setNewUser(userInfoRequest);

map.put("returnCode",returnCode);

if(returnCode.equals("1")){

map.put("returnData","注册成功");

}else if(returnCode.equals("2")){

map.put("returnData","用户名已经存在");

}else if(returnCode.equals("0")){

map.put("returnData","注册不成功");

Gson gson=new Gson();

returnData=gson.toJson(map,

new TypeToken<HashMap<String,String>>(){

}.getType());

}catch(Exception e){

returnData="请求格式错误";

return returnData;

2.3and roid客户端实例

public class SoapRequest implements Runnable{

private static final String ADDRESS_URL="http://192.168.1.41:3366/Company/services/manager";

private static final String SERVER_NAME_SPACE ="http://entry.company.com";

private static SoapRequest soapRequest;

private SoapHandler soapHandler;

private static final int SEND_MESSAGE=1;

private static final int QUEIT_MESSAGE=2;

private static ContextmContext;

public static void InitSoap(Context context){

mContext=context;

if(soapRequest==null){

soapRequest=new SoapRequest();

new Thread(soapRequest).start();

public static SoapRequest getInstance(){

return soapRequest;

public void SendMsg(RequestInfo requestInfo){

if(soapHandler!=null){

Messagemsg=new Message();

msg.what=SEND_MESSAGE;

msg.obj=requestInfo;

soapHandler.sendMessage(msg);

public void exit(){

if(soapHandler!=null){

soapHandler.sendEmptyMessage(QUEIT_MESSAGE);

}}

@Override

public void run(){

//TODO Auto-generated method stub

Looper.prepare();

soapHandler=new SoapHandler();

Looper.loop();

Log.d("SoapRequest","exit soap thread");

private class SoapHandler extends Handler{

@Override

public void handleMessage(Messagemsg){

//TODO Auto-generatedmethod stub

super.handleMessage(msg);

switch(msg.what){

case SEND_MESSAGE:

RequestInfo requestInfo=(RequestInfo)msg.obj;

RequestResultInfo requestResultInfo=Request(requestInfo);

Intent intent=new Intent();

intent.setAction(requestResultInfo.ReceiverBroadcast);

mContext.sendBroadcast(intent);

break;

case QUEIT_MESSAGE:

this.getLooper().quit();

break;

default:

break;

private RequestResultInfo Request(RequestInfo requestInfo){

SoapObject request=new SoapObject(SERVER_NAME_SPACE,requestInfo.RequestMethod);

request.addProperty(requestInfo.RequestProperty,requestInfo.RequestJson);

SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);

envelope.bodyOut=request;

new MarshalBase64().register(envelope);

HttpTransportSE transport=new HttpTransportSE(ADDRESS_URL);

transport.debug=true;

String result=null;

RequestResultInfo requestResultInfo=new RequestResultInfo();

requestResultInfo.ReceiverBroadcast=requestInfo. ReceiverBroadcast;

try{

transport.call(null,envelope);

SoapObjectobject=(SoapObject)envelope.bodyIn;

result=object.getProperty(0).toString();;

requestResultInfo.Result=result;

}catch(IOException e){

//TODO Auto-generated catch block

e.printStackTrace();

}catch(Xm lPullParserException e){

//TODO Auto-generated catch block

e.printStackTrace();

return requestResultInfo;

3 小结

XFire框架中,以上是直接使用Web服务接口和Web服务实现类来实现将POJO发布成Web服务;另一种方式是基于JSR181标准和注释技术将被注释的POJO发布成Web服务。客户端是以android为例。这是个服务器和客户端连接的实际案例。

[1]胡强.Web服务流程的结构范式及其判定算法[J].计算机学报,2015(1):178-190.

[2]张威.基于Xfire实现跨平台的Flex消息订阅服务[J].湖北工业大学学报,2015(1):39-42.

[3]白光佩.中通供应商业务系统的Android手机客户端设计与实现[D].济南:山东大学,2015.

[4]龚瑞琴,毕利.基于Web Service的Android技术应用研究[J].电子技术应用,2014(1):134-136.

[5]王晓禹,石丽.基于JSON实现Android智能终端与Web服务器“面向对象”的信息交换[J].数字技术与应用,2012(4):224-225.

Research and practiceon using XFire to achieveW ebService

WANG Ling,YU Qiu-hua
(Computer DepartmentofGuangdong VocationalCollegeofPostand Telecom,Guangzhou,Guangdong,China 510630)

XFire provides simple API for supporting standard protocols of WebService so as to rapidly develop WebService applications.Being the implementation framework ofWebService,XFiremakes the different interfaces into serviceswhich have joint conductand attribute.There're twomethods for publishing POJO toweb service,usingweb service interface and implementation classor JSR181 standard and annotation technology.

XFire;WebService;POJO

10.3969/j.issn.2095-7661.2016.03.010】

TP393.09

A

2095-7661(2016)03-0035-03

2016-06-27

王玲(1971-),女,广东广州人,广东邮电职业技术学院讲师,硕士,研究方向:计算机应用开发、软件教育。

广东大学生科技创新培育专项资金项目(项目编号:pdjh2015b0726)。

猜你喜欢

计算机系王玲服务端
少年追梦郎
少年追梦郎
少年追梦郎
新时期《移动Web服务端开发》课程教学改革的研究
在Windows Server 2008上创建应用
童年趣事之不一起玩的理由
童年趣事之不一起玩的理由
追女友
剪窗花
摸清黑客套路防范木马侵入