sessionWord文档格式.docx
《sessionWord文档格式.docx》由会员分享,可在线阅读,更多相关《sessionWord文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
标记而为该会话建立的项目。
此集合可用于确定指定会话项的值或遍历集合并检索出会话中所有项的列表。
Session.Contents(Key)
要获取的属性的名称。
您可以使用一个循环控制结构通过Contents集合的关键字来循环。
下面的示例演示这一过程。
Dimsessitem
ForEachsessiteminSession.Contents
Response.write(sessitem&
Session.Contents(sessitem)&
CodePage
CodePage属性决定将被用以显示动态内容的代码页。
Session.CodePage(=Codepage)
Codepage
这是一个无符号整数,这个整数代表正在运行ASP脚本引擎的系统的有效代码页。
代码页是一个可以包括数字、标点符号、以及其他字母的字符集。
对于不同的语言和地区可以使用不同的代码页。
例如,ANSI代码页1252用于美国英语和大多数欧洲语言;
OEM代码页932用于日文汉字。
代码页是将字符映射成单字节值或多字节值的字符表。
许多代码页共享ASCII字符集中0x00-0x7F之间的字符。
Abandon
Abandon方法删除所有存储在Session对象中的对象并释放这些对象的源。
如果您未明确地调用Abandon方法,一旦会话超时,服务器将删除这些对象。
Session.Abandon
Abandon方法被调用时,将按序删除当前的Session对象,不过在当前页中所有脚本命令都处理完后,对象才会被真正删除。
这就是说,在调用Abandon时,可以在当前页上访问存储在Session对象中的变量,但在随后的Web页上不行。
例如,在下列脚本中,第三行打印出Mary值。
这是因为在服务器处理完脚本前没有删除Session对象。
Session("
MyName"
)="
Mary"
Reponse.Write(Session("
))
如果在随后Web页上访问MyName变量,您将发现它是空的。
这是因为当包含上一个例子的页面结束处理时,MyName同前面的Session对象一起被删除了。
放弃会话并打开后面的Web页时,服务器会创建新的Session对象。
您可以在新的Session对象中存储变量和对象。
示例
当服务器处理完当前页时,下面示例将释放会话状态。
%Session.Abandon%>
LCID
LCID属性决定用于显示动态内容的位置标识。
Session.LCID(=LCID)
有效的现场标识。
LCID指定现场标识,现场标识是唯一标识某个系统定义的现场的国际标准缩写。
SessionID
SessionID属性返回用户的会话标识。
在创建会话时,服务器会为每一个会话生成一个单独的标识。
会话标识以长整形数据类型返回。
Session.SessionID
不要用SessionID属性为数据库应用程序创建主关键字。
这是因为,如果Web服务器重新启动,则部分SessionID的值可能同服务器终止前产生的值相同。
可以使用自动增加的列数据类型来代替,如Microsoft®
SQLServer中的IDENTITY,或Microsoft®
Access中的COUNTER。
Session_OnStart
Session_OnStart事件在服务器创建新会话时发生。
服务器在执行请求的页之前先处理该脚本。
Session_OnStart事件是设置会话期变量的最佳时机,因为在访问任何页之前都会先设置它们。
所有内建对象(Application、ObjectContext、Request、Response、Server和Session)都可以在Session_OnStart事件脚本中使用和引用。
SCRIPTLANGUAGE=ScriptLanguageRUNAT=Server>
SubSession_OnStart...EndSub'
by
/SCRIPT>
ScriptLanguage
指定用于编写事件脚本的脚本编写语言。
可以是任何一种支持脚本的语言,例如VBScript或JScript。
如果有多个事件使用同一种脚本编写语言,就可以将它们组织在一组<
SCRIPT>
标记下。
尽管在Session_OnStart事件包含Redirect或End方法调用的情况下Session对象仍会保持,然而服务器将停止处理Global.asa文件并触发Session_OnStart事件的文件中的脚本。
举一个例子,为了确保用户在打开某个特定的Web页时始终启动一个会话,就可以在Session_OnStart事件中调用Redirect方法。
当用户进入应用程序时,服务器将为用户创建一个会话并处理Session_OnStart事件脚本。
您可以将脚本包含在该事件中以便检查用户打开的页是不是启动页,如果不是,就指示用户调用Response.Redirect方法启动网页。
其演示如下例所示。
SCRIPTRUNAT=ServerLanguage=VBScript>
SubSession_OnStart
'
Makesurethatnewusersstartonthecorrect
pageoftheASPapplication.'
by
ReplacethevaluegiventostartPagebelow
withthevirtualpathtoyourapplication'
s
startpage.
startPage="
/MyApp/StartHere.asp"
currentPage=Request.ServerVariables("
SCRIPT_NAME"
Doacase-insensitivecompare,andifthey
don'
tmatch,sendtheusertothestartpage.
ifstrcomp(currentPage,startPage,1)thenResponse.Redirect(startPage)endifEndSub<
上述示例只能在支持cookie的浏览器中运行。
因为不支持cookie的浏览器不能返回SessionIDcookie,所以,每当用户请求Web页时,服务器都会创建一个新会话。
这样,对于每个请求,服务器都将处理Session_OnStart脚本并将用户重定向到启动页中。
如果您要使用下面的脚本,建议您在启动页上放一个通知,告诉用户该站点要求支持cookie的浏览器。
请注意,在Redirect方法之后的任何Session_OnStart事件脚本都不会执行。
因此,应该在您的事件脚本的最后再调用Redirect方法。
SCRIPTLANGUAGE=VBScriptRUNAT=Server>
Sessioninitializationscript
Response.Redirect"
http:
/server/app/StartHere.asp"
Endsub
在上面的例子中,Redirect方法在执行会话初始化脚本期间隐藏所有显示给客户的文字。
Session_OnEnd
Session_OnEnd事件在会话被放弃或超时发生。
在服务器内建对象中,只有Application、Server和Session对象可用。
SubSession_OnEnd...EndSub
可以是任一支持脚本编写的语言,例如VBScript或JScript。
如果有多个事件使用同一种脚本编写语言,则可以将其组织在一组<
在Session_OnEnd脚本中不能调用MapPath方法。
Timeout
Timeout属性以分钟为单位为该应用程序的Session对象指定超时时限。
如果用户在该超时时限之内不刷新或请求网页,则该会话将终止。
Session.Timeout[=nMinutes]
nMinutes
指定会话空闲多少分钟后服务器自动终止该会话。
默认值为15分钟。
-
关注此文的读者还看过:
资料引用:
2.NHibernatesession的管理
NHibernate中的Session,在我的理解似乎就相当于数据库中连接。
因为它也有Open/Close的方法,我没有研究NHibernate的源码,不知道这种理解是否有误?
我在网上搜了很多的关于Session的管理,大多都是在我需要数据库操作的时候,就OpenSession(),操作完后就CloseSession().这有点拟似如我们刚开始学习ADO.NET的时候,要Connection对象Open(),数据处理完后就Close().但是这里就带来了一个弊端,因为Connection的频繁的开关是非常消耗系统资源的。
我记得以前在制作一个数据的录入界面的时,因为这个录入的界面数据元素比较多,而且很多DropDownList需要在数据库中读取数据并绑定。
这样在该页面的Page_Load中需要调用相应对象的方法一一从数据库中检索数据绑定DropDownList.因为我们这些对象的方法都是使用独立的Connection,都有自己的Connection的Open和Close。
所以,导致这个页面一打开就需要等待好长的时间,比较慢。
后来我们将这些需要绑定DropDownList的数据通过一个数据处理成一个DataSet,并将DataSet中的DataTable与DropDownList绑定。
这样只需要一次的Connection的Open/Close.页面快了好多。
所以,我觉得上述的Session的管理办法不是很妥当。
后来,我看了Cuyahoga开源项目中他的Session管理,他使用的“session-per-request”这种模式。
从字面上理解就是他为每个Request创建一个Session,直到这个请求销毁,那么这个Session也就Close了。
而Cuyahoga他的做法和session-per-request有点不同地方就是,他为每个Request都创建了一个CoreRepository对象,CoreRepository是系统所需要的数据处理服务的类。
他的做法是先创建了HttpModule(NHSessionModule)用来创建CoreRepository对象和销毁CoreRepository对象,如下:
privatevoidContext_BeginRequest(objectsender,EventArgse)
{
//CreatetherepositoryforCoreobjectsandaddittothecurrentHttpContext.
CoreRepositorycr=newCoreRepository(true);
HttpContext.Current.Items.Add("
CoreRepository"
cr);
}
privatevoidContext_EndRequest(objectsender,EventArgse)
//ClosetheNHibernatesession.
if(HttpContext.Current.Items["
]!
=null)
CoreRepositorycr=(CoreRepository)HttpContext.Current.Items["
];
cr.CloseSession();
这样在每次请求的时候,会自动创建CoreRepository对象,当请求完毕后,就CloseSession(),在程序中通过HttpContext.Current.Items["
]就能获取CoreRepository对象了。
这样也就变相的管理了NHibernate中的Session,也就达到了“session-per-request”的这种模式。
详细的讲解:
通过实现IHttpModule初始化Nhibernate的Session
这种方式比上面的那个每次操作都需要创建Session,性能和速度应该提高了不少,
接着我就想,每个请求都创建Session,是不是我们可以象创建ConnectionPool一样,也创建一个SessionPool,
这样就每次请求的时候不是直接创建Session,而是在我们的SessionPool中拿已经创建好的Session,这样效率不是更好?
!
3.sessionhastable购物车
1privatevoidDataGrid1_ItemCommand(objectsource,System.Web.UI.WebControls.DataGridCommandEventArgse)//假设前面购买命令是一个命令名为buy的LinkButton
2
{//关键,建立和加如购物车
3
stringpid=this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString();
//取出宠物编号
4
if(e.CommandName=="
buy"
)//如果命令名是buy,说明是购买
5
6
if(Session["
bus"
]==null)//先就得检查购物车是否存在,如果不存在,就建立呗
7
8
System.Collections.Hashtableht=newHashtable();
//先建立一个哈希表
9
ht.Add(pid,1);
//哈希表中的两个列,一个key,一个value,我们就前面放宠物编号,后面放购买数量好了,预设置为1
10
Session["
]=ht;
//将哈希表赋值给Session对象
11
12
else//如果存在的话
13
14
Hashtableht=(Hashtable)Session["
//使用强制类型转换,再将Session["
]赋值给哈希表对象ht
15
if(ht[pid]==null)//如果哈希表中对应的ID没有,
16
17
ht[pid]=1;
//那就直接给他设为 1
18
19
else//如果已经有对应的ID
20
21
ht[pid]=(int)ht[pid]+1;
//那么就把原来的取出来再加上 1
22
23
//最后再更新Session对象
24
25
26
27
而读取的方法更简单了,如下:
this.DataList1.DataSource=(Hashtable)Session["
//直接利用哈希表作为数据源,
this.DataList1.DataBind();
//绑定一下
更新数量
1privatevoidLinkButton1_Click(objectsender,System.EventArgse)
3
foreach(DataListItemdlinthis.DataList1.Items)//遍历集合
TextBoxtb=(TextBox)dl.FindControl("
TextBox1"
);
//找到文本框
intnewpid=Convert.ToInt32(tb.Text.ToString());
//查出文本框里面的值
8
Labellabel1=(Label)dl.FindControl("
key"
//找到装载哈希表key字段的那个控件
stringpid=label1.Text.ToString();
//把他的值拿出来
//把session["
]对象赋值给哈希表ht
intoldpid=(int)ht[pid];
//求得原来的数量
if(newpid!
=oldpid)//如果文本框里的值不等于原来的数量,就用新的更换到哈希表中的值
ht[pid]=newpid;
出处:
.net入门ing……BLOG
4.个页面间不通过Session与url的传值方式
下面是全部代码,已经编译通过。
Chuandi(传递)是名字空间
WebForm1:
%@Pagelanguage="
c#"
Codebehind="
WebForm1.aspx.cs"
Inherits="
chuandi.WebForm1"
%>
HTML>
<
HEAD>
title>
WebForm1<
/title>
/HEAD>
body>
formid="
Form1"
method="
post"
runat="
server"
>
asp:
TextBoxid="
/asp:
TextBox>
Buttonid="
Button1"
Text="
传"
Button>
/form>
/body>
/HTML>
usingSystem;
namespacechuandi
{
publicclassWebForm1:
System.Web.UI.Page
protectedSystem.Web.UI.WebControls.TextBoxTextBox1;
protectedSystem.Web.UI.WebControls.ButtonButton1;
publicstringText1
get
returnthis.TextBox1.Text;
privatevoidPage_Load(objectsender,System.EventArgse)
{}
overrideprotectedvoidOnInit(EventArgse)
InitializeComponent();
base.OnInit(e);
privatevoidInitializeComponent()
{
this.Button1.Click+=newSystem.EventHandler(this.Button1_Click);
this.Load+=n