ASP.NET之WebForm知识点
WebForm分为两个文件:aspx:是页面模板,页面描述文件,就是html+js+css的内容 aspx.cs
1. aspx页面开始的<%@Page %> 称为指令集, 在编译的时候使用.
2. 前台页面与后台页面的继承关系 前台页面aspx --- 后台类aspx.cs ---Page类 -----实现了IHttpHandler接口, IHttpHandler包含ProcessRequest()方法. Control属性:控件的集合,页面上所有的代码(包括html)都以控件对象的方式存放在此集合中
2.<<<aspx页面执行过程:>>>---------------------------------------------------------------------------------- 1.--首先通过反射创建aspx前台页面(第八个事件), 第九个事件尝试将页面类对象转换成IRequeiresSessionState接口对象, 如果转换不成功,则不加载Session对象, 转换成功则从请求报文头中获得 cookie里的SessionId,然后到服务器的Session池中根据Session找到Session对象 并将其引用赋值给页面对象的Session属性 2.--然后调用反射创建的请求页面的ProcessRequest()方法(第十一与第十二个事件之间)
3.--调用父类的ProcessRequest方法,在此方法中父类调用了父类的FrameworkInitialize() 但因为被页面类重写了,所以执行的是当前页面类的FrameworkInitialize(),在中间就调用了 buildControlTree()方法,然后调用ProcessRequestMain()方法,在此方法中,执行了整个页面的生命周期 (页面生命周期,其实就是调用一系列事件的方法)
在PR方法中 执行页面类的buildControlTree()方法来构造控件树 buildControlTree()方法中传入当前前台页面类对象,作为根节点, 生成页面控件树,将页面的每个HTML代码及相应的服务端运行的控件标签(runat=server) 都以服务器端控件类对象方式封装起来. 最后当页面执行完毕,生成整个页面对象所对应的HTML页面代码时,只需要循环遍历整个控件树的每个节点 并调用每个节点的Render方法,就可以生成每个控件里所封装的Html代码了,最后组成整个页面的html 返回浏览器. 4.--执行页面生命周期的一系列方法(PageLoad(),SaveState(),LoadState()) 生命周期中有许多事件,程序员可以注册方法,并在方法中修改控件树里某个控件对象的属性 5.--通过生命周期中的方法来改变控件树中对应控件的属性,然后在调用页面的renderControl()方法生成Html代码 遍历整个控件树,调用每个控件的render方法,根据控件属性生成 并 拼成整个页面的html代码, renderControl方法()需要传入Response对象参数,实际上是一个写出器HtmlTextWriter对象. 遍历控件树时,调用每个控件的renderControl()方法,都会传入同一个HtmlTextWriter对象, 所以每个控件生成的html代码,都按照次序存在同一个HtmlTextWriter对象中, 最后只要将这个HtmlTextWriter对象中的字符串输出 就可以形成整个页面 3.为什么在Page_Load()中Response.Write()的内容 显示在HTML代码之前,打乱页面布局??? 因为页面请求时先执行Page_Load()事件,然后执行Rander()方法生成html页面
--------------------------------------------------------------------------------------------------------------- 3.WebForm 前/后台页面(aspx/aspx.cs),文件在被访问时会编译成前台类和后台类 请求管道的第八个事件触发会通过反射创建的是前台类aspx,然后强转为IHttpHandler接口对象
4. 创建前台页面的后,在前台页面里可以访问其父类(后台类,Page类..)中所有的非私有成员
5.生成页面控件树的目的: 为了在服务端运行页面类对象时,可以根据用户的某些操作及环境的某些变化来修改要生成的html代码 正因为最终页面对象是要生成html代码,所以在创建封装了html代码的控件树时,就要依次添加控件.
6.在前台类中可以在<%%>里写服务器C#代码,此时可访问到后台类(父类)的非私有成员. 在前台输出 还可以使用 <%= %>
7. Request.UrlReferrer : 记录跳转页面的域名地址 Request.UserHostAddress : 服务器端是通过与客服端浏览器的套接字获取彼此的IP及端口号
8.CLR编译器会在 第一次访问aspx页面 或者 修改aspx 页面后,会重新编译生成程序集, 并将之前的的程序集标识为不可用状态,CLR内部会自己对不可用的程序集进行清理
1. runat="server" 标记该控件在服务端运行 <input type="text" id="txtName" runat="server"/> 此控件在服务器端会被运行,会变成一个对象,在服务器端可以访问到, 通过 . 可以设置一系列属性
2. Response的其他成员: 2.1 Response.Buffer=false; //关闭输出对象的内容缓存(只要调用Write就立即输出到浏览器) 2.2 Response.BufferOutput 2.3 Response.Flush() 立即一次性输出Response对象中的内容缓存(就是之前Write的内容) 2.4 Response.Clear() 清空Response对象中的内容缓存.(就是之前Write的内容) 2.5 Response.ContentEncoding 输出流的编码,指定报文体的编码方式 Response.Charset 告诉浏览器 用什么字符集解码 2.6 Response.ContentType:报文体的格式 2.7Response.End() 终止响应
3.Server 对象: Mappath();
4无状态 HTTP: ASP.NET状态保持方案: 5.Session:一种吧信息保存在服务器内存中的方式 Session存在于上下文对象Context中 在服务端存一个Session键值对 Session原理: 5.1 Session["id"]=strName; 向服务器Session池添加Session对象,将键值对存入Session对象中 同时以cookie方式向浏览器发送SessionId. 5.2在浏览器未关闭的前提下,当再次访问该网站页面时, 浏览器会自动将保存了SessionId的cookie发送到服务器来 5.3在调用页面对象的ProcessRequest方法之前, 服务器端会根据Cookie里的SessionId到Session池中去找 看是否有对应的Session对象,并且将该对象的引用设置给 HttpContext里的Session属性 5.4页面对象执行PR方法时,就直接通过Page类的Session属性 可以访问到HttpContext里的Session引用. Session操作: 销毁(取消/退出) : Session.Abandon();销毁服务端的Session 一般处理程序中访问Session对象时,必须实现IRequiresSessionState接口 标志要求使用Session状态
Session常用属性: SessionID:唯一用户会话标识符 TimeOut:用户超时,默认为20分钟 Count: Session池中 Session对象中 键值对的对数.
6.Cookie(小甜饼): Cookie是一种能够让网站服务器把少量数据(4kb左右)储存到客户端的硬盘或内存,并且读取出来的一种技术。 保存位置:未设置失效时间的时候保存在内存中,设置了之后保存在硬盘中 创建Cookie对象(保存键值) cookie注意: 与域名相关 与浏览器相关 4kb左右存储 1.HttpCookie cookie=new HttpCookie("id","110"); cookie.Expires=DateTime.Now.AddDay(2);//设置失效时间 当前时间+2天 Response.Cookies.Add(cookie); 服务器获取Cookie Request,Cookies["id"].Value 删除浏览器Cookie 创建一个cookie 与登录时的cookie名相同 HttpCookie cookie=new HttpCookie("id"," "); cookie.Expires=DateTime.Now.AddDay(-2);//设置失效时间 当前时间-2天 Context.Response.Cookies.Add(cookie); Cookie的实现原理, 就是通过请求报文头和响应报文头实现的
Request.Cookies 服务器端获取Cookie Response.Cookies 向浏览器输出cookie
7 viewstate:在客户端保存用户数据 只帮助服务器控件保存状态,不支持html控件 其使用页面上必须包含一个服务器form标签 用法:1 非单值服务器控件的状态自动保存在viewstate中 2 保存用户自定义的数据