终于在cnblogs上开博了,cnblogs有庞大的.net爱好者,可以交流,可以批评,这是我愿意在这里的原因,在spaces.live.com上的那一个长期无人问津。当然,我对.net现在不过刚有兴趣,属菜鸟级,不当之处或有何建议,请联系我的邮箱:j2eedesigner@163.com。
j2ee是我喜欢的东西,当然现在已经是javaee了。相对来说,比.net更喜欢。我以前曾决定不要再学.net,就像本科时候决定只学win32一样。但形势所迫,这工作岗位需要.net的还挺多。而我恰恰找不到工作。所以这四年里,我不得已又看看MFC,Java,最后还是要学习.net。
无论什么服务器IIS,Apache,Tomcat最终要使用Http协议,无论什么FrameWork,无论stuts,webwork,还是Asp.net 2.0,最后总归要生成html文本。我不是一个可以很专注研究问题的人,所以错误是正常的。我的毅力坚持不了几分钟,我知道我喜欢手写而不喜欢打字,喜欢空想而不喜欢行动。2003年,我毕业正在打算建一个个人网站,而淘宝网也刚刚开始,到现在,淘宝已有数千万注册用户,我的网站只不过是一个网页的两行文字;2004年,p2p如日中天,几个学生正躲在宿舍里开发pplive,我也对torrent协议很感兴趣,不过我是用pp点点通来上网下载A片,到现在pplive用户也数以千万计,而我对AV也颇有认识。2005年,我筹划写我的小说已有10个年头,箫鼎此时正开始准备写《诛仙》,到现在,《诛仙》的读者也数以千万计,而我的小说依然只是一个开头而已。写技术文章不是我的强项,因为需要查阅很多东西,有时候我觉得我懂了,其实我是感觉懂了,但是写出来就不一样了,群众的眼睛是雪亮的,是我所无法糊弄的,所以我不得不打点精神,去查一些东西,当然查不到的东西只能猜测一番,给出一个自认合理的解释。我写东西一向喜欢跑题,时不时出来牢骚一番,就像莫言也喜欢在小说中跳出来,自我感慨一番一样。当然这不是好的写作方式,除非我是大家,可惜我不是,我只是找不到工作,而且找不到媳妇,尘世中的一个迷途窝囊之一。
相对于J2ee来说,asp.net封装的东西更多,所以它就更先进,更不灵活,更没有效率,但是对开发者来说,也就更省心。好怀念那种纯粹的时候,没有中间件,自己手动连接监听回馈,多自由。这才是纯粹的程序员,这些天看linux源码,看到用汇编语言操作中断控制器建立各种系统描述符还有页表GDT/IDT表,禁不住热血沸腾,啊,这个年代的编程才是真正的编程,多么的明白直观,多么的没有效率,多么的不可移植。jeffy richer说看到了中间语言,就不再关心这些底层的东西了,实在是不解风情阿。到了j2ee以后,符合规范的服务器封装了Request和Response,并且提供了固定的流程让我们只要重载servlet的service()函数,已经不够灵活。后来的框架就更不像话了,成为了各种设计模式的试验场。其实对我们来说,没有必要做到这么松耦合。现在的上传已经不需要自己手工解析,各种框架提供了现成的函数直接可以提取出文件,真是可惜我了。
服务器在解析jsp文件的时候实际上是生成了一个servlet并且编译了,所以它的输出就是html。.net解析一个aspx文件,实际上也是生成了一个继承自IHttphandler的类,并且编译了。我们看一看实际源代码,相信大家从源代码中得到的东西比我说的更好。有时候太追求细节往往太烦人,所以我一向崇拜那些破解者,他们的毅力与坚持实在让我汗颜。
这是我的Test.aspx文件
下面是伴随它的Test.aspx.cs文件
j2ee是我喜欢的东西,当然现在已经是javaee了。相对来说,比.net更喜欢。我以前曾决定不要再学.net,就像本科时候决定只学win32一样。但形势所迫,这工作岗位需要.net的还挺多。而我恰恰找不到工作。所以这四年里,我不得已又看看MFC,Java,最后还是要学习.net。
无论什么服务器IIS,Apache,Tomcat最终要使用Http协议,无论什么FrameWork,无论stuts,webwork,还是Asp.net 2.0,最后总归要生成html文本。我不是一个可以很专注研究问题的人,所以错误是正常的。我的毅力坚持不了几分钟,我知道我喜欢手写而不喜欢打字,喜欢空想而不喜欢行动。2003年,我毕业正在打算建一个个人网站,而淘宝网也刚刚开始,到现在,淘宝已有数千万注册用户,我的网站只不过是一个网页的两行文字;2004年,p2p如日中天,几个学生正躲在宿舍里开发pplive,我也对torrent协议很感兴趣,不过我是用pp点点通来上网下载A片,到现在pplive用户也数以千万计,而我对AV也颇有认识。2005年,我筹划写我的小说已有10个年头,箫鼎此时正开始准备写《诛仙》,到现在,《诛仙》的读者也数以千万计,而我的小说依然只是一个开头而已。写技术文章不是我的强项,因为需要查阅很多东西,有时候我觉得我懂了,其实我是感觉懂了,但是写出来就不一样了,群众的眼睛是雪亮的,是我所无法糊弄的,所以我不得不打点精神,去查一些东西,当然查不到的东西只能猜测一番,给出一个自认合理的解释。我写东西一向喜欢跑题,时不时出来牢骚一番,就像莫言也喜欢在小说中跳出来,自我感慨一番一样。当然这不是好的写作方式,除非我是大家,可惜我不是,我只是找不到工作,而且找不到媳妇,尘世中的一个迷途窝囊之一。
相对于J2ee来说,asp.net封装的东西更多,所以它就更先进,更不灵活,更没有效率,但是对开发者来说,也就更省心。好怀念那种纯粹的时候,没有中间件,自己手动连接监听回馈,多自由。这才是纯粹的程序员,这些天看linux源码,看到用汇编语言操作中断控制器建立各种系统描述符还有页表GDT/IDT表,禁不住热血沸腾,啊,这个年代的编程才是真正的编程,多么的明白直观,多么的没有效率,多么的不可移植。jeffy richer说看到了中间语言,就不再关心这些底层的东西了,实在是不解风情阿。到了j2ee以后,符合规范的服务器封装了Request和Response,并且提供了固定的流程让我们只要重载servlet的service()函数,已经不够灵活。后来的框架就更不像话了,成为了各种设计模式的试验场。其实对我们来说,没有必要做到这么松耦合。现在的上传已经不需要自己手工解析,各种框架提供了现成的函数直接可以提取出文件,真是可惜我了。
服务器在解析jsp文件的时候实际上是生成了一个servlet并且编译了,所以它的输出就是html。.net解析一个aspx文件,实际上也是生成了一个继承自IHttphandler的类,并且编译了。我们看一看实际源代码,相信大家从源代码中得到的东西比我说的更好。有时候太追求细节往往太烦人,所以我一向崇拜那些破解者,他们的毅力与坚持实在让我汗颜。
这是我的Test.aspx文件
%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="bt" runat="server" Height="100px" OnClick="bt_Click" Text="Click Me !" />
<asp:TextBox ID="TextBox1" runat="server">assd</asp:TextBox></div>
</form>
</body>
</html
很简单,只是两个控件。<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="bt" runat="server" Height="100px" OnClick="bt_Click" Text="Click Me !" />
<asp:TextBox ID="TextBox1" runat="server">assd</asp:TextBox></div>
</form>
</body>
</html
下面是伴随它的Test.aspx.cs文件
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
int i = 1;
}
protected void bt_Click(object sender, EventArgs e)
{
if ("a".Equals ((string)ViewState["Re"]))
{
bt.Height = 900;
ViewState["Re"] = "b";
}
else
{
bt.Height = 100;
ViewState["Re"] = "a";
}
Response.Write( "ViewState :"+Request.Params["__VIEWSTATE"]+"<br/>" );
string decodeValue = Encoding.UTF8.GetString( Convert.FromBase64String( Request.Params["__VIEWSTATE"] ) );
Response.Write( "ViewState decode :"+decodeValue+"<br/>" );
}
}
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
int i = 1;
}
protected void bt_Click(object sender, EventArgs e)
{
if ("a".Equals ((string)ViewState["Re"]))
{
bt.Height = 900;
ViewState["Re"] = "b";
}
else
{
bt.Height = 100;
ViewState["Re"] = "a";
}
Response.Write( "ViewState :"+Request.Params["__VIEWSTATE"]+"<br/>" );
string decodeValue = Encoding.UTF8.GetString( Convert.FromBase64String( Request.Params["__VIEWSTATE"] ) );
Response.Write( "ViewState decode :"+decodeValue+"<br/>" );
}
}
关于ViewState是我为了测验.net关于ViewState做了些什么而加入的,大家可以不看。现在我们看看微软怎么改编组合这些东西呢。下面是微软生成的cs文件,为了方便,我们把这些放在一起。
public partial class Test : System.Web.SessionState.IRequiresSessionState {
protected global::System.Web.UI.WebControls.Button bt;
protected global::System.Web.UI.WebControls.TextBox TextBox1;
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
protected System.Web.Profile.DefaultProfile Profile {
get {
return ((System.Web.Profile.DefaultProfile)(this.Context.Profile));
}
}
protected System.Web.HttpApplication ApplicationInstance {
get {
return ((System.Web.HttpApplication)(this.Context.ApplicationInstance));
}
}
}
namespace ASP {
[System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]
public class test_aspx : global::Test, System.Web.IHttpHandler {
private static bool @__initialized;
private static object @__fileDependencies;
public test_aspx() {
string[] dependencies;
#line 912304 "C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\WebSites\WebSite1\Test.aspx.cs"
((System.Web.UI.Page)(this)).AppRelativeVirtualPath = "~/Test.aspx";
if ((global::ASP.test_aspx.@__initialized == false)) {
dependencies = new string[2];
dependencies[0] = "~/Test.aspx";
dependencies[1] = "~/Test.aspx.cs";
global::ASP.test_aspx.@__fileDependencies = this.GetWrappedFileDependencies(dependencies);
global::ASP.test_aspx.@__initialized = true;
}
this.Server.ScriptTimeout = 30000000;
}
private global::System.Web.UI.HtmlControls.HtmlTitle @__BuildControl__control3() {
global::System.Web.UI.HtmlControls.HtmlTitle @__ctrl;
@__ctrl = new global::System.Web.UI.HtmlControls.HtmlTitle();
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("无标题页"));
return @__ctrl;
}
private global::System.Web.UI.HtmlControls.HtmlHead @__BuildControl__control2() {
global::System.Web.UI.HtmlControls.HtmlHead @__ctrl;
@__ctrl = new global::System.Web.UI.HtmlControls.HtmlHead("head");
global::System.Web.UI.HtmlControls.HtmlTitle @__ctrl1;
@__ctrl1 = this.@__BuildControl__control3();
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(@__ctrl1);
return @__ctrl;
}
private global::System.Web.UI.WebControls.Button @__BuildControlbt() {
@__ctrl.Click += new System.EventHandler(this.bt_Click);
return @__ctrl;
}
private global::System.Web.UI.WebControls.TextBox @__BuildControlTextBox1() {
}
private global::System.Web.UI.HtmlControls.HtmlForm @__BuildControlform1() {
global::System.Web.UI.HtmlControls.HtmlForm @__ctrl;
@__ctrl = new global::System.Web.UI.HtmlControls.HtmlForm();
this.form1 = @__ctrl;
@__ctrl.ID = "form1";
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n <div>\r\n "));
global::System.Web.UI.WebControls.Button @__ctrl1;
@__ctrl1 = this.@__BuildControlbt();
@__parser.AddParsedSubObject(@__ctrl1);
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n "));
global::System.Web.UI.WebControls.TextBox @__ctrl2;
@__ctrl2 = this.@__BuildControlTextBox1();
@__parser.AddParsedSubObject(@__ctrl2);
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("</div>\r\n "));
return @__ctrl;
}
private void @__BuildControlTree(test_aspx @__ctrl) {
#line 1 "C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\WebSites\WebSite1\Test.aspx"
this.InitializeCulture();
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(new System.Web.UI.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/1" +
"999/xhtml\" >\r\n"));
global::System.Web.UI.HtmlControls.HtmlHead @__ctrl1;
@__ctrl1 = this.@__BuildControl__control2();
@__parser.AddParsedSubObject(@__ctrl1);
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n<body>\r\n "));
global::System.Web.UI.HtmlControls.HtmlForm @__ctrl2;
@__ctrl2 = this.@__BuildControlform1();
@__parser.AddParsedSubObject(@__ctrl2);
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n</body>\r\n</html>\r\n"));
}
protected override void FrameworkInitialize() {
base.FrameworkInitialize();
this.@__BuildControlTree(this);
this.AddWrappedFileDependencies(global::ASP.test_aspx.@__fileDependencies);
this.Request.ValidateInput();
}
public override void ProcessRequest(System.Web.HttpContext context) {
base.ProcessRequest(context);
}
}
}
protected global::System.Web.UI.WebControls.Button bt;
protected global::System.Web.UI.WebControls.TextBox TextBox1;
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
protected System.Web.Profile.DefaultProfile Profile {
get {
return ((System.Web.Profile.DefaultProfile)(this.Context.Profile));
}
}
protected System.Web.HttpApplication ApplicationInstance {
get {
return ((System.Web.HttpApplication)(this.Context.ApplicationInstance));
}
}
}
namespace ASP {
[System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]
public class test_aspx : global::Test, System.Web.IHttpHandler {
private static bool @__initialized;
private static object @__fileDependencies;
public test_aspx() {
string[] dependencies;
#line 912304 "C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\WebSites\WebSite1\Test.aspx.cs"
((System.Web.UI.Page)(this)).AppRelativeVirtualPath = "~/Test.aspx";
if ((global::ASP.test_aspx.@__initialized == false)) {
dependencies = new string[2];
dependencies[0] = "~/Test.aspx";
dependencies[1] = "~/Test.aspx.cs";
global::ASP.test_aspx.@__fileDependencies = this.GetWrappedFileDependencies(dependencies);
global::ASP.test_aspx.@__initialized = true;
}
this.Server.ScriptTimeout = 30000000;
}
private global::System.Web.UI.HtmlControls.HtmlTitle @__BuildControl__control3() {
global::System.Web.UI.HtmlControls.HtmlTitle @__ctrl;
@__ctrl = new global::System.Web.UI.HtmlControls.HtmlTitle();
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("无标题页"));
return @__ctrl;
}
private global::System.Web.UI.HtmlControls.HtmlHead @__BuildControl__control2() {
global::System.Web.UI.HtmlControls.HtmlHead @__ctrl;
@__ctrl = new global::System.Web.UI.HtmlControls.HtmlHead("head");
global::System.Web.UI.HtmlControls.HtmlTitle @__ctrl1;
@__ctrl1 = this.@__BuildControl__control3();
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(@__ctrl1);
return @__ctrl;
}
private global::System.Web.UI.WebControls.Button @__BuildControlbt() {
@__ctrl.Click += new System.EventHandler(this.bt_Click);
return @__ctrl;
}
private global::System.Web.UI.WebControls.TextBox @__BuildControlTextBox1() {
}
private global::System.Web.UI.HtmlControls.HtmlForm @__BuildControlform1() {
global::System.Web.UI.HtmlControls.HtmlForm @__ctrl;
@__ctrl = new global::System.Web.UI.HtmlControls.HtmlForm();
this.form1 = @__ctrl;
@__ctrl.ID = "form1";
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n <div>\r\n "));
global::System.Web.UI.WebControls.Button @__ctrl1;
@__ctrl1 = this.@__BuildControlbt();
@__parser.AddParsedSubObject(@__ctrl1);
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n "));
global::System.Web.UI.WebControls.TextBox @__ctrl2;
@__ctrl2 = this.@__BuildControlTextBox1();
@__parser.AddParsedSubObject(@__ctrl2);
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("</div>\r\n "));
return @__ctrl;
}
private void @__BuildControlTree(test_aspx @__ctrl) {
#line 1 "C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\WebSites\WebSite1\Test.aspx"
this.InitializeCulture();
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(new System.Web.UI.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/1" +
"999/xhtml\" >\r\n"));
global::System.Web.UI.HtmlControls.HtmlHead @__ctrl1;
@__ctrl1 = this.@__BuildControl__control2();
@__parser.AddParsedSubObject(@__ctrl1);
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n<body>\r\n "));
global::System.Web.UI.HtmlControls.HtmlForm @__ctrl2;
@__ctrl2 = this.@__BuildControlform1();
@__parser.AddParsedSubObject(@__ctrl2);
@__parser.AddParsedSubObject(new System.Web.UI.LiteralControl("\r\n</body>\r\n</html>\r\n"));
}
protected override void FrameworkInitialize() {
base.FrameworkInitialize();
this.@__BuildControlTree(this);
this.AddWrappedFileDependencies(global::ASP.test_aspx.@__fileDependencies);
this.Request.ValidateInput();
}
public override void ProcessRequest(System.Web.HttpContext context) {
base.ProcessRequest(context);
}
}
}
public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
int i = 1;
}
protected void bt_Click(object sender, EventArgs e)
{
if ("a".Equals ((string)ViewState["Re"]))
{
bt.Height = 900;
ViewState["Re"] = "b";
}
else
{
bt.Height = 100;
ViewState["Re"] = "a";
}
Response.Write( "ViewState :"+Request.Params["__VIEWSTATE"]+"<br/>" );
string decodeValue = Encoding.UTF8.GetString( Convert.FromBase64String( Request.Params["__VIEWSTATE"] ) );
Response.Write( "ViewState decode :"+decodeValue+"<br/>" );
}
}
{
protected void Page_Load(object sender, EventArgs e)
{
int i = 1;
}
protected void bt_Click(object sender, EventArgs e)
{
if ("a".Equals ((string)ViewState["Re"]))
{
bt.Height = 900;
ViewState["Re"] = "b";
}
else
{
bt.Height = 100;
ViewState["Re"] = "a";
}
Response.Write( "ViewState :"+Request.Params["__VIEWSTATE"]+"<br/>" );
string decodeValue = Encoding.UTF8.GetString( Convert.FromBase64String( Request.Params["__VIEWSTATE"] ) );
Response.Write( "ViewState decode :"+decodeValue+"<br/>" );
}
}
namespace @__ASP {
internal class FastObjectFactory_app_web_ndlcw7zj {
#line 1 "c:\\dummy.txt"
#line default
#line hidden
private FastObjectFactory_app_web_ndlcw7zj() {
}
static object Create_ASP_test_aspx() {
return new ASP.test_aspx();
}
static object Create_ASP_default_aspx() {
return new ASP.default_aspx();
}
}
}
internal class FastObjectFactory_app_web_ndlcw7zj {
#line 1 "c:\\dummy.txt"
#line default
#line hidden
private FastObjectFactory_app_web_ndlcw7zj() {
}
static object Create_ASP_test_aspx() {
return new ASP.test_aspx();
}
static object Create_ASP_default_aspx() {
return new ASP.default_aspx();
}
}
}
非常庞大,我已经尽可能的去掉不需要的东西,构造button 和 textbox和label差不多,所以就把代码省略了,但button多一个事件,这行保留。有些地方解释一下,ViewState是一个StateBag对象,属于Page类的成员,所以被自然继承了,因此没有代码中没有声明它。我们可以看到实际上我们运行的是test.aspx类,它直接继承自Test和IHttphandler,我们知道,继承IHttpHandler必须要实现IsReusable属性,那代码中为什么没有呢,原来它是在Page类里。另外Page类有一个ProcessRequest方法,IHttphandler也有一个。可知aspx最后要编译成一个httphandler,然后容器调用它的processrequest方法,发现只有一行,base.proceRequest(),于是转向Test的ProcessRequest方法,也就是Page的ProcessRequest方法了,然后再这个方法里面Render各种Control,ClearViewState,调用Page_onLoad等等。这些我也不清楚,因为毕竟没找到源代码。不误己误人。
一个小时,弄这些东西,竟然还不是很烦,有进步,错误的地方请指正,毕竟我只是初学者而已。