Application 对象用于存储和访问来自任何页面的变量,类似于 session 对象。不同之处在于,所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对应的。Application 对象握有会被应用程序中的许多页面使用的信息(比如数据库连接信息)。这意味着可以从任何的页面访问这些信息。同时也意味着你可在一个地点改变这些信息,然后这些改变会自动反映在所有的页面上。
application的创建和获取和session一样:
application["keyName"]=...;或application.add("keyName",value)。赋值内容可以是任意类型的数据。通过application["keyName"]获取的值是一个object对象,需要显示转换类型。
由于application是在整个程序中的,是所有用户共用的,因此在进行修改的时候,为了避免另一个用户也在修改,需要对其加锁和解锁。
application.lock();
application["keyName"]=....
application.unlock();
同样的,清除application也需要加锁和解锁。application.remove("keyName")清除某一项,application.clear()清除所有。
application的这种特性可以用来记录网站的访问量。
protected void Button5_Click(object sender, EventArgs e) { if (Application["app_count"] != null) { Application.Lock(); Application["app_count"] = (int)Application["app_count"] + 1; Application.UnLock(); } else { Application.Lock(); Application["app_count"] = 1; Application.UnLock(); } } protected void Button7_Click(object sender, EventArgs e) { if (Application["app_count"] != null) Button7.Text = "点击查看当前计数:" + Application["app_count"].ToString(); else Button7.Text = "没有计数的application"; } protected void Button6_Click(object sender, EventArgs e) { Application.Lock(); Application.Remove("app_count"); Application.UnLock(); }
运行后,在浏览器中用两个网页来打开这个页面,分别查看点击按钮之后,在另一个页面查看当前计数的变化。
一个简单的聊天室
首先是设计登陆页面:
登录按钮:
protected void Button1_Click(object sender, EventArgs e)
{
Session["uid"] = TextBox1.Text;
Server.Transfer("Default2.aspx");
}
然后设计聊天页面:
<meta http-equiv="refresh" content="5"/><!--这个用于页面自动刷新,每隔5秒刷新一次,添加到head标签中-->
<form id="form1" runat="server"> <div> <asp:Panel ID="Panel1" runat="server" BorderColor="#FF9933" BorderStyle="Double" Height="369px" ScrollBars="Vertical" Width="536px"></asp:Panel> <asp:Panel ID="Panel2" runat="server"> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:Button ID="Button1" runat="server" Text="发送" OnClick="Button1_Click" /> <asp:Button ID="Button2" runat="server" Text="退出聊天" OnClick="Button2_Click" /> </asp:Panel> </div> </form>
public partial class Default2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (Session["uid"] == null)//这个session是每个用户独自有一个 Response.Redirect("Default.aspx"); if (Application["chat"] == null)//application是所有用户共用一个 Application["chat"] = new Panel(); Panel1.Controls.Add((Panel)Application["chat"]); } protected void Button2_Click(object sender, EventArgs e) {//退出聊天 Session.Remove("uid"); Response.Redirect("Default.aspx"); } protected void Button1_Click(object sender, EventArgs e) {//发送 Label uid = new Label(); uid.Text = Session["uid"].ToString(); Label dt = new Label(); dt.Text = DateTime.Now.ToLongTimeString()+":"; Label word = new Label(); word.Text = TextBox1.Text; Literal lbr = new Literal(); lbr.Text = "<br/>"; Application.Lock(); ((Panel)Application["chat"]).Controls.AddAt(0, lbr); ((Panel)Application["chat"]).Controls.AddAt(0, word); ((Panel)Application["chat"]).Controls.AddAt(0, dt); ((Panel)Application["chat"]).Controls.AddAt(0, uid); Application.UnLock(); } }
运行:在登录界面登录张三和李四,
然后分别进入各自的聊天界面
这是李四的
这是张三的
每次在刷新的时候,发送按钮前面的文本框里的内容会被清除掉。这是因为这个刷新是整个页面的刷新,并不是局部刷新。这个刷新还有一个地方需要注意,那就是在第一个用户登录后,如果没有第一时间发送信息,那么在5秒后会自动跳回登录页面,似乎if (Session["uid"] == null)这个判断的结果是true,这点一直没弄明白。
要想实现局部刷新,可用AJAX,Jquery和iFrame。
利用iframe:
首先是新建一个页面default3
<head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <meta http-equiv="refresh" content="5"/> </head> <body> <form id="form1" runat="server"> <div runat="server" id="holder"> </div> </form> </body>
后台代码:
protected void Page_Load(object sender, EventArgs e) { if (Application["chat"] == null) Application["chat"] = new Panel(); holder.Controls.Add((Panel)Application["chat"]); }
对于之前的聊天页面default2做如下修改:
首先去掉自动刷新的标记:
然后将显示聊天记录的panel也去掉,同时添加iframe:
default2的后台代码
protected void Page_Load(object sender, EventArgs e) { if (Session["uid"] == null) Response.Redirect("Default.aspx"); //if (Application["chat"] == null) // Application["chat"] = new Panel(); //Panel1.Controls.Add((Panel)Application["chat"]); //上面注释掉的这部分被移到default3中了 }
然后运行:
登录两个用户后,可以看到,即使不发送任何信息,在5秒时间过后,自动刷新的话,也不会像之前那样跳回登录页面了,同时在发送了信息后,自动刷新也不会将文本框里面的内容给清除掉了。