看了一些关于IntraWeb的书,是这样描述UserSession的:可以放置一些公有数据在其中,每个用户保持数据独立。
在Delphi2007中新建一个普通(不带DataModule)的IntraWeb工程,设计了二个Form,一个叫Login,一个叫Main。通过填写用户名和密码,成功后切换到Main。这时候就要用到UserSession了,可我试了许多次,UserSession中定义的变量始终无法取得文本,也无法在任一Form中取到其值。主要代码如下(自己写的或改的语句后标有注释)://--//--UserSessionUnittype
TIWUserSession = class(TIWUserSessionBase)
private
{ Private declarations }
public
{ Public declarations }
usUser, usPass : string; //用户名、密码
end;//--//--ServerControllerprocedure TIWServerController.IWServerControllerBaseNewSession(
ASession: TIWApplication; var VMainForm: TIWBaseForm);
begin
ASession.Data := TIWUserSession.Create(ASession); //原来是Create(nil)
end;//--//--IWLoginprocedure TIWfrmLogin.IWButton1Click(Sender: TObject);
//全是自己写的,调用WebService。
var
nRet : Integer;
begin
if Trim(IWUserId.Text) = '' then
self.WebApplication.ShowMessage('请填写用户名!')
else if Trim(IWPassword.Text) = '' then
self.WebApplication.ShowMessage('请填写密码!')
else
begin
nRet := GetBusinessService(true, '').validateUser(WideString(Trim(IWUserId.Text)), WideString(Trim(IWPassword.Text)));
if nRet = 1 then
begin
self.WebApplication.ShowMessage('登录成功!');
UserSession.usUser := Trim(IWUserId.Text);
UserSession.usPass := Trim(IWPassword.Text);
TIWfrmMain.Create(WebApplication).Show;
self.Hide;
end
else
self.WebApplication.ShowMessage('登录失败!');
IWUserId.Clear;
IWPassword.Clear;
UserSession.usUser := '';
UserSession.usPass := '';
end;
end;procedure TIWfrmLogin.IWButton2Click(Sender: TObject);
begin
self.WebApplication.Terminate('您退出系统了。');
end;{ 这是一个测试按钮,把它放到哪个Form上都取不到UserSession中的变量。
procedure TIWfrmLogin.IWButton3Click(Sender: TObject);
begin
IWLabel3.Text := UserSession.usUser;
end;
}//--//--ServerController
{
Main的内容就略了,和Login的内容类似,同样需要采集公有数据。
}其它都是默认代码。我百思不解,难道是我没写UserSession的Create方法,或者没有从ServerController初始化UserSession,为什么数据写不进也读不出呢?测试按钮中的默认文本“IWLabel3”一直不变。请教各路高人!没有意义的帖诸如沙发、顶、UP之类就不劳您回了。
在Delphi2007中新建一个普通(不带DataModule)的IntraWeb工程,设计了二个Form,一个叫Login,一个叫Main。通过填写用户名和密码,成功后切换到Main。这时候就要用到UserSession了,可我试了许多次,UserSession中定义的变量始终无法取得文本,也无法在任一Form中取到其值。主要代码如下(自己写的或改的语句后标有注释)://--//--UserSessionUnittype
TIWUserSession = class(TIWUserSessionBase)
private
{ Private declarations }
public
{ Public declarations }
usUser, usPass : string; //用户名、密码
end;//--//--ServerControllerprocedure TIWServerController.IWServerControllerBaseNewSession(
ASession: TIWApplication; var VMainForm: TIWBaseForm);
begin
ASession.Data := TIWUserSession.Create(ASession); //原来是Create(nil)
end;//--//--IWLoginprocedure TIWfrmLogin.IWButton1Click(Sender: TObject);
//全是自己写的,调用WebService。
var
nRet : Integer;
begin
if Trim(IWUserId.Text) = '' then
self.WebApplication.ShowMessage('请填写用户名!')
else if Trim(IWPassword.Text) = '' then
self.WebApplication.ShowMessage('请填写密码!')
else
begin
nRet := GetBusinessService(true, '').validateUser(WideString(Trim(IWUserId.Text)), WideString(Trim(IWPassword.Text)));
if nRet = 1 then
begin
self.WebApplication.ShowMessage('登录成功!');
UserSession.usUser := Trim(IWUserId.Text);
UserSession.usPass := Trim(IWPassword.Text);
TIWfrmMain.Create(WebApplication).Show;
self.Hide;
end
else
self.WebApplication.ShowMessage('登录失败!');
IWUserId.Clear;
IWPassword.Clear;
UserSession.usUser := '';
UserSession.usPass := '';
end;
end;procedure TIWfrmLogin.IWButton2Click(Sender: TObject);
begin
self.WebApplication.Terminate('您退出系统了。');
end;{ 这是一个测试按钮,把它放到哪个Form上都取不到UserSession中的变量。
procedure TIWfrmLogin.IWButton3Click(Sender: TObject);
begin
IWLabel3.Text := UserSession.usUser;
end;
}//--//--ServerController
{
Main的内容就略了,和Login的内容类似,同样需要采集公有数据。
}其它都是默认代码。我百思不解,难道是我没写UserSession的Create方法,或者没有从ServerController初始化UserSession,为什么数据写不进也读不出呢?测试按钮中的默认文本“IWLabel3”一直不变。请教各路高人!没有意义的帖诸如沙发、顶、UP之类就不劳您回了。
思路:第一步:假如页面上有个按钮,点击该按钮,session释放,这是很简单的。
第二步:为页面的body写onunload事件,该事件调用按钮的代码。
步骤1:在窗体上放置一个按钮IWBUTTON1,它负责释放session,代码:
procedure TformMain.IWButton1Click(Sender: TObject);
begin
webapplication.Terminate();
end;
不要写webapplication.Terminate(字符串);这样的与句,因为
那样将产生错误。
步骤2:
在窗体上放置一个IWText空间,其属性设置如下:
rawText=true;
wantReturns=false;
然后在IWText的lines里填写这样的代码:
<SCRIPT FOR=window EVENT=onunload>
SubmitForm.IWBUTTON1.value='hi';
SubmitForm.IWBUTTON1.onclick(SubmitForm.IWBUTTON1);
</SCRIPT>
其中的SubmitForm.IWBUTTON1.value='hi';是必须的,不可省略好了!当页面关闭时,相当于点击了那个按钮,于是服务器端的session就释放了。
这样你就不用担心session停留时间太长了,你可以将sessiontimeout设置很长时间了,比如300
分钟,反正只要该页面关闭,对应的session就释放。转自大富翁~~看对你有没有帮助~~
回复2楼:是,没错,根据OO封装原理,应该在类的私有访问中定义数据,而在公有访问权中定义相应的property,以属性的
形式通过读、写权限来访问成员。兹对程序作了较大改动,主要变化如下,结果UserSession中仍空空如也,求各路英雄给个解答!//--//--UserSessionUnit
type
TIWUserSession = class(TIWUserSessionBase)
private
{ Private declarations }
vUser: string; //用户名、密码
vPass: string;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;//加入2个变量,覆盖原构造函数,OO之多态。
property usUser: string read vUser write vUser; //如2楼说,这是正规且优雅的写法,OO之封装
property usPass: string read vPass write vPass;
end;implementation{$R *.dfm}
uses IWInit, ServerController;constructor TIWUserSession.Create(AOwner: TComponent); //初始创建,设置为空。
begin
inherited;
vUser := '';
vPass := '';
end;//--//--ServerControllerprocedure TIWServerController.IWServerControllerBaseNewSession(
ASession: TIWApplication; var VMainForm: TIWBaseForm);
begin
ASession.Data := TIWUserSession.Create(nil); //不敢造次,还改回原来的nil
end;其它unit都没动,参考了自带的示例程序Demos\IntraWeb\Win32\WebMail32