Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5443628
  • 博文数量: 895
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8691
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(895)

文章存档

2021年(2)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: 系统运维

2011-05-12 23:03:11

在这里我将使用一个简单的Web Service 示例的方式演示一下在Axis2 Web Service 中使
用session 的方法。在这个Service 具有登录和取得已登录用户的用户名两个功能。
此示例中所使用的工具:
1.eclipse3.1。
2.Axis2(Apache Axis2 SNAPSHOT build (July 30, 2006) Standard Binary Release)
3.Microsoft Visual C# 2005 Express Edition
4.apache-tomcat-5.5.15(注意:Axis2 必须使用Tomcat5.5)
5.
1.在eclipse中新建一个java工程Axis2SessionDemo(如下图),开始编写wsdl文件
UserServices.wsdl(内容如下)。
Axis2SessionDemo 工程结构
UserServices.wsdl

xmlns:tns=""
xmlns:wsdl=""
xmlns:xsd="" name="UserServices"
targetNamespace="">

targetNamespace="">





type="xsd:string">






UserServices.wsdl































element="tns:getUsernameResponse">



element="tns:getUsernameRequest">









2.使用Axis2 的WSDL2java.bat工具和UserServices.wsdl文件生成Web Service 的服务器端
的Java代码。生成之后的结构如下图:
生成代码的命令如下(没有换行)
D:\tools\axis2-std-SNAPSHOT-bin\bin\WSDL2java.bat -ss -sd -p cn.livedoor.sysguard -o
D:\java_projects\workspace\Axis2SessionDemo -uri
D:\java_projects\workspace\Axis2SessionDemo\UserServices.wsdl
生成服务器端代码之后工程结构
3.修改resources\services.xml 文件,配置Service 提供Session的功能。
在services.xml文件中找到如下左边内容,并将此内容替换为如下右边内容。

4.新建一个cn.livedoor.sysguard.Constants.java类,用来保存在session 中保存数据的标识。内
容如下:


cn.livedoor.sysguard.Constants.java
package cn.livedoor.sysguard;
public class Constants {

//在session 中存放用户ID的标识
public static final String USER_ID = "userid";

//在session 中存放密码的标识
public static final String USER_PASSWORD = "password";
}


