本文主要介绍一些旧的环境,比如JDK1.5,JBOSS4,如何实现WebService 并支持Session的方法。

最近遇到顽固的客户(停留在JDK1.5,JBOSS4),加上技术掉队的设计师(各种奇葩:WS里设计了Session,还停留在JSP/Serverlet时代;放着SpringSocket通讯不用,再部署一个NodeJS的Express服务器来实现即时通讯

但是悲惨的是,哥遇到了,哥能怎么办呢。还好哥哥我各种奇葩都能应付。善哉善哉。。。。

理论上讲AXIS2已经出来很多年了, 基本上除了史前环境没有人还会用AXIS构建WebService,写篇文章留作纪念

废话不多说,直奔主题。

开发环境,

Tomcat5 ,JDK1.5 ,(都EOL了,EndOfLife )如果需要数据库框架Mybatis的话,只能用3.1.0 


Eclipse下建个DynamicWebProj,类名随意了,我是DemoServiceInterface

服务端基本用于测试写2个方法,

 第一个主要功能 获得HttpSession,并且写入一点测试数据

public String getResponse1(){
    MessageContext context = MessageContext.getCurrentContext();
    HttpServletRequest req = (HttpServletRequest) context.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);
    HttpSession sc = req.getSession(); 
    String sessionID = sc.getId();
    //Session sc = context.getSession();
    sc.setAttribute("id", sessionID);
    sc.setAttribute("user", "demo");
    System.out.println(sessionID);
    return "getResponse1! SessionID:" + sessionID;
}	

第二个主要功能 从HttpSession获取测试数据

public String getResponse2(){
	MessageContext context = MessageContext.getCurrentContext(); 
	HttpServletRequest req = (HttpServletRequest) context.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);
        HttpSession sc = req.getSession();         
        String tmp = (String) sc.getAttribute("id");
	System.out.println(tmp);
	return "getResponse2! SessionID:" + tmp;
}

新版的Eclipse在生成WS(点击鼠标右键,WebService,生成…)后的代码,居然Commonlog配置报错,EOL,没办法,申报BUG都没用的,

测了下直接删掉这个JAR,还好影响不大,服务器正常跑起来了

通过访问Service站点确认

http://localhost:8080/WebServiceProject/services/DemoServiceInterface

如果显示

DemoServiceInterface

Hi there, this is an AXIS service!

Perhaps there will be a form for invoking the service here...

表示正常。

接下来客户端调用部分,2个服务端方法调用的方式都一样,通过setOperationName可以换调用的对象。

Call call = (Call) client.createCall();
call.setOperationName("getResponse1");// 注意。这里是要调用的方法名
call.setTargetEndpointAddress(urlname);// 设置调用的目标url
String val = (String) call.invoke(new Object[] {}); 
System.out.println("Return From WebService:>>>>" + val);

客户端创建两个方法一个调用getResponse1实现建立HttpSession,另一个CallWebService获取Session里的值

好了,基本活干完了,写个测试一下。看看不同实例是不是返回不同的ID。

public static void main(String args[]) throws Exception {
	Demo demo1 = new Demo();
	Demo demo2 = new Demo();
	demo1.CreateSession();
	demo1.CallWebService();
	demo1.CallWebService();
	demo2.CreateSession();
	demo1.CallWebService();
	demo2.CallWebService();
	demo2.CallWebService();
}

执行Main返回

Return From WebService:>>>>getResponse1! SessionID:66376BF1ECEBEDAAA3342810EE505F01
Return From WebService:>>>>getResponse2! SessionID:66376BF1ECEBEDAAA3342810EE505F01
Return From WebService:>>>>getResponse2! SessionID:66376BF1ECEBEDAAA3342810EE505F01
Return From WebService:>>>>getResponse1! SessionID:BE16299F2FEEF0B4A0456BA2AF8CEAA5
Return From WebService:>>>>getResponse2! SessionID:66376BF1ECEBEDAAA3342810EE505F01
Return From WebService:>>>>getResponse2! SessionID:BE16299F2FEEF0B4A0456BA2AF8CEAA5
Return From WebService:>>>>getResponse2! SessionID:BE16299F2FEEF0B4A0456BA2AF8CEAA5

可以发现返回的SessionID和实例对应。

 

最后修改日期: 2015年7月9日

作者