ASP.Net中
1 aspx需要的原因
- 如果每次输出页面都是一般处理程序的话太痛苦了,每次都要写大量的html代码,所以一般生成html的时候都直接创建aspx(Web窗体,WebForm)
- WebForm分为两个文件aspx和aspx.cs,aspx是页面模版,是页面描述文件,就是html+js+css的内容,和aspx.cs结合地更好,空间在aspx中,js,css都写在aspx中,C#写在cs文件中,实现代码后置(CodeBehind)
- 浏览器如果报错"***行错误"(js脚本错误), 不要看aspx,要看生成的源代码
2 WebForm
- cs可以直接使用前台 runat="server" 的控件 注意: 必须有id
- aspx也可以访问cs中定义的字段,函数,还可以编写C#代码,for等所有C#代码都可以写在aspx(不推荐)
- 前面<% {C#代码} %> <%=strHello%>相当于<%Response.Write(strHello)%>
- 前台文件和后台文件在运行的时候是两个分开的类,前台文件类 -- 继承 -- 后台文件类
- aspx使用cs文件红的行数,执行代码,必须是(非private修饰的,因为继承的关系)
- <%%>是运行在服务器端的代码, 运行完传给浏览器, 不像js,html是浏览器运行
-
•< div> <% //在html中可以编写C#代码 for (int i = 0; i < 3; i++) { Response.Write(i + Hello() + strHello + "<br />" ); } //前台页面是后台文件的继承,protected可以使用,或public %> < input type ="text" id ="txtName" runat ="server" value ="" /> </ div>
3 aspx, cs, dll之间的关系(*) 重要
- this.GetType().Assenbly.Location 程序集的地址
- 通过反编译代码,可以知道 服务器发送请求过来 反射指向的是 前台文件类 因为前台文件类继承与后台文件类, 创建前台文件类时自动创建了后台文件类
- LiteralControl文字控件 呈现(Render) -- 将服务器端控件类对象转成对应的html代码
- 如果在前台类文件中出现<%=, 或者Response.Write 就可能使用呈现的方法, 使用委托方法追加一个呈现的方法
- 页面类对象,通过控件树的方式,帮我们封装了整个页面的HTML代码和C#代码, (封装到页面类对象的 控件集合中, 那么要生成页面的HTML代码只需要循环遍历整个控件树,并调用美国控件的_Rander_方法获得每个控件的html代码,就可以拼成一个完整的页面HTML代码了
4 页面生命周期 -- 大的流程,大体的概念的理解
阐述下上图: 浏览器请求发送到浏览器, 扩展程序(这里针对动态网页代码), Framework,HttpRuntime 1.创建PR对象 2.创建上下文对象(Context)使用HttpWorkerRequest 3.创建Application对象,负责整个请求, 中间19个事件 执行页面类的PR方法, 构建ControlTree, 执行生命周期前几百代码(处理完后台代码), 调用页面Render方法, 写出html代码
页面核心方法
ProcessRequestMain() |
Trace="True" 可以跟踪信息
页面生命周期: 页面生成的方法过程
*前台页面类的ProcessRequest方法实际是,调用了父类的ProcessRequest方法,在此方法中,父类调用了父类的FrameworkInitialize方法,但因为这个在前台页面类被重写了,调用了_buildControlTree()方法. --- 这个调用过程,具体可以看反编译工具
5 登陆
后台:
//对于程序员来说, Page_Load方法是我们第一个进行编辑的方法 //页面对象从它"开始"执行. protected void Page_Load(object sender, EventArgs e) { if (!string .IsNullOrEmpty(Request.Form["IsPostBack"])) { //Response.Write("123123"); string strName = Request.Form["txtName" ]; string strPassword = Request.Form["txtPassword" ]; if (strName == "admin" && strPassword == "123") { Response.Write( "登陆成功!" ); } } else //否则,是通过get方式过来的,(地址直接输入,超链接过来,表单get过来) { Response.Write( "Get过来的" ); } }
前台:
<head runat="server"> <title> 登陆代码</title > <script type="text/javascript"> function get(id) { return document.getElementById(id); } function doLogin() { var domName = get("txtName" ); var strName = domName.value; var strPwd = get("txtPwd" ).value; if (strName == "" || strPwd == "") { alert( "请输入用户名和密码" ); domName.focus(); } else { get( "form1").submit(); } } </script> </head> <body> <form id="form1" action="Login.aspx" method="post"> <div> <input id="txtName" type="text" name="txtName"/><br /> <input id="txtPwd" type="password" name="txtPassword"/><br /> <input type="button" onclick="doLogin()" value="登陆" /> <input type="hidden" name="IsPostBack" value="1" /> </div> </form> </body>
5 Request其他成员
- Request.UrlReferrer 请求的来源, (在请求报文里的referrer),可以根据这个判断从百度搜的哪个关键词,防盗链下载,防图片下载,可以伪造(比如迅雷)."本图片仅供汝鹏网内部交流使用",在DZ中测试.全局防盗链用Global.asax
- Request.UserHostAddress 访问服务器的客户端ip 是通过浏览器通信套接字的RemoteEndPoint(远程网络节点)拿到的
- Request.Cookies 直接使用Request.Cookies["Name"]
- Request.MapPath(virtulPath) 将虚拟路径转换为磁盘上的物理路径 Response.Write(Request.MapPath("~/Login.aspx")); 得到 "... \ASP学习\Class01WebForm\Web\Login.aspx"
6 Response其他成员
- 响应的缓存输出: 为了提高服务器性能,asp.net想浏览器Write的时候默认不会每Write一次都会立即输出浏览器,而是会缓存数据,到合适的时机或者响应结束才会将缓冲区中的数据一起发送到浏览器 发送bite arr[]
- Response对象的主要成员:
- 1 - Response.Buffer, Response.BufferOutput: 经过Reflector反编译, 发现两个属性是一样的,Buffer内部就是调用BufferOutput. 这个属性是用用来控制是否响应缓存,默认是True, false就是不缓存, Write一下就输出一下
- 2 - Response.Flush()将缓冲区的数据发送给浏览器. 这在需要将Write出来的内容立即输出到浏览器的场合非常合适. 案例: 大批量的数据的导入, 显示正在导入第*条数据, 用Thread.Sleep模拟耗时
- 3 - Response.Clear() 清空缓存区的数据, 这样缓存区就还没有发送到浏览器端的数据清空, 不会被发送到浏览器
- 4 - Response.ContentEncoding 输出流的编码 默认是charset=utf-8
- 5 - Response.ContentType 输出流的内容类型 比如html(text/html) 还是普通文本(text\plain) 还是JPEG图片(image/JPEG)
- 6 - Response.Cookies 返回浏览器的Cookie的集合, 可以通过它来设置Cookie
- 7 - Response.OutputStream 输出流, 在输出图片, Excel等非文本内容是用到
- 8 - Response.End() 终止响应, 将之前缓存的数据发给浏览器, End()之后的代码就不会继续执行,End方法里调用了Flush()方法. 在终止一些非法请求的时候, 比如盗链等可以用End()立即终止请求
- 9 - Response.Redirect(url) 重定向浏览器到新的网址. 即可以重定向到站外网址也可以重定向到站内地址. Redirect是向浏览器发回302重定向(还有一个Location告诉浏览器要重定向到哪个页面), 是通知浏览器"请重新访问url这个网址", 这个过程经历了服务器通知浏览器,浏览器街道名冷访问新网址的过程.使用HttpWatch可以看到整个Http报文. 用Redirect因为是浏览器自己去重新访问新网址的,所以在地址栏中可以看到网址的变化的, 后面会用来防止刷新浏览器是提示重试.
- 10 - Response.SetCookie(HttpCookie cookie), 向叶面输出流更新写到浏览器中的Cookie,如果Cookie存在就更新不存在就增加,是对Response.Cookies的简化
- 11 - Response.Write()想浏览器输出内容
6 Server属性
*WebForm前台页面文件在被访问时,会被编译成类,前台类继承于后台类.
*被访问时,服务器会创建前台类对象来作为处理浏览器请求的对象.
*前台类对象是如何结合后台类的方法,生成整个页面的HTML代码的呢? -- 被请求是,页面控件(控件其实就是一个类)对象树的生成
控件树负责整个页面的内容(__BuildControlTree()生成控件树方法)
前台页面类->后台页面类->Page->TemplateControl->Control(半酣ControlCollection对象)
*WebForm结构分析,如何在aspx指定位置输出后台变量,前后台文件编译后的结构(页面原理),前台%=的作用,服务器控件登录, 图片防盗, 服务器的输出缓存机制, Sever.Execute, Server.Transfer, Sever.Html加解码
1.浏览器和服务器的交互 是通过Socket
2.浏览器和服务器交互的语法: Http协议
3.浏览器要和服务器交互的目的: 获取服务器资源(html,图片,js,css)
4.服务器要做的事情就是想尽办法,满足浏览器的需求. 所以一旦浏览器请求的是动态页面的时候,服务器就要创建页面对象,并执行里面的方法, 最后将生成的html代码返回浏览器