Presentation is loading. Please wait.

Presentation is loading. Please wait.

《ASP.NET数据库网站设计教程(C#版)》

Similar presentations


Presentation on theme: "《ASP.NET数据库网站设计教程(C#版)》"— Presentation transcript:

1 《ASP.NET数据库网站设计教程(C#版)》
配套教学资源 第5章 ASP.NET的状态管理 本章内容:ASP.NET的状态管理包括使用Cookie、Session、Application对象实现状态管理,跨页存取数据,全局数据共享等。 本章重点:使用Cookie对象实现状态管理,使用Session对象存、取数据,使用Application对象共享数据。

2 5.1 状态管理概述 所谓“状态管理”,是指使用ASP.NET中的ViewState、Cookie、Session和Application等对象实现页面数据缓存和传递的技术。 ASP.NET是一种无状态的网页连接机制,服务器处理客户端请求的网页后,与该客户端的连接就中断了。此外,到服务器端的每次往返都将销毁并重新创建网页,因此,如果超出了单个网页的生存周期,网页中的信息将不复存在。也就是说,在默认情况下,服务器不会保存客户端再次请求页面和本次请求之间的关系和相关数据。 在C/S架构的应用程序中,使用全局变量即可很好地解决这个问题,而在ASP.NET环境中则需要使用与状态管理相关的对象来保存用户数据。

3 5.2 创建和使用ViewState对象 ViewState对象是ASP.NET状态管理中常用的一个对象,它通常被用来保存Web页信息及所含控件的值。 ViewState对象概述 使用ViewState对象可以十分方便地在这一过程中保留当前页面中所包含的数据。 Web页面默认是具有“form runat=server”特性的,ASP.NET会自动在输出时给页面添加一个隐含字段。打开一个aspx页面后,在浏览器中右击,在弹出的快捷菜单中单击“查看源”,即可看到经服务器转换成HTML格式后的页面源代码。如图5-1所示的是包含在源代码中的ViewState隐含字段及其值。

4 有了这个隐含字段,页面中其他所有的控件状态,包括页面本身的一些状态都会保存到这个隐含字段的值里面。并且,每次页面提交时会一起提交到服务器。当服务器将处理完毕的页面回发给客户端时,ASP.NET会根据这个值来恢复页面到各个控件提交前的状态。

5 使用ViewState 1. 使用ViewState对象时的注意事项 使用ViewState(视图状态)对象可以带来很多方便,但仍需要注意以下问题。 ① ViewState对象仅能提供当前页面对象的状态信息,而且这些信息不能跨页使用。 ② ViewState对象被序列化为XML的形式,然后再进行Base64编码。 ③ 若页面中包含有一些用于分页显示数据的控件(如GridView),最好不要使用ViewState对象。 ④ ViewState对象的MaxPageStateFieldLength属性用来指定隐含字段的最大长度。

6 2. 启用或禁用ViewState 启用或禁止ViewState保存某控件的信息,可以通过设置控件的EnableViewState属性来实现。该属性值指示服务器控件是否向发出请求的客户端,保持自己的视图状态以及它所包含的任何子控件的视图状态。如果允许控件维护自己的视图状态,则应设置为true(默认值);否则,应设置为false。 仅当EnableViewState属性设置为true时,页面或控件的ViewStateMode属性才起作用。如果EnableViewState属性设置为false,则即使ViewStateMode属性设置为Enabled,视图状态也将关闭。

7 3. 使用ViewState对象 ViewState对象以“键/值对”的方式保存控件的名称和对应的值,以便在回发时还原控件的原始状态。对于控件的值保存和回发恢复,可由系统自动完成,一般不必为此编写专门的代码。若用户希望将一些特殊的数据保存到ViewState对象中,则可以使用ViewState对象的Add()方法。其语法格式为: ViewState.Add(键名称, 值) 从ViewState中读取值的语法格式为: ViewState[键名称]

8 【演练5-1】 本例将示范如何将一个字符串保存到ViewState中以及从ViewState中提取出来的编程方法。如图5-2所示,程序启动后,用户可在文本框中随意输入一些字符后单击“保存到ViewState”按钮,将其保存起来。需要读取时,可单击“从ViewState中读取”按钮,将ViewState中保存的指定数据显示到标签控件中,如图5-3所示。

9 新建一个ASP.NET空网站,向其中添加一个Web窗体Default.aspx。向页面中添加一个文本框、一个标签和两个按钮控件。
设置文本框的ID属性为txtString,设置标签控件的ID属性为lblShow,设置两个按钮的ID属性分别为btnSave和btnRead,设置两个按钮控件的Text属性分别为“保存到ViewState”和“从ViewState中读取”。 【演练5-1】代码

10 5.3 创建和使用Cookie对象 Cookie是由服务器发送给客户机,并保存在客户机中的一些记录用户数据的文本文件。当用户访问网站时,Web服务器会发送一小段资料存放在客户机中,它会把用户在网站上所打开的网页内容、在页面中进行的选择或者操作步骤逐一记录下来。当用户再次访问同一网站时(可能并不是相同的网页),Web服务器会首先查找客户机中是否存在有上次访问网站时留下的Cookie信息。若有,则会根据具体Cookie信息发送特定的网页给用户。 在保存用户信息和维护浏览器状态方面,使用Cookie无疑是一种很好的方法。例如,可以将用户的登录信息(用户名、密码、是否登录成功的状态等)存放在Cookie中,方便应用程序对用户的合法性进行快速检查。

11 创建Cookie 浏览器负责管理客户机中的Cookie,Cookie需要通过Response对象发送到浏览器中,发送前需要将其添加到Cookie集合中。 Cookie有3个重要的参数:名称、值和有效期。如果没有设置Cookie的有效期,它仍可被创建,但不会被Response对象发送到客户端,而是将其作为用户会话的一部分进行维护,当用户关闭浏览器(会话结束)时该Cookie将被释放。这种非永久性Cookie十分适合用来保存只需要短暂保存或由于安全原因不能保存在客户机中的信息。 创建Cookie的语法格式如下: Response.Cookies["名称"].Value = 值;

12 例如,创建一个名为“MyCookie”的Cookie并为其赋值“OK”,语句如下:
Response.Cookies["MyCookie"].Value = "OK"; 设置Cookie有效期的语法格式如下: Response.Cookies["名称"].Expires = 到期时间; 例如,设置名为“MyCookie”的Cookie有效期为1天,语句如下: Response.Cookies["MyCookie"].Expires = DateTime.Now.AddDays(1);

13 读取Cookie 使用Request对象的Cookies属性可以读取保存在客户机中指定Cookie的值,其语法格式如下: 变量 = Request.Cookies["名称"].Value; 例如,将名为“MyCookie”的Cookie值读出,并赋给变量GetCookie,语句如下: string GetCookie = "" //声明一个字符串变量 if (Request.Cookies["MyCookie"] != null) //判断目标Cookie是否存在 { GetCookie = Request.Cookies["MyCookie"].Value; //读取指定Cookie的值,赋给变量 }

14 使用多值Cookie 前面介绍过对同一网站,客户端存储的Cookie数量不能超过20个。若需要存储较多的数据,可考虑使用多值Cookie。 例如,创建一个名为“Person”的Cookie集合,其中包含有3个子属性(对于浏览器来说,只相当于一条Cookie),语句如下: Response.Cookies["Person"]["P_Name"].Value = "zhangsan"; Response.Cookies["Person"]["P_ "].Value = Response.Cookies["Person"]["P_Home"].Value = "北京";

15 使用下列语句可从上述多值Cookie中读取数据:
yr_name = Request.Cookies["Person"]["P_Name"].Value; yr_ = Request.Cookies["Person"]["P_ "].Value; yr_home = Request.Cookies["Person"]["P_Home"].Value; string yr_name = Request.Cookies["Person"].Values[0]; string yr_name = Request.Cookies["Person"].Values[1]; string yr_name = Request.Cookies["Person"].Values[2];

16 【演练5-2】 使用Cookie设计一个简单的网上投票管理程序,要求客户机在10分钟内不能再次投票。访问网站时首先显示如图5-4所示的页面,用户在选择了“最喜欢的书”后单击“提交”按钮,弹出如图5-5所示的信息框。如果用户在10分钟内再次执行投票操作,将弹出如图5-6所示的信息框,提醒用户在10分钟之内不允许再次投票。单击“查看结果”按钮,弹出如图5-7所示的信息框,显示各书的得票百分比。

17 如果用户在无任何人投票前单击了“查看结果”按钮,将弹出如图5-8所示的出错提示信息框。注意,若没有进行这种情况的判断,单击按钮时可能会因分母为零而导致整个程序运行出错。
① 设计指导思想。用户首次访问网站并投票成功后,系统创建一个有效期为10分钟的Cookie保存在用户计算机中。如果用户再次执行投票操作,系统会判断是否存在前面创建的有效Cookie。若有,则表明距上次投票操作没有超过10分钟,用户的投票操作无效,并给出提示信息;否则投票有效,进行票数累加。

18 ② 设计Web页面。新建一个ASP.NET网站,向页面中添加一个单选按钮组控件RadioButtonList1和两个按钮控件Button1、Button2,并向页面中添加必要的文字信息。
③ 设置对象属性。设置RadioButtonList1的ID属性为SelectBook,并通过其Items属性添加3本书的名称;设置Button1的ID属性为ButtonOK,Text属性为“提 交”;设置Button2的ID属性为btnResult,Text属性为“查看结果”。各控件的其他初始属性,在页面装入事件中通过代码进行设置。 ④ 编写事件代码。 【演练5-2】代码

19 5.4 创建和使用Session对象 与Cookie和ViewState不同,Session对象没有对存储数据量的限制,其中可以保存更复杂的数据类型,甚至可以在Session中保存一个DataSet(离线数据集)等。与Cookie对象一样,保存在Session中的数据可以跨网页使用,因此它常用来在不同网页中传递数据。此外,Session是一个存储在服务器端的对象集合,避免了Cookie信息保存在客户端的不安全因素,非常适合用户保存用户名、密码等敏感信息。

20 Session的工作原理 当用户请求一个ASP.NET页面时,系统将自动创建一个Session(会话);当退出应用程序或关闭服务器时,该会话撤销。系统在创建会话时将为其分配一个长长的字符串(SessionID)标识,以实现对会话进行管理和跟踪。该字符串中只包含URL中所允许的ASCII字符。SessionID具有的随机性和唯一性保证了会话不会冲突,也不会被怀有恶意的人利用新SessionID推算出现有会话的SessionID。 通常,SessionID会存放在客户端的Cookie内,当用户访问ASP.NET网站中任何一个页面时,SessionID将通过Cookie传递到服务器端,服务器根据SessionID的值对用户进行识别,以返回对应于该用户的Session信息。通过配置应用程序,可以在客户端不支持Cookie时将SessionID嵌套在URL中,服务器可以通过请求的URL获得SessionID值。

21 Session信息可以存放在ASP.NET进程、状态服务器或SQL Server数据库中。在默认情况下,Session的生存周期为20分钟,可以通过Session的Timeout属性更改这一设置。在Session的生存周期内,Session是有效的,超过了这个时间Session就会过期,Session对象将被释放,其中存储的信息也将丢失。

22 Session对象的常用属性及方法 Session对象的常用属性见表5-1。

23 Session对象有以下两个事件。 ① Start事件:在创建会话时发生。 ② End事件:在会话结束时发生。需要说明的是,当用户在客户端直接关闭浏览器退出Web应用程序时,并不会触发Session_End事件,因为关闭浏览器的行为是一种典型的客户端行为,是不会被通知到服务器端的。Session_End事件只有在服务器重新启动、用户调用了Session_Abandon()方法或未执行任何操作达到了Session.Timeout设置的值(超时)时才会被触发。

24 使用Session对象 在ASP.NET中使用Session对象的核心技术就是如何将数据存入Session及如何从Session中读取数据。 1. 将数据保存到Session对象中 向Session对象中存入数据的方法十分简单,下面的语句使用户单击按钮时将两个字符串分别存入两个Session对象中: protected void Button1_Click(object sender, EventArgs e) { Session["MyVal1"] = "这是Session中保存的数据1"; string Val2 = "这是Session中保存的数据2"; Session["MyVal2"] = Val2; }

25 2. 从Session对象中取出数据 当目标页面装入时,从Session对象中取出数据的语句如下: protected void Page_Load(object sender, EventArgs e) { Label1.Text = (string)(Session["MyVal1"]); Label2.Text = (string)(Session["MyVal2"]); }

26 【演练5-3】 设计一个包含Default. aspx和Welcome
【演练5-3】 设计一个包含Default.aspx和Welcome.aspx两个页面的网站。要求用户只能进入如图5-9所示的Default.aspx页面,输入合法的用户名和密码后,才能打开Welcome.aspx页面,此时页面中将显示用户名及欢迎信息。如果用户级别为admin(管理员),则该页面中显示“管理所有用户”和“修改个人信息”两个链接按钮;如果用户级别为normal(普通用户),则该页面中只显示“修改个人信息”链接按钮,如图5-10所示。

27 设网站中有3个合法用户:zhangsan、lisi和wangwu,其中:zhangsan的级别为admin,其他为normal。
如果登录时用户输入了错误的用户名或密码,屏幕上将弹出如图5-11所示的提示框。如果用户试图绕过登录页面,在浏览器地址栏中输入Welcome.aspx的URL想要直接调用第2个页面,屏幕上将弹出如图5-12所示的提示框,单击“确定”按钮后自动返回Default.aspx登录页面。

28 ① 设计指导思想。创建一个结构数组,用于保存用户名、密码和用户级别数据(在实际应用中这些数据是保存在数据库中的)。
② 创建一个ASP.NET网站,并向其中添加一个空白Web窗体Default.aspx。向Default.aspx中添加一个用于布局的HTML表格,适当调整表格的行列数。向表格中添加需要的说明文字,添加两个文本框控件TextBox1与TextBox2和一个按钮控件Button1。 ③ 设置TextBox1的ID属性为txtName;设置TextBox2的ID属性为txtPwd,TextMode属性为Password,表现为密码框;设置Button1的ID属性为btnLogin,Text属性为“登录”。 ④ 向网站中添加新网页。在“解决方案资源管理器”中右击项目文件夹,在快捷菜单中执行“添加新项”命令,打开“添加新项”对话框。选择模板为“Web窗体”并指定其名称为“Welcome.aspx”后单击“添加”按钮。从工具箱中添加两个链接按钮LinkButton1和LinkButton2,分别设置其Text属性为“管理所有用户”和“修改个人信息”。 ⑤ 编写程序代码。 【演练5-3】代码

29 5.5 创建和使用Application对象 5.5.1 Application对象与Session对象的区别
Application对象和Session对象都可在服务器端保存数据或对象,它们的使用方法和常用属性、事件、方法也基本相同。但Application对象中保存的信息是为所有来访的客户端浏览器共享的,而Session对象保存的数据则是仅为特定的来访者使用的。 例如,在河南的A用户和在河北的B用户同时访问某一服务器,若A用户修改了Application对象中存放的信息,B用户在刷新页面后就会看到修改后的内容;但若A用户修改了Session对象中存放的数据,则B用户是感觉不到的。此时只有A用户可以看到和使用这些数据。也就是说,Session对象中存放的是专用信息。

30 5.5.2 Application对象的属性、方法和事件
Application对象的常用属性、方法和事件与前面介绍过的Session对象的属性、方法和事件基本相同。 1. Application对象的常用属性和方法 由于Application对象中存放的信息是共有的,有可能发生在同一时间内多个用户同时操作同一个Application对象的情况。为了避免此类问题导致的出错,Application对象增加了Lock()方法和UnLock()两个方法,用于在使用set方法更改Application对象值时将其锁定,在更改完毕后再解除锁定。

31 2. Application事件的常用事件 Application对象的常用事件有如下两个。 Start事件:该事件在应用程序启动时被触发。当第一次启动应用程序时会触发Session_Start事件,不过Application_Start事件在Session_Start事件之前发生。它在应用程序的整个生命周期中仅发生一次,此后除非Web服务器重新启动才会再次触发该事件。 End事件:Application_End事件在应用程序结束时被触发,即Web服务器关闭或重新启动时被触发。同样,在应用程序结束时也会触发Session_End事件,但Application_End事件发生在Session_End事件之后。在Application_End事件中,常放置用于释放应用程序所占资源的代码段。

32 使用Application对象 使用Application对象的属性和方法可方便地读取、写入或修改对象中保存的共享数据。 1. 向Application对象写入数据 在向Application对象中保存数据时可使用如下语法格式: Application["对象名"] = 对象值; Application.Add("对象名", 值);

33 2. 修改Application对象中的数据 修改已存在Application对象中的数据,需要使用Set方法并配合Lock()和UnLock()方法,即修改数据前“锁定”对象,修改数据后再“解锁”对象。例如,下列语句实现了对名为“Test”的Application对象中保存数据的自身加1操作: Application.Lock(); //锁定Application对象,以防止其他用户对其进行操作 Application.Set("Test", Application("Test") + 1); //修改已存在Application对象Test的值为自身+1 Application.UnLock(); //解锁Application对象

34 3. 读取Application对象中的数据 读取Application对象中数据的方法如下: string User; User = Application("UserName").ToString(); 注意:Application("对象名")的返回值是一个Object类型的数据,操作时应注意数据类型的转换。

35 【演练5-4】 使用Application对象和Session对象,结合全局配置文件Global. asax和站点配置文件Web
【演练5-4】 使用Application对象和Session对象,结合全局配置文件Global.asax和站点配置文件Web.config,设计一个能统计当前在线人数的Web应用程序。程序运行时显示如图5-13所示的页面,当有新用户打开网页,或有用户退出时,页面中在线人数能自动更新。 ① 编写全局配置文件。网站的全局配置文件Global.asax是一个可选文件,创建站点时系统并未自动生成该文件。在站点创建后,用户可在解决方案资源管理器中右击项目名称,在弹出的快捷菜单中执行“添加新项”命令,弹出如图5-14所示的“添加新项”对话框,选择“全局应用程序类”模板后,单击“添加”按钮。

36 Global.asax文件一旦被添加到站点中,系统自动将其在代码窗口中打开,可以看到系统已在该文件中创建了关于Application、Session对象的Start和End的空事件过程,在各事件过程中添加相应的代码即可。

37 Application对象的Start事件被触发时执行的事件过程代码如下:
void Application_Start(object sender, EventArgs e) { //在应用程序启动时运行的代码 Application["online"] = 0; //初始化在线人数变量值 }

38 Session对象的Start事件被触发时执行的事件过程代码如下:
void Session_Start(object sender, EventArgs e) { //在新会话启动时运行的代码,新会话开始表示有新用户加入 Application.Lock(); //锁定Application对象 int iNum = (int)Application["online"] + 1; Application.Set("online",iNum); //修改对象的值,为自身加1 Application.UnLock(); //解除对象的锁定 }

39 Session对象的End事件被触发时执行的事件过程代码如下:
void Session_End(object sender, EventArgs e) { //在会话结束时运行的代码 //注意:只有在Web.config文件中的sessionState模式设置为InProc时 //才会引发Session_End事件 //如果会话模式设置为StateServer或SQLServer,则不会引发该事件 Application.Lock(); int iNum = (int)Application["online"] - 1; Application.Set("online",iNum); Application.UnLock(); }

40 ② 修改网站配置文件。在解决方案资源管理器窗口中,双击打开Web. config文件,在<system
② 修改网站配置文件。在解决方案资源管理器窗口中,双击打开Web.config文件,在<system.web>标记和</system.web>标记之间添加下列配置语句(一般可添加在</system.web>标记的上一行): <sessionState mode ="InProc" timeout ="1" cookieless ="false"/> 该配置表示,设置session的模式为InProc(在进程中);超时时间为1分钟;SessionID值写入客户端Cookie中,而不是URL中。

41 ③ 编写Default.aspx的事件代码。Default.aspx页面装入时执行的事件过程代码如下:
protected void Page_Load(object sender, EventArgs e) { this.Title = "使用Application和Session对象统计在线人数"; //设置页面标题 Response.Write("<b>当前在线人数为:" + Application["online"]+"</b>"); //显示在线人数 Response.AddHeader("Refresh", "30"); //设置页面每30秒刷新一次 }

42 5.6 实训 【实训5-1】 设计一个模拟的电影网站,用户访问网站时需要在首页Default.aspx进行登录,登录成功后可以跳转到显示有电影链接的Films.aspx。Films.aspx页面拒绝未登录用户直接访问,并且可根据用户级别显示“普通电影”和“VIP电影”两个栏目。如图5-15所示的是网站登录页面Default.aspx,如图5-16和图5-17所示的是不同级别用户登录后看到的Film.aspx页面的不同内容。

43 ① 设计指导思想。 ② 设计程序界面。 ③ 设置对象属性。 ④ 向网站中添加新网页。 ⑤ 编写程序代码。 【实训5-1】代码

44 【实训5-2】 设计一个ASP.NET网站,向页面中添加一个按钮控件和一个标签控件。页面首次加载时创建一个名为“MyCookie”且有效期为1分钟的Cookie,并为其赋值“OK”,在标签中显示Cookie到期时间和值,如图5-18所示。若在Cookie有效期内单击按钮,则标签中显示“Cookie有效”和Cookie值,如图5-19所示。若在Cookie过期后单击按钮,则标签中显示“Cookie已过期!”,如图5-20所示。 【实训5-2】代码

45 【实训5-3】 如图5-21所示,使用Session对象设计一个站点计数器。要求将来访人数存放在站点内的Counter
【实训5-3】 如图5-21所示,使用Session对象设计一个站点计数器。要求将来访人数存放在站点内的Counter.txt文件内,该数字不会因服务器或网站重新启动而丢失,刷新页面也不会引起数字变化。程序运行时,要求将当前会话的ID值显示在页面中,并注意比较SessionID值的变化情况。 【实训5-3】代码

46 再见


Download ppt "《ASP.NET数据库网站设计教程(C#版)》"

Similar presentations


Ads by Google