在学习中发现网页模板可以大大节约重复的页面代码,同时对于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 Methods29
它对应的源代码如下:
1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 2 3 4 5 6 715 16测试 8 9 10
现在我们再来看关键的部分:
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\r\n\r\n\r\n")); 7 HtmlHead head = this.__BuildControl__control2(); 8 accessor.AddParsedSubObject(head); 9 accessor.AddParsedSubObject(new LiteralControl("\r\n\r\n "));10 HtmlForm form = this.__BuildControlform1();11 accessor.AddParsedSubObject(form);12 accessor.AddParsedSubObject(new LiteralControl("\r\n\r\n\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(" ");17 sb.AppendLine("" + dr["s_no"] + "");18 sb.AppendLine("" + dr["s_name"] + "");19 sb.AppendLine("" + dr["s_sex"] + "");20 sb.AppendLine("" + dr["s_birthday"] + "");21 sb.AppendLine("" + dr["s_avgrade"] + "");22 sb.AppendLine("" + dr["s_dept"] + "");23 sb.AppendLine("删除");24 sb.AppendLine("选择");25 sb.AppendLine("修改");26 sb.AppendLine("");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 SqlHelper41 {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 }
下面这个其实保存的形式是什么无关紧要的,只要是文本形式就行。
1 2 3 440 415 15 16 17
删除部分
1 <%@ WebHandler Language="C#" Class="del" %> 2 3 using System; 4 using System.Web; 5 using System.Data.SqlClient; 6 using System.IO; 7 public class del : IHttpHandler { 8 public void ProcessRequest (HttpContext context) { 9 string tooglePage = File.ReadAllText(context.Server.MapPath("jumpPage.htm"));10 context.Response.ContentType = "text/html";11 //通过url传参数12 string id = context.Request.QueryString["id"];13 string ids = context.Request.Form["ckdel"];14 if (!string.IsNullOrEmpty(id))15 {16 SQLhelper.ExecuteNonQuery2("delete from student where s_no=@id",17 new SqlParameter("@id", id)18 );19 tooglePage = tooglePage.Replace("@targetPage", "List.ashx");20 context.Response.Write(tooglePage);21 }22 else if (!string.IsNullOrEmpty(ids))23 {24 SQLhelper.ExecuteNonQuery2("delete from student where s_no in (" + ids + ")");25 tooglePage = tooglePage.Replace("@targetPage", "List.ashx");26 context.Response.Write(tooglePage);27 }28 else29 {30 31 context.Response.Write("删除不成功!");32 }33 }34 35 public bool IsReusable {36 get {37 return false;38 }39 }40 41 }42 public partial class SQLhelper43 {44 public static void ExecuteNonQuery2(string sql, params SqlParameter[] paramseter)45 {46 using (SqlConnection con = new SqlConnection("Data Source=ROHELM-PC;Initial Catalog=T-SQL练手;Integrated Security=True"))47 {48 con.Open();49 {50 using (SqlCommand cmd = con.CreateCommand())51 {52 cmd.CommandText = sql;53 cmd.Parameters.AddRange(paramseter);54 cmd.ExecuteNonQuery();55 }56 }57 }58 }59 }
添加部分
1 <%@ WebHandler Language="C#" Class="ADD"%> 2 3 using System; 4 using System.Web; 5 using System.Data.SqlClient; 6 7 public class ADD : IHttpHandler { 8 9 public void ProcessRequest (HttpContext context) {10 context.Response.ContentType = "text/html";11 string s_name=context.Request.Form["Name"];12 string s_no = context.Request.Form["num"];13 SQLhelper.ExecuteNonQuery("insert into student(s_no,s_name)values(@number,@name)",14 new SqlParameter("number", s_no),15 new SqlParameter("name", s_name)16 );17 context.Response.Redirect("List.ashx");18 }19 20 public bool IsReusable {21 get {22 return false;23 }24 }25 26 }27 public partial class SQLhelper28 {29 public static void ExecuteNonQuery(string sql, params SqlParameter[] paramseter)30 {31 using (SqlConnection con = new SqlConnection("Data Source=ROHELM-PC;Initial Catalog=T-SQL练手;Integrated Security=True"))32 {33 con.Open();34 {35 using (SqlCommand cmd = con.CreateCommand())36 {37 cmd.CommandText = sql;38 cmd.Parameters.AddRange(paramseter);39 cmd.ExecuteNonQuery();40 }41 }42 }43 }44 }
使用数据库脚本:
1 USE [T-SQL练手] 2 GO 3 /****** Object: Table [dbo].[student] Script Date: 05/10/2012 00:05:40 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET QUOTED_IDENTIFIER ON 7 GO 8 SET ANSI_PADDING ON 9 GO10 CREATE TABLE [dbo].[student](11 [s_no] [int] NOT NULL,12 [s_name] [nvarchar](50) NOT NULL,13 [s_sex] [char](2) NULL,14 [s_birthday] [smalldatetime] NULL,15 [s_speciality] [varchar](50) NULL,16 [s_avgrade] [numeric](3, 1) NULL,17 [s_dept] [varchar](50) NULL,18 CONSTRAINT [PK__student__2F36BC5B7F60ED59] PRIMARY KEY CLUSTERED 19 (20 [s_no] ASC21 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]22 ) ON [PRIMARY]23 GO24 SET ANSI_PADDING OFF25 GO26 /****** Object: Default [DF__student__s_speci__03317E3D] Script Date: 05/10/2012 00:05:40 ******/27 ALTER TABLE [dbo].[student] ADD CONSTRAINT [DF__student__s_speci__03317E3D] DEFAULT ('计算机软件与理论') FOR [s_speciality]28 GO29 /****** Object: Default [DF__student__s_dept__0519C6AF] Script Date: 05/10/2012 00:05:40 ******/30 ALTER TABLE [dbo].[student] ADD CONSTRAINT [DF__student__s_dept__0519C6AF] DEFAULT ('计算机科学系') FOR [s_dept]31 GO32 /****** Object: Check [CK__student__s_avgra__0425A276] Script Date: 05/10/2012 00:05:40 ******/33 ALTER TABLE [dbo].[student] WITH CHECK ADD CONSTRAINT [CK__student__s_avgra__0425A276] CHECK (([s_avgrade]>=(0) AND [s_avgrade]<=(100)))34 GO35 ALTER TABLE [dbo].[student] CHECK CONSTRAINT [CK__student__s_avgra__0425A276]36 GO37 /****** Object: Check [CK__student__s_birth__023D5A04] Script Date: 05/10/2012 00:05:40 ******/38 ALTER TABLE [dbo].[student] WITH CHECK ADD CONSTRAINT [CK__student__s_birth__023D5A04] CHECK (([s_birthday]>='1970-1-1' AND [s_birthday]<='2000-1-1'))39 GO40 ALTER TABLE [dbo].[student] CHECK CONSTRAINT [CK__student__s_birth__023D5A04]41 GO42 /****** Object: Check [CK__student__s_sex__014935CB] Script Date: 05/10/2012 00:05:40 ******/43 ALTER TABLE [dbo].[student] WITH CHECK ADD CONSTRAINT [CK__student__s_sex__014935CB] CHECK (([s_sex]='男' OR [s_sex]='女'))44 GO45 ALTER TABLE [dbo].[student] CHECK CONSTRAINT [CK__student__s_sex__014935CB]46 GO
运行效果:
其他操作显示区域没有调整好,且受到上传图片的限制未演示。