CS Coder学习asp.net5个月的最大感悟:从http的角度重新认识asp.net(一)
写在前文:
对asp.net这门技术,我个人的感情是比较矛盾的,喜欢她,是因为这门技术带领我走进了bs的大门,让我完成了从cs程序员到bs程序员的转变。而厌恶她,则是因为,我差点就被她带入了歧途,通过对http请求处理的层层封装,弄个runat server和viewState,让bs程序(表明上)可以像cs一样的运行。这确实是降低了bs的入门门槛,但也造成了asp.net程序员对bs本质的理解的障碍,导致写起程序来,总感觉隔着点什么。
首先,说下我自己接触asp.net的过程,大三搞android,大四上搞的是winform,大四下学期自己看了2个月的j2ee,也就学到serverlet处理form请求的部分(现在很庆幸当时刚好学到了这里)所以其实3月份找工作时,我可以算作一个标准的cs开发者的,大部分时候都是cs思维,ui线程阻塞,后台线程通过socket和service通信,通过委托和事件完成用户的交互性操作。。。
算上实习,到现在,差不多搞了五个月的asp.net了,还记得刚开始,感觉webform真是爽,各种控件各种拖,像写cs程序一样,而且没有复杂绕脑的事件和多线程同步,这是比cs还要简单的节奏啊。然后我接触到了js,jquery,以及——ajax。蛋疼的时刻终于到来鸟~~
boss是个对用户体验非常看重的人,我们系统中,基本大部分页面都是需要做无刷新效果的,jquery ajax这东西用起来倒也不难,再加上还有UpdatePanel,AjaxPrp此等“神器”,我们照着demo照猫画虎的写好了一些页面,效果也还不错,但后来页面数度改版,用上了母版页,ifram嵌套等,问题就全出来了。至于是什么问题,怎么解决,这里就不做深入讨论了,因为之所以出现那些问题,就是我对bs的认识不够,当我真正拨开迷雾看到本质的时候,这些问题,自然就不是问题了。当然,我所谓的“看到本质”,是相对于我1个月之前对于asp.net的认识,但是毕竟我接触的还太少,对很多东西的理解还是比较模糊的,但愿这篇文章不会出现太多的谬误,大神路过的话,还请留下您的宝贵意见。
要写什么和怎么写:
其实主要就是我一个cs coder,转变为bs coder的一点点感悟和总结,希望能给和我一样经历这种转变的同学一点帮助。
大致分两部分,第一是对http请求的一点说明,第二是以ajax使用为例子,用我文章中的思维模式去理解ajax。
归纳为一句话:在客户端(b)这边把数据放在http请求中,传递给服务端(s),服务端处理完数据之后,response回一些信息,客户端可以收到这些信息。
先来看一个简单的场景,一个输入框输入文字,一个按钮(服务器控件)触发事件(这是按照cs思维来解释,事实上是提交表单数据),然后一个lbl显示后台收到的信息。
但是这么简单的代码,我仍然认为有贴出来的必要。
<body> <form id="form1" runat="server"> <asp:Button runat="server" ID="btnPost" Text="事件回发Post" OnClick="PostChange" /> <br /> <asp:TextBox ID="txtInput" runat="server" Width="700"></asp:TextBox> </form> <br /> <asp:Label runat="server" ID="lblShowResult"></asp:Label> </body>
后台业务代码:
protected void PostChange(object sender, EventArgs e) { lblShowResult.Text = "your input :" + txtInput.Text + "\n and from form:" + Request["txtInput"]; }
一个我以前忽视的问题,也是我开始思考的地方。就是:那个form标签是干啥用的啊?去掉行不行?前面我说过,我很庆幸学java web的时候,刚好是看完了serverlet处理form请求的部分,记得看视频的时候,有两个词,是三句不离口的:form(表单)和submit(提交表单),而在asp.net中,却感觉是被边缘化的,大部分21天精通、xx揭秘之类的书,也很少提起,有也是一笔带过。
幸运的,我找到了这两篇文章,Artech的http://www.cnblogs.com/artech/archive/2007/04/06/702658.html和
Fish li的 http://www.cnblogs.com/fish-li/archive/2011/07/17/2108884.html
实际上肯定不只这两篇,其他的一时想不起来了,同样感谢那些把自己的心得体会共享出来的人
记得还有一篇,是讲服务器控件和客户端控件的区别和联系的,比如
<asp:Button runat="server">
会被解释为:
<input type="submit" name="ctl03" value="" />
所以你的按钮什么都不做(cs思维解释,没绑定事件)事实上它也是干了件不得了的事情:提交表单
这篇文章现在怎么也找不到了,一样对这位作者表示感谢。
上面提到的文章中解释的很详细了,也举了很多巧妙的例子,所以我这里对http和form就不再狗尾续貂了。
只是要强调一点,只要是前后台发生了交互(用户输入了数据,按了按钮做某事,前后台函数互调,ajax和aspx、ashx、web service通信,等等等等)那么必然是发起了http请求,这是无论如何也逃不脱了。所以写bs程序时候,思路一定也是跟着http请求走的。
在上面的例子中,从http的角度来看,就是form表单发起http请求到action的目标,
ps:建议大家多看aspx编译后的html,这才是bs的真相
比如form 如果不显示声明,那么action就是当前页面的后台,html代码如下:
<form name="form1" method="post" action="WebForm1.aspx" id="form1">
通过ie的开发者工具,也可以清晰的看到这个过程
form通过post提交了用户的输入,后台收到这个信息,经过asp.net的渲染,生成整个页面的html代码,返回给前端。
我大致划分一下这个流程:
1,request之前,对数据预处理(js验证,数据解析,hidden控件保存临时或状态数据等,这些操作都发生在客户端(浏览器))
2,request发起,发起人是谁?是form表单还是ajax,是由什么原因导致的发起了http请求。
3,请求指向哪里?是当前页面的后台还是另外实现的ashx或web service?
4,请求是如何被处理的,HttpHandler是谁?
5,response是如何返回数据的(是服务器控件直接赋值、让asp.net自己返回render出来的大堆html代码,还是手工控制response),是在什么时候返回的数据,返回的是什么的数据,是form请求后返回的html还是ajax请求返回的string(json)。ps:form请求其实也不一定就返回html,这个后面谈。
6,请求是如何终止的,是执行完了page_load、ProcessRequest,还是调用response.End()手动终止?
7,客户端收到信息后根据内容该做那些事,怎么做?
至此,才算是一段完整的用户操作。也是aspx页面的一个实例的生命周期的发起和终结。
真正想把asp.net的流程弄透,这几步必须理解的非常清晰,尤其是第5步,方式多样、灵活,但抓住了本质,其实还是那回事。
决不能还想以前玩cs一样:
- 1,建立起业务处理模型,绑定事件处理,如chk事件,btn事件绑定,监听socket等
- 2,事件发生,btn点击,数据库数据被其他地方修改
- 3,执行事件绑定的动作
我开始就是把这套思维直接在webform上使,
- 1,前台控件,布局摆好,后台方法写好
- 2,绑定好前台控件的事件处理方法。
- 3,事件发生,随之执行预定逻辑。
应该说这其实就是webform追求的东西,asp.net通过高度的集成和封装,初步算是做到了,但那是十年前。现在的web,追求更强大的功能和更丰富的表现与交互能力,这套就远远玩不转了。
这里得提下@sp1234 ,虽然这货比较毒蛇,但我还是很喜欢他的发言。他在一次例行毒蛇的时候,说了一段很有意思的话:
1. 你再在前端页面上显然应该看到任何界面都没有改变,什么也没有丢失、也没有混乱。
2. 同时假设你的动态内容有读取数据库的动作的话,你应该监测到没有任何读取数据重新来绑定控件之类的动作,因为这个按钮根本不做什么事情。如果要重新查询数据库并且引起一大堆控件重新绑定,可见程序性能低到极点。
你的程序能够通过这个简单的测试吗?如果不能,那么从头理解asp.net编程,还不晚。许多人写的asp.net程序在这个最初级的测试下都是一塌糊涂经不起检验的,这样的程序甚至可能被用到博客上、教程上,变成了坑害学生的范例了。
当时我看到这段话,还不太明白具体代表的含义,自己测试了下,真是大吃一惊,看来我就是那种需要”从头理解asp.net编程“的人,在这里对@sq1234 表示下感谢。
现在我能够从html form http的角度去理解asp.net之后,自然也就明白当时我的困惑在哪里了。
前面写的几篇博客比较水,严格来说,这是我第一篇技术博客,果然写的好累,没写多少内容就搞到快凌晨1点了,只好猥琐的在标题上加上(一),后面的,有时间再写吧。
国庆刚好没事做,对这段时间的学习做下总结。