.net基本工作流入门
工作流模型分析作者:胡长城(银狐999)Email:james-fly@创作时间:2003年11月早就想写篇有关工作流模型方面的文档。
一直以来,网上只发现一些英文文档,有关工作流的中文文档实在太少,有关工作流模型的更是稀少。
就不罗嗦了,直接进入正题吧。
接下了及后续的篇幅,我会为大家介绍以下几方面内容:起点模型,激活模型,运转模型,流程组合嵌套模型,流程整合模型等。
其中,第三节的运转模型,理所当然的是本篇的重中之重了,说的也比较细致。
请参看下面的目录结构。
目录=============================================================================一、流程的起点模型1.1 单起点(Single Start Node)1.2 多起点多起点方式一多起点方式二多起点方式三二、流程的激活模型2.1 人工激活2.2 定时或限时激活2.3 外界消息激活三、流程的运转模型3.1 基本运转模型串行(Sequence)自循环3.2 发散运转模型并行(Parallel)独占式选择(Exclusive Choice)鉴别式选择(Discriminator Choice)抄送模型发散模型3.3 聚合运转模型同步聚合(synchronize merge)简单聚合(Simple Merge)多重聚合(Multiple Merge)鉴别式聚合(Discriminator Merge)四、流程组合嵌套模型4.1 内嵌模型主流程等待方式主流程也运行方式4.2 外嵌模型五、流程整合模型================================================================================= 有关“什么是工作流”和工作流的概念,就不在这里介绍了。
大家有兴趣的可以到WFMC上看看。
这里先说说个人的看法:一个工作流包括一组任务(Task)及它们的相互顺序关系,还包括流程及任务的启动和终止条件,以及对每个任务的描述。
其实这是摘自/workflow/workflow.htm 上一段话有关工作流的描述。
只是原文叫“活动”,我改为任务(Task),可能更好理解一些。
其实,现在已经跳出了单工作流的圈子,越来越倾向于多工作流之间的嵌套或整合,在本文后面的第4、5节会简要的介绍。
在进入各个模型说明前,需要说明一些有关本篇文章中,出现的一些图形含义。
既然然流程图,就免不了用图形表示,用图标代替一些流程节点的含义。
如下图所示:有关器各个图标的含义,在后续会说明。
一、流程的起点模型任何事物都有由头有尾,一个流程也不例外,那么现在我们就从流程的“头”——流程起点说起。
首先,需要说明的是,起点也是一种任务节点(Task Node)。
1.1 单起点(Single Start Node)单起点估计大家都比较容易理解,现实中工作流应用的也是最为普遍。
如下图(1-1)所示,其就是单起点的模型。
在接下来的所有图像中,一个绿色方框代表一个起点。
图(1-1)1.2 多起点多起点的工作流,在现实应用多不是太多。
其主要表达的是,在同一流程中,存在多个起点。
说到这里,有必要重新申明一下:起点也是一种任务节点,也就说起点不是独立于工作流任务的,在流程启动的时候,其也需要完成某种特定的任务,以激活整个工作流的运转。
多起点的工作流模型,基本上有如下三种方式。
多起点方式一请参考图(1-2),起点A和起点B,它们都可以激活流程的运行,而且激活后,流程都会共同指向Task A。
所以,对于Task B来说,其不关心流程是如何激活的,其只关系从Task A是否正确的传递来正确的流程数据。
图(1-2)多起点方式二在方式二(如下图(1-3))中,起点A激活工作流后,导致流程沿着Task A——Task B——Task C方向流转。
而从起点B激活工作流后,Task A则被跳过。
这种方式,在现实中是极为少见的。
如果将Start B——Task B这条流程段与 Start A——Task B 这条流程段,分开来看。
则可以近似看作的两个“子流程”的选择性汇总(两选一,或多选一)的情况。
图(1-3)多起点方式三方式三(如下图(1-4)),虽然也存在多个起点,但是基本是按照一个统一流程方向运行的。
这是与方式二最大的区别所在。
在此,须要再此申明:一个起点(Start Node)同时也是一个任务节点(Task Node)。
参看图中的Task B/Start B节点。
此种方式,在现实中,还是有一定应用性的。
特别是在多个流程之间信息交互的时候,流程A发送消息数据,激活流程B的运行。
但是未必是从流程B的默认激活点激活,可能是从流程B的中途某个任务激活。
比如图中的Task B/Start B任务节点(同时也时流程起点)图(1-4)二、流程的激活模型上面我们看了工作流的起点模型。
也知道任何流程,都必须有起点,或者相对的起点。
一个流程被激活后,会从起点开始沿着预定的流程路线,有序或无序的往下进行(注意,我这里提到了“无序”二字,我将在后续讲解“无序”状态)。
所以,起点就是这个流程被激活的源头。
下面让我们来看看,一个流程被激活的方式,或者说一个起点,被激活的方式:从起点的激活方式,有如下两种方式:2.1 人工激活大多数的流程激活,都是因为人为的信息数据输入或产生。
比如一个订单处理流程,客户提交了订单信息(订单信息数据产生),则激活了订单处理流程的开始。
2.2 定时或限时激活在一个特定的时间,因为特定的情况,符合特定的条件,激活某个特定的流程(或任务)。
这种激活方式,在现实中很少单独出现,大多数情况,都因为在某一个流程中,因为在限定的时间内,因某项任务未达到预期的状态,而激活另外的任务或新的处理流程。
也就说,这种方式,是受外来因素影响的,而且大多与一些流程任务(或流程模式)一起出现。
举个定时激活的实例:比如,订单处理流程,限定5天内发货,那么定义在第三天的时候,如果没有接到发货通知,则激活一个催办信息(催办任务)。
这样流程系统,会在第三天的时候自动发出催办信息。
2.3 外界消息激活这种方式,大多是在多流程信息交互(或大小流程嵌套)应用中。
现在比较流行的业务流程整合/管理(BPM),基本上都涉及到这方面内容。
如下图所示,流程A,在结束的时候(在以下的所有图中,将采用红色框图,表示结束节点),会向流程B发送Message,以激活流程B的运行。
至于这个消息是Soap消息,还是通过消息中间件转发的Message,这就是不同的应用方式了。
一般现实应用中,都需要考虑JMS或WebService的应用接口。
从个人目前所实施过的工作流应用来说,大多还是采用Message Query方式居多。
虽然软件的发展,逐渐SOA(面向服务)化,但是WebService 的安全性或数据正确性,还有待进一步的发展,从这一方面说,比起消息中间件的高度安全性和消息正确性,WebService目前还是稍逊一筹。
其实,安全性和信息正确性,是很多应用客户非常关心的焦点。
但是,SOA化的发展是未来的趋势。
所以现在大多的应用都会提供JMS和WebService接口,或其他类似接口。
图(2-1)三、流程的运转模型这里将是本文最为核心的地方了,什么是工作流,也将在其运转模型中体现。
任何事物都是循序渐进的,由简单到复杂。
我们先来看看最为基本的集中运转模型3.1 基本运转模型串行(Sequence )串行,是最为简单,也最为容易理解的模型。
按照预定的任务列表(Task A,Task B,Task C ),有序的执行,如下图(3-1)所示。
图(3-1)自循环自循环的模型,主要用于表示:同一个任务节点,重复的执行多次。
图(3-2)如图中所显示。
“模式2”比“模式1”多了一个鉴别节点(Discriminator Node )。
这两种模式,在现实中应用的都较为广泛,其中“模式1”更多的偏向人为的选择,也就是说,在任务执行后,由人为的决定是否继续重复的执行这次任务;而“模式2”则更多的倾向于一个既定的规则,按照原有的规则,决定是否重复执行。
3.2 发散运转模型并行(Parallel )并行,就涉及到流程的分支概念。
就是说在流程运行过程中,因为不同的条件或情况,或者处理的业务需要多部门(多任务)分开处理,而产生了流程分支。
如下图所示图(3-3)流程在执行完任务A 后,因为需要,产生了两个并发执行的分支(A ——B 和A ——C )。
这两个分支之间是对等的,也是并行执行的。
有关上面的流程图,可能在以后的一些文章/文档中,大家会看到下面类似的图形图(3-4)虽然比上图多了一个And 选择器,但实际上,两图,表示的是同一个含义或模型。
所以大家在应用或读书的时候,可以长个心眼哦,自己学会实质性的分析。
独占式选择(Exclusive Choice)当一个任务处理完后,发现其后面可允许走多个分支流程,但只允许选择其中某一个分支运行。
这个选择是人为决策的,预先没有设点选择的规则。
图(3-5)鉴别式选择(Discriminator Choice)这同前面的“独占式选择”很相似,唯一不同点,就是多了一个鉴别器(Discriminator)。
当任务达到这个鉴别器的时候,鉴别器会根据当前流程所处的状态,对比预先设定的一些选择规则,自动判别接下来流程的流向,也就是自动根据条件,选择一个满足条件的分支运行。
图(3-6)鉴别器模式(有的可能叫选择器等等名字,表达的意思基本相同),在现实应用中较为广泛。
比如在订单申请流程中,设定一个依据数额判别流向的鉴别器,如果数额大于等于5000就走分支流程A,如果数额小于5000就走分支流程B。
抄送模型抄送模型,本身不是一个标准的工作流运转模型,但是在现实应用中,比比皆是。
它表达的意思是(请参考下图),存在主流程(A——C),在一个任务(A)执行完毕后,会继续执行主流程上下一个预定任务(C),但是同时也会激活另一任务(B)(或另外的流程)的执行,但是任务B 以及任务B的后续流程,不会对主流程运转造成影响。
请注意图中的A——B流程沿线,用的是灰色虚线表示,而且任务B也同样采用灰色表示。
图(3-7)来个举个电子办公系统中,经常遇到得例子说明一下:比如一个发文,在交司局会签的时候,可能会抄送一份给另外的司局备案,这个过程就或额外的激活一个不影响主会签流程的“抄送任务”,比如图中Task B。
发散模型说到这里,大家可再回过头参看一下并行模型(3.2.1节)。
发散和并行最大的区别就是,各个分支(branch)的流程状态(或流程数据):在并行模型中,分支状态(A-B)与分支状态(A-C)是大多数情况下是不相等的。
由任务A执行后的状态进行一定条件下的“拆分”,形成了两个分支(或多个分支)流程。
NET基础培训教程
.NET基础培训教目录C#基础 (1)2.2变量 (1)2.3常量 (5)2.4预定义数据类型 (5)2.5流控制 (11)2.6数组 (20)2.7命名空间 (21)2.8C#预处理器指令 (27)2.9C#编程规则 (29)2.10内容总结 (33)2.11独立实践 (33)对象和结构 (35)3.1类和结构 (35)3.2类和成员 (36)3.3构造函数 (44)3.4结构 (48)3.5部分类 (51)3.6内容总结 (56)3.7独立实践 (56)1C#基础2.1变量在C#中声明变量使用下述语法:datatype 变量名称;例如:int i;该语句声明int变量i。
声明i之后,就可以使用赋值运算符(=)给它分配一个值:i = 10;还可以在一行代码中声明变量,并初始化它的值:int i = 10;如果在一个语句中声明和初始化了多个变量,那么所有的变量都具有相同的数据类型:int x = 10, y =20; // x and y are both ints要声明类型不同的变量,需要使用单独的语句。
在多个变量的声明中,不能指定不同的数据类型:int x = 10;bool y = true;int x = 10, bool y = true; // 这是不符合语法规定的!注意上面例子中的//和其后的文本,它们是注释。
//字符串告诉编译器,忽略其后的文本。
本章后面会详细讨论代码中的注释。
变量的初始化C#在使用变量之前必须进行初始化。
否则系统会提示错误,我们来做一个例子演示一下变量的初始效果,见实例2。
例2:演示一个变量的初始化解决方案:◆启动VS,输入如下代码public static void Main(){int d;Console.WriteLine(d);}在编译这些代码时,会得到下面的错误消息:Use of unassigned local variable 'd'◆此例子说明变量在输出之前需要进行初始化。
.NET基础知识
1、问:请谈一谈二进制序列化和Xml序列化的特点。
二进制序列化和反序列化使用BinaryFormatter类,Xml序列化使用XmlSerializer类。
二进制序列化的特点是:无论是否是只读属性,所有成员都将被序列化;序列化的性能高。
Xml序列化的特点是:互操作性强;可读性强。
2、问:什么是浅拷贝?什么是深层拷贝?如何实现深层拷贝?浅拷贝(shallow copy)也叫影子拷贝,在.NET里所有对象的基类Object类里就定义了一个MemberwiseClone()方法来实现浅拷贝。
具体做法是创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。
如果字段是值类型的,则对该字段执行逐位复制。
如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。
在浅拷贝里会出现一个问题,那就是如果对对象A实行浅拷贝得到对象B,假设对象A中有引用类型变量M,一旦改变了M的值对象B中对应的变量值也会随之改变,这在有些情况下会产生不可预知的情况,为了解决这个问题,就需要实现深层拷贝(deep copy)。
实行深层拷贝之后,不管是A中值类型变量的值被复制到B中,连A中引用类型的字段的值也会被复制到B中,这样改变A中引用类型的值就不会反应到B中对应的字段上去。
如何实现深层拷贝呢?在MSDN中建议我们实现ICloneable来达到实现创建深层副本或者浅表副本的目的,在实际中一般都是采用序列化A,然后将序列化的结果反序列化得到B来实现深层拷贝的目的。
3、问:在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 引入名称空间或者使用非托管资源new 新建实例或者隐藏父类方法new 约束用于在泛型声明中约束可能用作类型参数的参数的类型4、问:什么是SQL注入,如何防止?请举例说明。
如何预防答:利用sql关键字对网站进行攻击。
使用参数化方式,关键字过滤,字符编码5、什么是虚函数?什么是抽象函数?答:虚函数:没有实现的,可由子类继承并重写的函数。
.NET初学者架构设计指南(二)OO设计初次见面
.NET初学者架构设计指南(二)OO设计初次见面我使用OO技术第一次设计软件的时候,犯了一个设计者所能犯的所有错误。
那是一个来自国外的外包项目,外方负责功能设计,我们公司负责程序设计、编码和测试。
第一个重要的错误是,我没有认真的把设计说明书看明白。
功能点设计确实有一些问题,按照他们的设计,一个重要的流程是无法实现的。
于是我在没有与投资方沟通的情况下,擅自改动了设计,把一个原本在Linux系统上开发的模块改到了Windows系统上。
结果流程确实是实现了,但是很不幸,根本不符合他们的需要,比起原先的设计差的更多。
在询问了这个流程的设计意图之后,我也清楚了这一点。
对方的工程师承认了错误,但是问题是:“为什么不早说啊,我们都跟领导讲过了产品的构架,也保证了交货时间了,现在怎么去说啊?”。
他们设计的是一个苹果,而我造了一个桔子出来。
最后和工程师商议的结果是:先把桔子改成设计书上的苹果,按时交货,然后再悄悄的改成他们真正需要的香蕉。
的这时候距离交货的时间已经不足三天了,于是我每天加班工作到天明,把代码逐行抽出来,用gcc 编译调试。
好在大部分都是体力活,没有什么技术含量,即使在深夜大脑半休眠的情况下仍然可以接着干。
项目中出现的另外一个错误是:我对工作量的估计非常的不准确。
在第一个阶段的时候,按照功能设计说明书中的一个流程,我做了一个示例,用上了投资方规定的所有的技术。
当我打开浏览器,看到页面上出现了数据库里的“T om,Jerry,王小帅”,就愉快的跑到走廊上去呼吸了一口新鲜空气,然后乐观的认为:设计书都已经写好了,示例也做出来了,剩下的事情肯定就象砍瓜切菜一样了。
不就是把大家召集起来讲讲设计书,看看示例,然后扑上去开工,然后大功告成。
我为每个画面分配的编码工作量是三个工作日。
结果却是,他们的设计并不完美,我的理解也并不正确,大家的思想也并不一致。
于是我天天召集开会,朝令夕改,不断返工。
最后算了一下,实际上写完一个画面用的时间在十个工作日以上。
(完整word版).Net的工作原理
一.Asp。
Net 的工作原理:1。
客户端通过浏览器向服务器请求Web页。
2。
Web服务器(IIS)寻找指令(.aspx文件)3。
调用动态链接库Aspnet_isapi.dll处理.aspx文件,把。
aspx文件发送给(FrameWork中)公共语言运行时进行编译4.公共语言运行时对代码进行编译,生成html流5.把html流返回给IIS服务器,然后响应给客户端浏览器6。
客户端浏览器解释Html流,显示页面内容二. 的页面的执行过程1。
浏览器发送Http请求到web服务器(IIS)2.(如果IIS被Asp。
Net服务注册过)aspnet_isapi.dll就能筛选IIS不能处理的文件,把它交给公共语言运行时进行编译。
3.公共语言运行时所编译的对象为访问的页面类的实例(客户端浏览器请求的每个.aspx页面都对应个一个类,这个类继承System。
Web。
UI。
Page类)三.ISAPI:Internet时代,静态页面逐渐的不能满足客户端用户的需求,于是开发者需要扩充Web服务器的功能。
Web服务器厂商设计了不同的解决方案,但是都遵循了一个主题:允许向Web服务器插入某些组件扩充Web服务器的功能。
因此所有的Web服务器都允许开发者自己建立并插入组件增强Web服务器的功能。
微软的组件是:ISAPI(Internet Server:实际上是提供了一些技术,允许开发者自己向Web服务器插入某些组件来扩充功能。
ISAPI是一种重要的技术,它允许我们增强与ISAPI兼容的Web服务器的能力。
IIS就是与ISAPI兼容的Web服务器。
)IIS就是Web服务器。
ISAPI技术通过2种方式来增强web服务器的功能:1.ISAPI扩展:(扩展是通过DLL文件来实现的,如:aspnet_isapi.dll)是使用Win32动态链接库来实现的。
可以把ISAPI看成普通的应用程序,目标就是处理Asp。
Net 的http请求。
NET基础培训教程
.NET基础培训教目录C#基础 (1)2.2变量 (1)2.3常量 (5)2.4预定义数据类型 (5)2.5流控制 (11)2.6数组 (20)2.7命名空间 (21)2.8C#预处理器指令 (27)2.9C#编程规则 (29)2.10内容总结 (33)2.11独立实践 (33)对象和结构 (35)3.1类和结构 (35)3.2类和成员 (36)3.3构造函数 (44)3.4结构 (48)3.5部分类 (51)3.6内容总结 (56)3.7独立实践 (56)1C#基础2.1变量在C#中声明变量使用下述语法:datatype 变量名称;例如:int i;该语句声明int变量i。
声明i之后,就可以使用赋值运算符(=)给它分配一个值:i = 10;还可以在一行代码中声明变量,并初始化它的值:int i = 10;如果在一个语句中声明和初始化了多个变量,那么所有的变量都具有相同的数据类型:int x = 10, y =20; // x and y are both ints要声明类型不同的变量,需要使用单独的语句。
在多个变量的声明中,不能指定不同的数据类型:int x = 10;bool y = true;int x = 10, bool y = true; // 这是不符合语法规定的!注意上面例子中的//和其后的文本,它们是注释。
//字符串告诉编译器,忽略其后的文本。
本章后面会详细讨论代码中的注释。
变量的初始化C#在使用变量之前必须进行初始化。
否则系统会提示错误,我们来做一个例子演示一下变量的初始效果,见实例2。
例2:演示一个变量的初始化解决方案:◆启动VS,输入如下代码public static void Main(){int d;Console.WriteLine(d);}在编译这些代码时,会得到下面的错误消息:Use of unassigned local variable 'd'◆此例子说明变量在输出之前需要进行初始化。
.netcore基础知识
.netcore基础知识1.IOC(转:)IoC的全名Inverse of Control,翻译成中⽂就是“控制反转”或者“控制倒置”。
控制反转也好,控制倒置也罢,它体现的意思是控制权的转移,即原来控制权在A⼿中,现在需要B来接管。
那么具体对于软件设计来说,IoC所谓的控制权的转移具有怎样的体现呢?要回答这个问题,就需要先了解IoC的C(Control)究竟指的是怎样⼀种控制。
对于我们所在的任何⼀件事,不论其⼤⼩,其实可以分解成相应的步骤,所以任何⼀件事都有其固有的流程,IoC涉及的所谓控制可以理解为“针对流程的控制我们通过⼀个具体事例来说明传统的设计在采⽤了IoC之后针对流程的控制是如何实现反转的。
⽐如说现在设计⼀个针对Web的MVC类库,我们不妨将其命名为MvcLib。
简单起见,这个类库中只包含如下这个同名的静态类public static class MvcLib{public static Task ListenAsync(Uri address);public static Task<Request> ReceiveAsync();public static Task<Controller> CreateControllerAsync(Request request);public static Task<View> ExecuteControllerAsync(Controller controller);public static Task RenderViewAsync(View view);}MvcLib提供了如上5个⽅法帮助我们完成整个HTTP请求流程中的5个核⼼任务。
具体来说,ListenAsync⽅法启动⼀个监听器并将其绑定到指定的地址进⾏HTTP请求的监听,抵达的请求通过ReceiveAsync⽅法进⾏接收,我们将接收到的请求通过⼀个Request对象来表⽰。
dotNET入门教程_2编程基础
使用
直接使用:<枚举类型名>.<枚举值>
18
Data Type
常量 - 枚举
类型转换
枚举类型 >> 基本类型:
基本类型 >> 枚举类型:
基本类型 >> 枚举字符串:
19
Data Type
类型转换 - 简单的类型转换
概念
大自然中的“冰”和“水”在特定温度下是可以相互转换的 同理,存储在内存中的数据,也可以更改其数据类型
声明与赋值
变量声明:使用变量类型(数据类型)和变量名称(标识符) 变量赋值:使用“=”运算符 * 变量在使用之前必须经过初始化,即初始赋值
7
Data Type
变量 - 什么是数据类型
概念
string str = “Hello DevilTeam”; 中的“string”即为一个数据类型 计算机内部存储的数据只有 0 和 1 实际应用的数据都是以0、1的形式存放在计算机中 数据类型就是一种约定,告诉程序如何去理解0、1组成的数据串
分类
字面值,如 1.2M,true,”hello” 常变量,如 public const string ABC = "English and Other Language"; 枚举,如 enum SizeType {Small , Large },然后 rge
14
Data Type
分支结构语法,三元运算符、if语句、switch语句等 switch语句中的常量
循环 Looping
循环结构语法、do循环、while循环、for循环 循环中断及跳转break、continue、return、goto
ASP_NET入门基础知识
ASP语言形成的。
1_基础知识
ASP包含三方面含义:
ASP的含义从字面上说,ASP包含三方面含义:
(1)、Active:
ASP使用了Microsoft的ActiveX技术。ActiveX( COM)技术是现在Microsoft软件的重要基础。它采 用封装对象,程序调用对象的技术,简化编程,加强 程序间合作。ASP本身封装了一些基本组件和常用组 件,有很多公司也开发了很多实用组件。只要你可以 在服务器上安装这些组件,通过访问组件,你就可以 快速、简易地建立自己的WEB应用。
1_基础知识
2. PHP概述
PHP是Rasmus Lerdorf+1994年提出来的。它开 始是一个用Perl语言编写的简单程序,Rasmus Lerdorfffi它来和访问他主页的人保持联系。当时只是 作为一个个人工具,仅提供留言本、计数器等简单的 功能。后来逐渐传开,Rasmus又重写了整个解析器, 并命名为 PHP v1.0,当然功能还不是十分完善。此后 ,其他程序员开始参与PHP源码的编写,1997年Zeev Suraski和Andi Gutamns又重新编写了解析器,经过此 次重写,功能基本完善,形成了今天流行的PHP3的雏 形。
1_基础知识
1.1 网络基础知识(续1) 3) 从网络通信角度。它采用了统一的TCP/IP通信 协议,构成数据通信网。 4) 从网络管理角度。在国外文献中,人们称它是 “没有领导、没有法律、没有政治、没有军队……”, 总之是不可思议的组织结构或社会。 互联网的主要技术特点有:TCP/IP协议(Internet 的核心和基础);路由器加专线技术;分层的分布式结 构;无连接的分组交换技术;层次结构的域名、网络 管理技术。
1_基础知识
1.1.5 静态网页和动态网页(续1)
.NET基础剖析
使用实现页面和代码分离演示
了解B/S应用程序结构 了解功能 创建虚拟目录 文件结构 界面两大基本控件 Label、Button、TextBox Page_Load事件 事件
用户界面
<input type="button" id="Submit" runat="server" value="单击"/>
代码与 HTML 设计和文本分离
了解B/S应用程序结构 了解功能 创建虚拟目录 文件结构 界面两大基本控件 Label、Button、TextBox Page_Load事件 事件
添加虚拟目录方法一2-1
创建虚拟目录步骤如下:
成功之路
第五课 基础
回顾
掌握以下知识点
C#中的类和对象 掌握属性 掌握方法重载 掌握使用访问修饰符 了解类的构造函数 掌握this关键字 掌握继承 理解如何使用 private 和 protected 封装数据
.NET关键词汇
课程目标
了解B/S应用程序结构 了解功能 创建虚拟目录 文件结构 界面两大基本控件 Label、Button、TextBox Page_Load事件 事件
客户端与服务器通过HTTP协议进行通信
获取信息 发出请求
HTTP是无状态协议
<asp:button id= "Submit" onclick="click_button" text="单击我" runat="server"/>
Web服务器控件优缺点
.NET初学者架构设计指南(一)Helloworld的时代
.NET初学者架构设计指南(一)Helloworld的时代中学的时候,学校里开设了电脑课。
当时的电脑还是一种比较希罕的东西,学校里的电脑一共就十几台,还专门找了一个大厅摆放这些机器。
厅里面铺着厚厚的地毯,整天都拉着重重的窗帘。
每次上课前一天,我们需要沐浴更衣,剪好指甲。
上课时大家都穿上鞋套,排好队伍,列队进入机房。
然后各位同学坐在座位上,在老师的指挥下,拿出一张五英寸的软磁盘,磁盘里安装着DOS操作系统,插入电脑的A驱动器。
然后依次打开显示器、主机电源,在一阵吱吱声中,等待着电脑的启动,进入一个充满了幻想的神奇世界。
我就是在那个时候写出了第一行程序。
当时我们学的是一种叫做GWBASIC的语言,这是BASIC语言的一个分支。
BASIC是一种非常简单的交互式程序设计语言。
编码人员需要为每一行代码编制一个行号。
行号是一个自然数,为了日后调试的需要,一般都是在最初编制行号的时候故意留下富余,不是按照1、2、3……的方式编制行号,而是按照10、20、30……的形式。
程序输入完毕以后,运行“RUN”命令,编译器按照行号的顺序,解释执行程序。
这样的编程方式太简单了,只要记住几个流程控制、输入输出的关键字,就可以写出一个简单的程序。
那段时间我每天都在想着把平时遇到的东西用程序写出来,多元多次的方程式、猜数字的游戏、三角函数曲线……先把编程的思路记在纸上,每个星期上课的时候再在电脑上写出来,调试运行。
调试方式也非常简单,就是把数值往屏幕上PRINT,然后运行查看结果。
写完了之后运行“SAVE”命令,把代码保存到软盘里。
中学时期应该是一个人的思维最灵活的时期,以后的时期经验逐渐的丰富,但是学习新知识的能力实际上是在走下坡路。
除非特地去培养,很多方面的知识也就停留在中学的水平。
比如对于一个搞计算机的专业人员来说,他的历史、语文、物理、化学知识很可能就永远的停留在中学时期的水平。
那段时间我疯狂的写着程序,最大的愿望就是家里能有一台电脑,安装着GWBASIC的编译器,我可以每天把自己关在屋子里,用GWBASIC写出超级玛丽,或者坦克大战一样的游戏。
