zoukankan      html  css  js  c++  java
  • ★★★【庖丁解牛:纵向切入Asp.net 3.5控件和组件开发技术系列—(1)读者序】★★★

     

     

    本书主要内容

     

    大部分开发人员在学习Asp.net的过程中都有这样的体会,使用Asp.net开发很多年,但仍然感觉对Asp.net技术的了解比较少,对知识点的了解比较模糊;以及,在工作过程中经常接到苛刻的控功能需求,我们经常以“控件不支持的理由”回避需求人员,侥幸逃过一劫。但这并不是长久之计,要想Asp.net技术有质的提高, 必须首先要理解其工作原理, 了解页面、控件的工作原理及呈现过程。

     

    本书主要介绍ASP.NET的控件开发,书中通过70多个例子讲解ASP.NET控件开发技术的各个方面,而且剖析了很多控件系统基类源代码,并且从这些系统源代码可以体会设计模式思想。如果扎实地掌握了ASP.NET控件的运行机制,开发一个页面级的ASP.NET应用程序会变得非常简单。本书宗旨就是让开发人员真正理解ASP.NET技术,帮助开发人员提高ASP.NET开发的技术水平。学完本书后您不仅能够掌握控件开发各个方面的技术, 而且深晓ASP.NET的工作原理。对大部分使用Asp.net技术开发两年左右的开发人员来说,本书内容中有75%以上的内容可能没有接触到,本书将通过作者精心准备的一些形象的例子来阐述这些内容。如果您想了解本书的更多内容,请查看下面网址:http://www.cnblogs.com/ChengKing/archive/2009/01/02/1366915.html

     

    本书通过讲解Asp.net控件技术提高开发人员的Asp.net技术。适合从事Asp.net技术多年想往深度理解Asp.net工作机制的工作人员;基于考虑到对Asp.net刚刚入门的初级开发人员,我在前面几章也介绍了几个帮助初始人员入门的应用例子;微软公司的Asp.net技术已经经过了三个版本的大演变,已经变为比较成熟的技术,目前在软件企业应用中也广泛被采纳,本书也可以作为在校学生的就业预备教材,本书可以让您理解最流行的基于Web架构的应用程序呈现过程。另外,针对读者安装的开发环境不同,我分别为VS 2005VS 2008建立了两个解决方案,即无论您是在VS 2005下开发还是VS 2008下开发都可以成功打开本书随书光盘的代码,只是使用VS 2005打开的解决方案不包含.NET 3.5对应章节内容的示例代码。

     

     

     

     

    很多开发人员都有这样的体会,使用ASP.NET开发很多年,但觉得水平总是提高不了,甚至我发现有超过五年工作经验的资深开发人员对ASP.NET技术掌握得也不是很深。其主要原因是在开发过程中只注重往广度(横向)去学习各种技术,包括各种最新技术,而没有在掌握一个技术后往深度(纵向)研究。还有很多开发人员虽然具有多年工作经验,但只是使用ASP.NET技术开发页面级的应用程序(页开发人员),而没有或没有机会接触到ASP.NET的底层技术,比如Web应用程序的页面呈现过程等,这些技术并不仅限于ASP.NET,而是在基于Web平台的B/S架构下必须掌握的东西。

    比如一头牛,看上去似乎浑身都是肉,但如果我们拿着刀去宰一头牛,才知道没那么容易,仅用刀无规律地硬砍不但会费很大的力气,而且很可能会最终把牛砍得一片狼藉,因为对牛的身体组织结构不熟悉而无法正确地入刀;而《庄子·养生主》中为文惠君宰牛的厨师则不然,其刀入牛身若“无厚入有间”而游刃有余,因为他对牛的结构了如指掌,这就是所谓的深度(纵向深入研究)。

    学习ASP.NET技术也是这样,如果在工作中只是对技术浅尝辄止,则很难提高自身的技术水平,本书主旨正是用“庖丁解牛”之术解析ASP.NET,从深度讲解ASP.NET的工作机制。

    运行环境介绍

    本书所述的开发环境主要以微软最新框架.NET Framework 3.5为基础,整合VS 2008开发环境进行讲解,本书随书光盘所有示例均在IE 7.0浏览器全部验证通过。

    .NET Framework 3.5完全兼容之前的版本,也就是说.NET Framework 3.5之前版本的控件类库是.NET Framework 3.5的子集,基于此在随书光盘中我专门用VS 2005开发环境做了一套示例(只是缺少.NTE 3.5新功能特性,如Ajax控件)。这样可以让使用VS 2005VS 2008的朋友都能够打开随书光盘中的控件工程。在书中的许多技术点都以VS 2005VS 2008这两个开发环境进行对比分析。

    本书主旨及特色

    准确地讲,ASP.NET是一种技术而不是一种语言,掌握一门技术的前提是要理解其工作原理。相对来说,学习ASP.NET技术要比学习一门语言要难许多。

    而本书的宗旨就是让开发人员真正地理解ASP.NET技术,帮助开发人员提高ASP.NET开发技术。书中内容主要以控件开发为主,如果扎实地掌握ASP.NET控件的运行机制,则开发一个页面级的ASP.NET应用程序会变得非常简单,学完本书后您不仅能够掌握控件开发各个方面的技术,而且能够透彻理解ASP.NET的工作原理。

    本书不是讲解怎么使用ASP.NET控件,而是实实在在地讲解怎么开发控件。在讲解控件开发的过程中剖析了很多控件系统基类源代码,多接触些.NET Framework的源代码对设计模式思想的理解也会更深刻,相对于书中的理论这就是实践。控件开发与设计模式有何相干?

    设计模式浅淡:在继承系统基类开发自定义控件的过程中,细心的开发人员可能会发现基本上系统的所有的基类都有一个最基本的设计模式 模板方法模式,这个设计模式的特点是:由基类定义骨架,由基类驱动(比如控件的生命周期各个阶段方法的执行就是由基类驱动的),由基类提供最普遍的默认实现,由基类抽取出不变代码实现代码重用。这样的好处是,在大多数情况下,我们在开发自己的自定义控件时,写很少的代码(或者什么都不写)就可以实现一个控件,举个例子请看一下如下代码:

     

    Public KingTextBox : TextBox

    {}

     

    以上代码中没有写一句实现代码,但它仍然是一个完整的控件,重用了基类中的所有功能,当我们需要的功能与基类的功能不同时,仅需要重写(override)基类个别方法,即可实现必要的功能,其余功能的仍然使用基类的默认实现,这里要说明的是实现自定义控件类不像实现我们自己的业务类一样要把类中的每个方法都要亲自编码实现。此外,在控件开发技术中,使用这种设计模式可以把繁琐的事情由系统基类来统一完成,在一定程可以避免开发人员出错的可能性。

    设计模式是面向对象的公式,我个人也看过不少设计模式方面的书,也对设计模式比较感兴趣。个人觉得学习设计模式最好的办法是先找几本书看一遍,吃透,再看大量的源代码,经常会有顿悟的感觉;否则可能看懂了一段精典设计模式的代码,也不知道是什么设计模式,只是把代码读懂了。在控件开发中,如果你想了解得更多,必须要看.NET Framework中的系统控件代码,在不知不觉中就会提高自己的开发能力和面向对象思想。

    本书内容主旨不是讲设计模式,这里就谈这么多,如果想了解更多面向对象的话,我仍然要提醒的是在看系统源代码时不要局限于仅看懂代码,还要看一下系统基类之前的关系,想一下它们的类为什么要这么设计。

     

    书中有些重要的知识点一般开发人员可能永远不会在工作中用到,但这些知识可以让您对ASP.NET技术理解得更透彻、更深刻。

    此外,控件开发工作的好处是有更多机会实战面向对象,比如控件中的接口非常多,一个好的控件不仅在于功能强大,性能好,也在于是否易重用,是否易扩展,是否能用尽量少的代码实现所需的功能。

    看完本书,您将能够理解ASP.NET页面以及其中每个元素的生成过程。ASP.NET开发实质上就是应用控件的过程,我们在页面中使用的每个控件,甚至页面都是一个派生自System.Web.UI.Page控件的类,只是Page控件是一个特殊的容器控件,而它的生成周期与一般控件生成周期是一样的,在书中也有一些讲解Page控件运行机制的知识点。当知道了控件的工作原理,再来开发一个页面则会非常容易,也可以说学习控件开发是加速掌握ASP.NET技术的有效途径。

    本书注重理论实践结合,针对每个ASP.NET控件开发技术知识点,基本上都会有对应的示例应用。

    在章节分类方面,按照技术点类别进行分类,内容比较全面,对每个控件开发技术点,都进行了详尽的阐述,本书也可以作为查找手册使用。

    是什么原因让我有写这本书的意愿

    开始我仅仅是把控件开发经验写在博客上,后来发现这样写在Blog上比较琐碎,最大的缺点是不能保证知识点前后连贯性,也不能系统地有始到终全面地讲解完整一种技术。慢慢地随着开发经验的增多,渐渐就有了写这本书的打算,乃至本书最终出版。

    本书可以帮助读者提高ASP.NET开发技能,对我来说也是对近几年工作一个系统的总结,在写书的过程中自己能力也提高了许多。

    ASP.NET技术可以说是技术的一次伟大变革,但也为开发人员带来一些隐患,因为它使程序员变得“比较傻”,Web服务器技术是一个比较复杂的技术,程序员如果一开始从事开发就遇到ASP.NET,就会认为开发Web程序像C/S架构那么简单,导致程序员不仅不了解客户端技术,而且由于ASP.NET的易用性(为了实现易用性而把一些Web技术封闭到底层)使程序员对服务器端技术也不甚了解。我对这个是比较愤慨的,这也是写这本书的另一个重要原因。我发现好多开发人员对ASP.NET技术的理解甚微,与我一起工作的甚至有多年开发经验的朋友对一些ASP.NET基本性的原理还不了解,也可以说终究是因为ASP.NET技术的出现以及开发环境的集成性让很多开发人员变成“傻瓜式”的编程,使开发人员没有机会去了解那些东西。

    ASP.NET为例,举几个开发人员常犯的基础性认识错误:

    Ø 分不清楚控件的服务端和客户端ID

    页面中有一个IDTextBox1的服务端控件,很多开发人员在客户端访问该控件的DOM元素时,用如下语句:

    var txtbox = document.getElementByID("TextBox1");

    之后有一天,他突然发现代码出问题了,通过以上代码再不能够检索到TextBox1控件的客户端元素了。对服务端控件来说这种写法是错误的,正确写法是:

    var txtbox = document.getElementById('<%= TextBox1.ClientID %>');

    出错原因是他们没有理解服务端控件不像客户端控件只有一个ID。服务端控件有三个属性标志控件的唯一名称,这三个属性是:IDUniqueIDClientID。其中ID表示我们给它命名的ID,不管在服务端还是客户端程序中都不会使用这个IDUniqueID表示控件的服务端ID,在服务端标志控件的唯一名称;ClientID表示控件的客户端ID,在客户端标记页面中元素唯一名称。从使用角度讲,如果继承了INamingContainer接口,当我们为子控件设定一个ID后,它的UniqueIDClientID会自动加上父控件名称和分隔符作为前缀。一般来说,在服务端分隔符默认使用“$”进行分隔(UniqueID),但是到了客户端会自动将这些“$”转换为下画线“_”(ClientID),即客户端ID和服务端ID名称是一样的,只是分隔符不同。

    上面代码出错的原因是某天他把TextBox1控件放到了母版页容器控件中。在增加母版页之前,TextBox1控件由于没有父容器,所以它的IDUniqueID以及ClientID都是“TextBox1”,只是巧合;一旦TextBox1放到了容器控件中,它的UniqueIDClientID都会发生改变,要增加父容器的名称作为前缀,比如它的ClientID可能变为Panel1_TextBox1,服务端UniqueID变为Panel1$TextBox1。这里限于篇幅不再深入阐述,本书中会有详解。

    Ø 滥用ASP.NET提供的系统级对象

    由于一些开发人员对ViewState(还包括CacheSession等)机制的不了解,而导致其在开发过程中滥用。比如误认为ViewState是存储在客户端(表面看是在页面中)而不是服务端,而把ViewState当做一个海量容器来用,甚至把页面上的业务列表数据都缓存到ViewState中,最终导致页面流量庞大,打开页面速度非常慢却找不到原因。

    学习一种技术与学习一种语言是有区别的。首先要了解ASP.NET各个对象的机制,简单地说ViewState的工作流程是这样的:每次提交时,它都会以客户端到服务端的形式来回传递一次,当处理完成后,最后会以处理后的新结果作为新的ViewState存储到页面中的隐藏字段,并与页面内容一起返回到客户端。

    上面导致页面非常慢的原因是,开发人员不了解ASP.NET的页面呈现过程,误把业务级数据的序列化字符串存储到页面上的隐藏控件中,从而导致页面字节数变得庞大,使传输速度成为瓶颈。ViewState最喜欢存储数据量少的键/值串。有关页面状态(视图状态和控件状态)的保存在第6章有专门讲解。

    还有朋友问我,在页面提交时要在服务器上运行一段JavaScript代码,而不是在客户端运行,应该怎么做?或者有的朋友问,在两个服务端代码段中间执行一段JavaScript脚本该怎么做?

    出现这些问题的最根本原因是开发人员对ASP.NET技术运行机制没有了解清楚ASP.NET服务端控件生命周期,不知道客户端脚本是必须在服务端执行完成后才在客户端执行的。

    使用面向对象思想构建软件可以带来很多好处,比如封装性、扩展性,等等,好处多多,这里就不一一列举。这里我要说的是面向对象给开发人员带来的隐患。很多开发人员进行面向对象开发时,都是在不了解基类的前提下进行派生并开发的,如果使用面向对象技术,不了解基类真的是非常危险的事情。这里的基类指的是系统基类、三方组件基类或自己开发的基类,其中系统基类是最应该了解,也是最容易忽略的。

    比如我们在派生类中经常会使用一些类似base.方法名(参数)语句格式的方法,尤其是在控件开发过程中,基本上都是派生自系统控件基类开发自己控件的。比如一个简单的base.Render(e)方法的使用,我在开发过程中就遇到这么多应用场景:有时候不调用该语句;有时候必须调用;有时候需要调用它但要屏蔽基类base.Render(e)方法体中的一些功能或修改部分功能;有时候不调用但要执行base.Render(e)方法中的部分代码语句,等等。要实现这么多场景功能,前提是必须要对base.Render(e)方法了解,更确切地说应该是对整个基类了解。也有许多开发人员在不知道基类中方法的功能时,通过例子去猜测性的尝试,根据调用的结果来了解它的功能,但在很多时候这种方式得出的结论是不准确的。最好的办法是彻底地看一下基类的源代码。

    基于此,本书的另一大特色就是在讲解每一种控件开发类型时,都会先把系统提供的可继承控件基成员(基类或基接口)作详细解析。这样不但可以让开发人员开发时能够感觉得心应手,更重要的是能够帮助他们开发出更准确更精确的控件。

    我 的 承 诺

    如果您之前没有从ASP.NET控件研究过ASP.NET开发,看了这本书您对ASP.NET技术的理解会提高三倍,对于已从事开发一两年的开发人员,对于本书75%以上的内容可能还没有接触到。本书就像“庖丁解牛”一样剖析ASP.NET,当然前提是您要有耐心把本书读完。由于本书介绍的是一些ASP.NET高级编程技术,可能有些技术初学者理解起来比较困难,遇到这种情况千万不要泄气,只要坚持把书看完就会做到前后技术连贯起来。

    另外,书中讲到的每个例子都在随书光盘中对应章节可以找到,每看完一个例子要运行一次实际的例子,这些例子不仅仅是示例一下每个控件开发技术,更重要的是它提供了一些控件开发解决方案经验。

    本书适合读者对象

    本书通过讲解ASP.NET控件技术来帮助开发人员提高自身ASP.NET开发水平,适合从事ASP.NET技术开发多年,希望深度理解ASP.NET工作机制的工作人员,考虑到对ASP.NET刚刚入门的初级开发人员,在本书前几章也介绍了几个帮助初级人员入门的应用例子。微软公司的ASP.NET技术已经经过了三个版本的大演变,变为比较成熟的技术,目前在软件企业应用中也广泛被采纳,本书也可以作为在校学生的就业预备教材。

    不是我自己在奋斗

    首先我要感谢开心大哥和林思绮为本书作的推荐序,以及各位专家(杜勇,朱晔,王涛,李会军,高阳,孟宪会,苏鹏,张博,叶帆,李洪根)如一针见血的书评,有了你们的书评,本书犹如如虎添翼。

    其次,对提供技术分享的博友们表示感谢,哪怕是我们并不认识,但你们对知识一丝不挂的分享是我知识进步的源泉。特别要感谢以杜勇先生为首的网上家园-博客园,可甚称技术专家基地,不管是我在写作过程中还是在工作中,你们总是能供在我遇到困难时及时的提供解决方案。

    在工作中,每天与我最亲密的就是我的如兄弟姐妹般的同事们,多谢你们对我技术的指导以及对我生活中的关怀,多谢!

    对本书的各位编辑李冰、许艳、李玲以及电子工业出版社所有相关工作人员,表示由衷的感谢,本书的出版离不开你们的指导和你们辛勤的工作,尤其是在本书写作的过程中,李冰始终的耐心支持与鼓励,以及许艳对书稿审批的细心一丝不漏,还有李玲对本书外观的设计极富创意,再次对你们三位表示特别感谢。

    我还要感谢我的家人。父母生我养我,您们的恩情我即使是衔草结环也难以回报,您们对我无微不至的关心与照顾,使得我能够心无旁骛,专心写作。感谢我新婚的妻子赵敬对我写作本书期间的全力支持,在我忙碌写书的时候,总是忽略了你默默在我身边,即使是在阳光明媚的秋日,我也无法陪伴你去南山郊游,但你没有丝毫怨言,没有你的理解和鼓励,就不可能有本书的出版。家人的关怀始终是这么温暖,我希望能将本书献给我亲爱的家人。

    最后,感谢具有非凡人般毅力、又有坚强的性格,能够为追求自己的理想而努力拼搏、永不放弃的我。我的座右铭:对一件觉得有意义的事情,要设法用最快的时间完成它。

    现在阅读本书内容: http://www.cnblogs.com/ChengKing/archive/2009/01/02/1366915.html
        在线购买本书:
          【当当网购买】
          【china-pub购买】
          【卓越亚马逊购买】

                                                                    

     

    郑健      

                                                               200911

     

     

    如果您需要发问,  非常欢迎您在下面留言,  Thanks/King.

     

     

    .

    .

    .

     

     

    郑健,【夜战鹰】【ChengKing(ZhengJian)】
  • 相关阅读:
    使用scp进行远程数据传输时避免输入密码(scp without password)
    scons用户指南翻译(附gcc/g++参数详解)
    StringIO 模块用于在内存缓冲区中读写数据
    注意变换的顺序
    为什么static成员必须在类外初始化
    Visual Studio中删除所有空行
    rendering order of skybox
    解决VS中注释乱码的问题
    一道数论题目
    First Chance Exception
  • 原文地址:https://www.cnblogs.com/ChengKing/p/1366964.html
Copyright © 2011-2022 走看看