`
yongguang423
  • 浏览: 110575 次
  • 性别: Icon_minigender_1
  • 来自: 山东
社区版块
存档分类
最新评论

Axis Web Service开发之旅 (六) --会话(Session)管理

阅读更多
<!--  第2步:添加scope属性  -->  
<service name="loginService" scope="transportsession">  
    <description>  
        登录服务   
        </description>  
    <parameter name="ServiceClass">  
        service.LoginService   
        </parameter>  
    <messageReceivers>  
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"  
            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />  
    </messageReceivers>  
</service>  
<!--  第2步:添加scope属性  -->
<service name="loginService" scope="transportsession">
    <description>
        登录服务
        </description>
    <parameter name="ServiceClass">
        service.LoginService
        </parameter>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    </messageReceivers>
</service>

 WebService给人最直观的感觉就是由一个个方法组成,并在客户端通过SOAP协议调用这些方法。这些方法可能有返回值,也可能没有返回值。虽然这样可以完成一些工具,但这些被调用的方法是孤立的,当一个方法被调用后,在其他的方法中无法获得这个方法调用后的状态,也就是说无法保留状态。

读者可以想象,这对于一个完整的应用程序,无法保留状态,就意味着只依靠WebService很难完成全部的工作。例如,一个完整的应用系统都需要进行登录,这在Web应用中使用Session来保存用户登录状态,而如果用WebService的方法来进行登录处理,无法保存登录状态是非常令人尴尬的。当然,这也可以通过其他的方法来解决,如在服务端使用static变量来保存用户状态,并发送一个id到客户端,通过在服务端和客户端传递这个id来取得相应的用户状态。这非常类似于Web应用中通过Session和Cookie来管理用户状态。但这就需要由开发人员做很多工作,不过幸好Axis2为我们提供了WebService状态管理的功能。

使用Axis2来管理WebService的状态基本上对于开发人员是透明的。在WebService类需要使用org.apache.axis2.context.MessageContext和org.apache.axis2.context.ServiceContext类来保存与获得保存在服务端的状态信息,这有些象使用HttpSession接口的getAttribute和setAttribute方法获得与设置Session域属性。

除此之外,还需要修改services.xml文件的内容,为<service>元素加一个scope属性,该属性有四个可取的值:Application, SOAPSession, TransportSession, Request,不过要注意一下,虽然Axis2的官方文档将这四个值的单词首字母和缩写字母都写成了大写,但经笔者测试,必须全部小写才有效,也就是这四个值应为:application、soapsession、transportsession、request,其中request为scope属性的默认值。读者可以选择使用transportsession和application分别实现同一个WebService类和跨WebService类的会话管理。

在客户端需要使用setManageSession(true)打开Session管理功能。

综上所述,实现同一个WebService的Session管理需要如下三步:

1. 使用MessageContext和ServiceContext获得与设置key-value对。

2. 为要进行Session管理的WebService类所对应的<service>元素添加一个scope属性,并将该属性值设为transportsession。

3. 在客户端使用setManageSession(true)打开Session管理功能。

下面是一个在同一个WebService类中管理Session的例子。
先建立一个WebService类,代码如下:

 

package service;   
import org.apache.axis2.context.ServiceContext;   
import org.apache.axis2.context.MessageContext;   
public class LoginService   
{   
    public boolean login(String username, String password)   
    {   
        if("bill".equals(username) && "1234".equals(password))   
        {   
            //  第1步:设置key-value对   
            MessageContext mc = MessageContext.getCurrentMessageContext();   
            ServiceContext sc = mc.getServiceContext();   
            sc.setProperty("login", "成功登录");       
            return true;   
        }   
        else  
        {   
            return false;   
        }   
    }   
    public String getLoginMsg()   
    {   
        //  第1步:获得key-value对中的value   
        MessageContext mc = MessageContext.getCurrentMessageContext();   
        ServiceContext sc = mc.getServiceContext();   
        return (String)sc.getProperty("login");       
    }   
}   
  
  
   
package service;
import org.apache.axis2.context.ServiceContext;
import org.apache.axis2.context.MessageContext;
public class LoginService
{
    public boolean login(String username, String password)
    {
        if("bill".equals(username) && "1234".equals(password))
        {
            //  第1步:设置key-value对
            MessageContext mc = MessageContext.getCurrentMessageContext();
            ServiceContext sc = mc.getServiceContext();
            sc.setProperty("login", "成功登录");    
            return true;
        }
        else
        {
            return false;
        }
    }
    public String getLoginMsg()
    {
        //  第1步:获得key-value对中的value
        MessageContext mc = MessageContext.getCurrentMessageContext();
        ServiceContext sc = mc.getServiceContext();
        return (String)sc.getProperty("login");    
    }
}



   
 


  

在LoginService类中有两个方法:login和getLoginMsg,如果login方法登录成功,会将“成功登录”字符串保存在ServiceContext对象中。如果在login方法返回true后调用getLoginMsg方法,就会返回“成功登录”。

下面是LoginService类的配置代码(services.xml):

 

使用如下的命令生成客户端使用的stub类:

%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8080/axis2/services/loginService?wsdl -p client -s -o stub

在stub\src\client目录中生成了一个LoginServiceStub.java类,在该类中找到如下的构造句方法:

 

public LoginServiceStub(org.apache.axis2.context.ConfigurationContext configurationContext,   
        java.lang.String targetEndpoint, boolean useSeparateListener)   
        throws org.apache.axis2.AxisFault    
{   
          
    _serviceClient.getOptions().setSoapVersionURI(   
                                 org.apache.axiom.soap.SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);   
}  
public LoginServiceStub(org.apache.axis2.context.ConfigurationContext configurationContext,
        java.lang.String targetEndpoint, boolean useSeparateListener)
        throws org.apache.axis2.AxisFault 
{
       
    _serviceClient.getOptions().setSoapVersionURI(
                                 org.apache.axiom.soap.SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
}

   

在该方法中最后添加如下的代码:

//  第3步:打开客户端的Session管理功能
_serviceClient.getOptions().setManageSession(true);

下面的客户端代码使用LoginServiceStub对象访问了刚才建立的WebService:

LoginServiceStub stub = new LoginServiceStub();   
LoginServiceStub.Login login = new LoginServiceStub.Login();   
login.setUsername("bill");   
login.setPassword("1234");   
if(stub.login(login).local_return)   
{   
    System.out.println(stub.getLoginMsg().local_return);   
}  
LoginServiceStub stub = new LoginServiceStub();
LoginServiceStub.Login login = new LoginServiceStub.Login();
login.setUsername("bill");
login.setPassword("1234");
if(stub.login(login).local_return)
{
    System.out.println(stub.getLoginMsg().local_return);
}
 



 
运行上面的代码后,会输出“成功登录”信息。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/crazystone4/archive/2009/06/20/4285741.aspx

分享到:
评论

相关推荐

    axis2-eclipse-codegen-plugin-1.6.2和axis2-eclipse-service-plugin-1.6.2

    总结来说,"axis2-eclipse-codegen-plugin-1.6.2"和"axis2-eclipse-service-plugin-1.6.2"是针对Apache Axis2的Eclipse插件,旨在简化基于Axis2的Web服务开发。通过它们,开发者可以高效地生成和部署服务,同时享受...

    axis2-eclipse-codegen-plugin-1.6.2.zip和axis2-eclipse-service-plugin-1.6.2.zip

    "axis2-eclipse-codegen-plugin-1.6.2.zip"和"axis2-eclipse-service-plugin-1.6.2.zip"是强大的开发工具,它们为使用Apache Axis2开发Web服务的Eclipse用户提供了一个友好的环境,使得Web服务的生命周期管理变得...

    axis2-idea-plugin-1.7.9.zip_axis2_axis2-idea-plugin_idea导入axis2_

    标题中的"axis2-idea-plugin-1.7.9.zip_axis2_axis2-idea-plugin_idea导入axis2_"提到了...该插件包含了必要的元数据、编译后的代码和依赖库,用户可以通过导入这个插件来扩展IDE的功能,以更好地管理和开发Axis2项目。

    axis2-eclipse-service-archiver-wizard.zip

    axis2-eclipse-service-archiver-wizard.zip

    axis2-eclipse-service-archiver-wizard和axis2-eclipse-codegen-wizard

    共四个文件,都是最先版的,希望可以帮助大家。axis2-eclipse-service-archiver-wizard和axis2-eclipse-codegen-wizard和axis2-1.6.1-bin和axis2-1.6.1-war

    axis2-eclipse-service与axis2-eclipse-codegen插件

    目前axis2最高版本是2.0以上的版本,但是eclipse和myeclipse都不支持,无奈只能使用低版本的插件1.6.3;经实验,可以安装成功;...axis2-eclipse-service-plugin-1.6.3.zip axis2-eclipse-codegen-plugin-1.6.3.zip

    axis2-eclipse-service-plugin-1.7.4.zip

    标题中的"axis2-eclipse-service-plugin-1.7.4.zip"指的是Axis2 Eclipse服务插件的1.7.4版本的归档文件,它是一个专门为Eclipse集成开发环境(IDE)设计的扩展。这个插件允许开发者在Eclipse中方便地创建、部署和...

    Axis开发Web Service实例

    ### Axis开发Web Service实例详解 #### 一、概述 在探讨如何使用Apache Axis来开发Web Service之前,我们首先需要了解一些基本概念。 **Web Service**是一种标准的技术框架,用于实现不同平台之间的应用通信。它...

    axis2-eclipse-codegen-plugin-1.6.2+axis2-eclipse-service-plugin-1.6.2

    总的来说,"axis2-eclipse-codegen-plugin-1.6.2+axis2-eclipse-service-plugin-1.6.2"的组合为Eclipse用户提供了一套完整的Web服务开发解决方案,从生成代码到部署服务,全程都在熟悉的开发环境中完成,极大地提升...

    axis2-eclipse-service-plugin-1.5.4

    标题“axis2-eclipse-service-plugin-1.5.4”指的是Axis2 Eclipse Service Plugin的1.5.4版本。这是一个专门为Eclipse IDE设计的插件,用于帮助开发人员在Eclipse环境中创建、部署和管理基于Apache Axis2的Web服务。...

    axis.jar,axis-saaj-1.4.jar

    标题中的"axis.jar"和"axis-saaj-1.4.jar"是两个重要的Java库文件,它们在Web服务开发中扮演着核心角色。本文将详细介绍这两个库以及它们与Web服务的关系。 首先,让我们深入了解Axis。Axis是Apache软件基金会的一...

    用axis2开发web service

    【用Axis2开发Web Service】是本文的核心主题,轴心技术是Java开发Web服务的一种框架,相较于Axis1,其过程更为简洁。以下是关于使用Axis2开发Web Service的详细步骤和知识点: 1. **实验环境搭建**: - 首先确保...

    axis2-1.8.0apache-cxf-3.4.4.rar

    描述中提到的"tools的工具包"可能指的是这个压缩包内包含了用于开发和管理Web服务的工具,如服务生成器、测试客户端和部署脚本等。 Apache CXF则是一个全面的开源Web服务框架,它不仅支持SOAP,还支持RESTful...

    axis2-idea-plugin-1.7.8

    总的来说,"axis2-idea-plugin-1.7.8" 是一个强大的工具,可以帮助IntelliJ IDEA用户更便捷地开发和管理基于Axis2的Web服务,提升了开发者的生产力。对于那些频繁处理Web服务的开发人员来说,安装并熟悉这个插件是...

    AXIS Web Service入门及应用

    AXIS Web Service是一种基于Java的开源工具,用于创建和部署Web服务。它是Apache软件基金会的项目,主要用于简化SOAP(简单对象访问协议)处理,使得开发人员可以轻松地将Java类转换为Web服务或调用远程Web服务。在...

    axis2-eclipse-service-archiver-wizard

    总结起来,“axis2-eclipse-service-archiver-wizard”是MyEclipse中用于Axis2服务开发的重要工具,它通过提供直观的向导界面,提高了开发效率,使得在Eclipse环境中构建和管理Axis2 Web服务变得更加容易。...

    axis web service例子

    Axis是Apache软件基金会开发的一个开源Java库,主要用于创建和使用Web服务。本文将深入讲解基于Java的Axis Web服务,以及如何通过一个实际案例来理解其工作原理。 1. Axis简介: Axis是Java平台上流行的Web服务...

    Axis2 Web Service 开发教程

    【Axis2 Web Service 开发教程】是一份详细指导开发者如何使用Apache Axis2框架创建和部署Web服务的教学资料。Apache Axis2是Java世界中一个强大的Web服务引擎,它提供了高效的性能和灵活的架构,使得Web服务的开发...

Global site tag (gtag.js) - Google Analytics