5.在cn.livedoor.sysguard.UserServicesSkeleton.java类中编写业务逻辑方法。需增加业务内容
的方法:login, getUsername。增加的其它方法:setOperationContext。内容如下:
cn.livedoor.sysguard.UserServicesSkeleton.java
/**
* UserServicesSkeleton.java
*
* This file was auto-generated from WSDL
* by the Apache Axis2 version: SNAPSHOT Jul 30, 2006 (08:21:11 GMT+00:00)
*/
package cn.livedoor.sysguard;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.OperationContext;
import org.apache.axis2.context.SessionContext;
import org.apache.axis2.wsdl.WSDLConstants;
import cn.livedoor.sysguard.userservices.GetUsernameResponse;
import cn.livedoor.sysguard.userservices.LoginResponse;
/**
* UserServicesSkeleton java skeleton for the axisService
*/
public class UserServicesSkeleton {
SessionContext sessionCnt = null;
/**
* 在每次业务方法调用之前都先调用此方法。 在此方法中用来获得sessionContext。
*
* @param operationContext
* @throws AxisFault
*/
public void setOperationContext(OperationContext operationContext)
throws AxisFault {
System.out.println("+++++++++++ setOperationContext start +++++++++++");
MessageContext msgCnt = operationContext
.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
this.sessionCnt = msgCnt.getSessionContext();
System.out.println("+++++++++++ setOperationContext end +++++++++++");
}
cn.livedoor.sysguard.UserServicesSkeleton.java
/**
* 业务方法 在此例中用来将客户端传送过来的数据保存至sessionContext 中。
*
* Auto generated method signature
*
* @param param0
*
*/
public cn.livedoor.sysguard.userservices.LoginResponse login(
cn.livedoor.sysguard.userservices.LoginRequest param0)
throws AxisFault
{
System.out.println("+++++++++++ login start +++++++++++");
String ret = "";
LoginResponse res = new LoginResponse();
String userID = param0.getUserID();
String password = param0.getPassword();
setProperty(Constants.USER_ID, userID);
setProperty(Constants.USER_PASSWORD, password);
ret += "userID: " + userID + " password: " + password + "\n";
System.out.println(ret);
res.set_return(ret);
System.out.println("+++++++++++ login success end +++++++++++");
return res;
}
/**
* 业务方法 在此例中用来将保存至sessionContext 中的数据取出并返回给客户端。
*
* Auto generated method signature
*
* @param param2
*
*/
public cn.livedoor.sysguard.userservices.GetUsernameResponse getUsername(
cn.livedoor.sysguard.userservices.GetUsernameRequest param2)
{
System.out.println("+++++++++++ getUserName start +++++++++++");
String ret = "";
GetUsernameResponse res = new GetUsernameResponse();
cn.livedoor.sysguard.UserServicesSkeleton.java
String param2_userid = "param2.getUserID(): " + param2.getUserID()
+ "\n";
String userID = getProperty(Constants.USER_ID);
String password = getProperty(Constants.USER_PASSWORD);
ret += param2_userid + " userID: " + userID + " password: " + password;
res.set_return(ret);
System.out.println(ret);
System.out.println("+++++++++++ getUserName success end +++++++++++");
return res;
}
/**
* 私有方法 用来将数据保存至sessionContext 中。
*
* @param name
* @param value
* @throws AxisFault
*/
private void setProperty(String name, String value) throws AxisFault {
System.out.println("setProperty name: " + name + " value: " + value);
sessionCnt.setProperty(name, value);
}
/**
* 私有方法 用来将保存至sessionContext 中的数据取出。
*
* @param name
* @return
*/
private String getProperty(String name) {
String value = (String) sessionCnt.getProperty(name);
String result = "getProperty name: " + name + " value: " + value;
System.out.println(result);
return value;
}
}
6.到此为至服务器端Java代码已全部完成。现在将此工程打包为一个.aar 包。
1.在eclipse中打开ant视图,并将WSDL2Java生成的build.xml加入。
2.运行build.xml 中的jar.server 任务生成UserServices.aar 包。
3.运行2 中的命令之后将会新生成一个build 目录,生成包的位置在工程中:
build\lib\UserServices.aar。
运行jar.server任务之后的工程结构
7.现在配置Axis2,使Axis2 打开支持Session 的功能。找到axis2.war 在Tomcat中解开之后
的位置,例如:C:\apache-tomcat-5.5.15\webapps\axis2(以下就将此目录简称为axis2 Web应
用目录)。然后在此目录(axis2 Web 应用目录)中的WEB-INF\conf 目录下有一个名为
axis2.xml的文件,打开此文件,并将如下图中左边内容替换为右边内容。
Axis2.xml
locked="false">false
locked="false">true
8.将步骤6 中生成的UserServices.aar 包复制至axis2 Web 应用目录中的WEB-INF\services
中,启动Tomcat。
这样整个Web Services的服务器端都已经配置完毕,接下来编写C#客户端的代码。
在客户端A
1.新建一个ConsoleApplication 工程Axis2SessionClientDemo。
2.在”References”上面点击右键,选择”Add Web References”。
3.输入””,设置该引用的名称为
“UserServices”。增加引用完成。
4.打开Program.cs 增加如下代码:
Program.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Program.cs
UserServices.UserServices service = new ConsoleApplication1.UserServices.UserServices();
CookieContainer cookieContainer = new CookieContainer();
service.CookieContainer = cookieContainer;
UserServices.loginRequest loginReq = new ConsoleApplication1.UserServices.loginRequest();
loginReq.userID = "whxy";
loginReq.password = "whxy_password";
UserServices.loginResponse loginRes = service.login(loginReq);
UserServices.UserServices service1 = new ConsoleApplication1.UserServices.UserServices();
//CookieContainer cookieContainer1 = new CookieContainer();
service1.CookieContainer = service.CookieContainer;
UserServices.getUsernameRequest req = new ConsoleApplication1.UserServices.getUsernameRequest();
req.userID = "00001";
UserServices.getUsernameResponse res = service1.getUsername(req);
UserServices.getUsernameResponse res1 = service1.getUsername(req);
UserServices.getUsernameResponse res2 = service1.getUsername(req);
UserServices.getUsernameResponse res3 = service1.getUsername(req);
UserServices.getUsernameResponse res4 = service1.getUsername(req);
UserServices.getUsernameResponse res5 = service1.getUsername(req);
System.Console.WriteLine(res.@return);
}
}
}
5.在客户端B 做跟客户端A 同样的内容,并且将传递给服务器端的数据修改为
loginReq.userID = "tister";
loginReq.password = "tister_password";
req.userID = "999999";
6.在调试状态下,将客户端A 的程序运行至
UserServices.getUsernameResponse res1 = service1.getUsername(req);
查看res的返回结果。
7.在调试状态下,将客户端B 的程序也运行至
UserServices.getUsernameResponse res1 = service1.getUsername(req);
查看res的返回结果。
8.再将客户端A 的程序运行至
UserServices.getUsernameResponse res2 = service1.getUsername(req);
查看res1 的返回结果。
9.对比第6 步中客户端A 的res与第8 步中客户端A的res1 的返回结果,这两次的返回结果
是一样的,期望的也是一样的,因为这两次方法调用都是从同一个客户端访问的。再对比第
7 步中客户端B 的res与第8 步中客户端A 的res1 的返回结果,这两次的返回结果将是不一
样的,期望的结果是不一样,因为此时客户端A 已经成功登录,并且将数据保存在服务器
端的session 中了,而后客户端B 也登录至服务器,并将数据保存在服务器端的session 中
了,不同的客户端之间保存的数据是相互独立的,相互之间并没有什么影响,所以达到了最
终的目的。
10.注意:在第一次服务调用时一定要先创建CookieContainer,并且在以后的每次服务调用
都要将第一次返回的CookieContainer 发送至服务器端,以标识该请求是同一客户端的请
求。
UserServices.UserServices service = new ConsoleApplication1.UserServices.UserServices();
CookieContainer cookieContainer = new CookieContainer();
service.CookieContainer = cookieContainer;
UserServices.UserServices service1 = new ConsoleApplication1.UserServices.UserServices();
service1.CookieContainer = service.CookieContainer;
《完》


阅读(540) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~