在学习中发现网页模板可以大大节约重复的页面代码,同时对于WebSite开发的程序在不同的页面直接调用已写好的代码既不方面,只是作为代码量不大的程序进行开发还是比较方便。
get和post的区别get是通过url传递表单值,post通过url看不到表单域的值;get传递的数据量是有限的,如果要传递大数据量不能用get,比如上传文章、传递密码或者<textarea>发表大段文章,post则没有这个限制;post会有浏览器提示重新提交表单的问题。也就是说get和post都是以不同的方式提交表单的信息,只是方式不一样,post是以头报文的形式传递,我们可以使用火狐的免费插件firebug或者免费的httpwatch(**版的当然免费),看到这些。
简单的说浏览器和服务器直接就是请求和回应,内部的具体细节可以看看博客园中的很多示例图,当然我们可以分析一下,就是浏览器通过DNS解析后向服务器发送请求,服务端侦听到客户端(浏览器)请求,开始分配相应套接字并建立连接,之后就是一方发送一方接收回应的过程,这里面存在一个长连接短连接的概念,具体还是查资料,这里就不多说了。
现在我们先来分析一下已经生成好的web程序,我们来反编译看下具体的执行过程。
我们只看其中关键的部分,也是我们一般程序中的主体部分,使用reflector
1 [CompilerGlobalScope] 2 public class default_aspx : _Default, IHttpHandler 3 { 4 // Fields 5 private static object __fileDependencies; 6 private static bool __initialized; 7 8 // Methods 9 [DebuggerNonUserCode] 10 public default_aspx(); 11 [DebuggerNonUserCode] 12 private HtmlHead __BuildControl__control2(); 13 [DebuggerNonUserCode] 14 private HtmlTitle __BuildControl__control3(); 15 [DebuggerNonUserCode] 16 private HtmlForm __BuildControlform1(); 17 [DebuggerNonUserCode] 18 private void __BuildControlTree(default_aspx __ctrl); 19 [DebuggerNonUserCode] 20 protected override void FrameworkInitialize(); 21 [DebuggerNonUserCode] 22 public override int GetTypeHashCode(); 23 [DebuggerNonUserCode] 24 public override void ProcessRequest(HttpContext context); 25 } 26 27 28 Expand Methods 29
它对应的源代码如下:
1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 2 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 4 5 <html xmlns="http://www.w3.org/1999/xhtml"> 6 <head runat="server"> 7 <title>测试</title> 8 </head> 9 <body> 10 <form id="form1" runat="server"> 11 <div> 12 13 </div> 14 </form> 15 </body> 16 </html>
现在我们再来看关键的部分:
1 [DebuggerNonUserCode] 2 private void __BuildControlTree(default_aspx __ctrl) 3 { 4 this.InitializeCulture(); 5 IParserAccessor accessor = __ctrl; 6 accessor.AddParsedSubObject(new LiteralControl("\r\n\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n")); 7 HtmlHead head = this.__BuildControl__control2(); 8 accessor.AddParsedSubObject(head); 9 accessor.AddParsedSubObject(new LiteralControl("\r\n<body>\r\n ")); 10 HtmlForm form = this.__BuildControlform1(); 11 accessor.AddParsedSubObject(form); 12 accessor.AddParsedSubObject(new LiteralControl("\r\n</body>\r\n</html>\r\n")); 13 }
从上面可以看出,.NET运行时将html创建成一个树对象,而后已以创建节点对象模型
1 [DebuggerNonUserCode] 2 private HtmlTitle __BuildControl__control3() 3 { 4 HtmlTitle title = new HtmlTitle(); 5 IParserAccessor accessor = title; 6 accessor.AddParsedSubObject(new LiteralControl("测试")); 7 return title; 8 }
这里我只是让大家能看到 <title>测试</title>的效果,具体的可以自己看看。
下面就写个小代码试下手感受下asp.net web开发,基本原理都差不多只是对于刚从Winform转过来的同学感觉上很繁琐,节约时间不多说了,直接上代码,代码简单就是为了自己熟悉测试的
1 <%@ WebHandler Language="C#" Class="List" %> 2 3 using System; 4 using System.Web; 5 using System.Data; 6 using System.Data.SqlClient; 7 8 public class List : IHttpHandler { 9 10 public void ProcessRequest (HttpContext context) { 11 context.Response.ContentType = "text/html"; 12 DataTable dt = SqlHelper.ExecuteDataTble(); 13 System.Text.StringBuilder sb = new System.Text.StringBuilder(); 14 foreach (DataRow dr in dt.Rows) 15 { 16 sb.AppendLine(" <tr>"); 17 sb.AppendLine("<td>" + dr["s_no"] + "</td>"); 18 sb.AppendLine("<td>" + dr["s_name"] + "</td>"); 19 sb.AppendLine("<td>" + dr["s_sex"] + "</td>"); 20 sb.AppendLine("<td>" + dr["s_birthday"] + "</td>"); 21 sb.AppendLine("<td>" + dr["s_avgrade"] + "</td>"); 22 sb.AppendLine("<td>" + dr["s_dept"] + "</td>"); 23 sb.AppendLine("<td><a href=del.ashx?id="+dr["s_no"]+">删除</td>"); 24 sb.AppendLine("<td><input type='checkbox' name='ckdel' value= '"+ dr["s_no"]+"'/>选择</td>"); 25 sb.AppendLine("<td><a href='UpdateRecord.ashx'>修改</td>"); 26 sb.AppendLine("<tr>"); 27 } 28 string content = System.IO.File.ReadAllText(context.Server.MapPath("model.htm")); 29 content = content.Replace("@replace", sb.ToString()).Replace("@title", "学生信息表"); 30 context.Response.Write(content); 31 } 32 33 public bool IsReusable { 34 get { 35 return false; 36 } 37 } 38 39 } 40 public class SqlHelper 41 { 42 public static System.Data.DataTable ExecuteDataTble() 43 { 44 using (SqlConnection con = new SqlConnection("Data Source=ROHELM-PC;Initial Catalog=T-SQL练手;Integrated Security=True")) 45 { 46 using (SqlCommand cmd = con.CreateCommand()) 47 { 48 cmd.CommandText = "select * from student"; 49 DataTable dt = new DataTable(); 50 SqlDataAdapter da = new SqlDataAdapter(cmd); 51 da.Fill(dt); 52 return dt; 53 } 54 } 55 } 56 }
下面这个其实保存的形式是什么无关紧要的,只要是文本形式就行。
删除部分
添加部分
使用数据库脚本:
运行效果:
其他操作显示区域没有调整好,且受到上传图片的限制未演示。