页面回发机制
回发的复杂说法
像button等服务器控件,点击下去后,解析的就是submit到后台
传递到后台交给服务器处理,处理时服务器会对当前网页重新加载(重新绘制)
这就是回发
回发的简单说法
说简单点,就是服务器控件的后台事件在执行前,都会先执行Page_Load事件,执行这个事件,就是回发
protected void Page_Load(object sender, EventArgs e)
{
}
回发的测试
每一次点击登录,都会跳入Page_Load事件中,其次页面会重新加载
回发问题的处理
Page对象是一个内置对象,当创建了aspx文件后会产生
Page对象提供了IsPostBack,判断是否是首次回发
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
//这里处理首次加载需要处理的事情
}
//这里每次刷新当前页面都会处理的事情
}
当有这个对象,才完成了前后端分离的设计。在前端的顶部会有这样一行
<%@ Page
//后台语言
Language="C#"
//是否每次都要回发
AutoEventWireup="true"
//后台代码文件
CodeBehind="WebForm.aspx.cs"
//后台代码类
Inherits="WebApplication1.WebForm" %>
Request && Response
Request和Response是Page对象的成员
Request是封装了用户的请求信息,那后台如何获取信息呢
QueryString
限制:只能从Url中获取传递的参数
演示:不用页面用Url传递参数
在WebForm3中
--参数与Url用?分割,参数间用&分割,参数以key-value的方式书写
<a href="WebForm4.aspx?name=pp&age=20">跳转到WebForm4</a>
在WebForm4的后台中
protected void Page_Load(object sender, EventArgs e)
{
//通过Page对象的Request对象的QueryString方法获取,通过参数的key
var name = this.Request.QueryString["name"];
var age = this.Request.QueryString["age"];
}
Params
QueryString使用限制于Url,Params没有限制,所以使用更加广泛
var name = this.Request.Params["name"];
var age = this.Request.Params["age"];
ServerVariables
用于服务器的数据
//获取浏览器及版本
Request.ServerVariables["HTTP_USER_AGENT"]
//获取浏览器语言
Request.ServerVariables["HTTP_USER_LANGUAGE"]
Reponse
Reponse.Write
在页面顶端输出信息,一般用于测试
Reponse.Redirect
通过后端程序跳转页面
ViewState
int counter = 0;
protected void Button1_Click(object sender, EventArgs e)
{
counter++;
}
在后台,我们想做到,没点击一次button,counter就计数加1。我们点了N次,发现counter一直是0
为什么会这样呢?与PC的桌面应用程序不同
因为Http的无状态性,Web不会保留HTTP所发的信息和当时的状态
网站只有一个,如果你这里计数了,其他人通过URL访问,也会获取了这个计数
事实上,服务器也可以区别访问自己的浏览器是哪个,ViewState用来充当成员变量,每个浏览器访问时,即使名字相同,但不会冲突
protected void Page_Load(object sender, EventArgs e)
{
if (ViewState["counter"] == null)
{
ViewState["counter"] = 0;
}
}
protected void Button1_Click(object sender, EventArgs e)
{
var counter = (int)ViewState["counter"];
counter++;
this.Literal1.Text = counter.ToString();
ViewState["counter"] = counter;
}
生存周期:跳转页面后,信息丢失
使用方式:key-value方式,存储object,取数据时需要强转需要的类型
Session
Session是独立的
Session和ViewState一样,每个用户的互不影响
互不影响是因为每个Session都有自己的Id,有各自的空间
Id创建是浏览器访问服务器时候,服务器产生的一长串的字符串,并交由浏览器保存,当浏览器再一次访问时,会带着自己的SessionId
查看自己的SessionId
Session.SessionID
web服务器生成SessionId
web服务器只有认定浏览器是第一次请求,才会生成SessionId
那怎么认定浏览器是第一次请求呢
- 第一次打开这个网页
- 关闭这个浏览器的所有的网页,再一次打开
- 用不同的浏览器打开这个网页(不同浏览器是不同享Session)
有必要解释夏第二种情况
我用浏览器打开多个网页,有百度,有淘宝,有自己写的用session的网页,我关掉最后一个网页,再打开,session的值还存在,是关闭这个浏览器的所有网页
Session的属性和方法
属性 | 说明 |
---|---|
SessionID | 唯一的会话标识符 |
Timeout | 设置超时时间,单位是分钟 |
方法 | 说明 |
---|---|
Add(string name, object value) | 添加 |
Remove(string name) | 根据key删除 |
Clear() | 移除所有的会话 |
Abandon() | 结束session,取消当前会话 |
Session翻译过来叫会话
Session两种添加方式都可以
Session.Add("name", "eden");
Session["name"] = "eden";
Abandon的作用是相当于将Timeout设置到期,这样服务器会认为浏览器是一个新的请求
Clear是将值赋为null
生命周期:服务器重启,页面时效到了
Cookie
特征
有时候,当你浏览过的、登录的信息,再次打开网页,会弹出曾经浏览过的信息或者弹出……
有一种手段:Cookie
它存储在客户端中,每种浏览器存储的位置不一样,以字符串的形式存储
因为存储在客户端,所以安全性差
因为安全性差,所以存储不重要的信息
因为存储在本地,存储的是少量信息
必须设置有效期,否则不会存储,随着浏览相关的网站,会一并发送到服务器
使用
创建
//创建方法1
Response.Cookies["name"].Value = "eden";
//创建方法2
HttpCookie nameCookie = new HttpCookie("name", "eden");
Response.Cookies.Add(nameCookie);
设置有效期
Response.Cookies["name"].Expires = DateTime.Now.AddDays(1);
nameCookie.Expires = DateTime.Now.AddDays(2);
取值
if (null != Response.Cookies["name"])
{
var value = Response.Cookies["name"].Value;
}
Application
从字面看,应用程序,级别更高
最常用的功能,我们统计一个网站访问的次数,使用的是Application
特征
位置:在服务器的内存,所以速度块
范围:整个应用程序
类型:任意类型
生命周期:应用程序从开始到销毁
使用
1. 创建Global.asax
该文件必须在根目录下
2. 方法
常用事件 | 说明 |
---|---|
Application_Start | 接受第一个请求时出发 |
Application_End | 应用程序退出时 |
Session_Start | 某用户第一次访问时触发 |
Session_End | 某用户退出应用程序时触发 |
实现统计网站访问人数功能
protected void Application_Start(object sender, EventArgs e)
{
Application.Lock();
Application["UserVisit"] = 0; //网站访问人数
Application["CurrentUser"] = 0; //网站在线人数
Application.UnLock();
}
protected void Session_Start(object sender, EventArgs e)
{
Application.Lock();
Application["UserVisit"] =(int)Application["UserVisit"] + 1;
Application["CurrentUser"] =(int)Application["CurrentUser"] + 1;
Application.UnLock();
}
protected void Session_End(object sender, EventArgs e)
{
//在某个用户会话结束时,触发
//在Web.config文件中,sessionstate设置为InPro才引发事件
Application.Lock();
Application["CurrentUser"] = (int)Application["CurrentUser"] - 1;
Application.UnLock();
}
protected void Application_End(object sender, EventArgs e)
{
//Application存储在内存中
//预防服务器出现问题,丢失Application对象中的数据,需要保存在介质中
}