ASP.NET Web Page应用深入探讨

ASP.NET Web Page应用深入探讨第1/2页 一、服务器脚本基础介绍   首先,我们先复习一下Web服务器页面的基本执行方式:   1、客户端通过在浏览器的地址栏敲入地址来发送请求到服务器端   2、服务器接收到请求之后,发给相应的服务器端页面(也就是脚本)来执行,脚本产生客户端的响应,发送回客户端   3、客户端浏览器接收到服务器传回的响应,对Html进行解析,将图形化的网页呈现在用户面前   对于服务器和客户端的交互,通常通过下面几种主要方式:   1、Form:这是最主要的方式,标准化的控件来获取用户的输入,Form的提交将数据发送给服务器端处理   2、QueryString:通过在Url后面带参数达到将参数传送给服务器,这种方式 立即下载

一、服务器脚本基础介绍

首先,我们先复习一下Web服务器页面的基本执行方式:

1、客户端通过在浏览器的地址栏敲入地址来发送请求到服务器端

2、服务器接收到请求之后,发给相应的服务器端页面(也就是脚本)来执行,脚本产生客户端的响应,发送回客户端

3、客户端浏览器接收到服务器传回的响应,对Html进行解析,将图形化的网页呈现在用户面前

对于服务器和客户端的交互,通常通过下面几种主要方式:

1、Form:这是最主要的方式,标准化的控件来获取用户的输入,Form的提交将数据发送给服务器端处理

2、QueryString:通过在Url后面带参数达到将参数传送给服务器,这种方式其实跟Get方式的Form是一样的

3、Cookies:这是一种比较特殊的方式,通常用于用户身份的确认

二、ASP.Net简介

传统的服务器脚本语言,如ASP、JSP等,编写服务器脚本的方式大同小异,都是在Html中嵌入解释或编译执行的代码,由服务器平台执行这些代码来生成Html;对于这类似的脚本,页面的生存周期实际上很简单,就是从开头至末尾,执行完所有的代码,当然用Java编写的Servlet可以编写更复杂的代码,但是从结构上看,和JSP没什么区别。

ASP.Net的出现,打破了这种传统;ASP.Net采用了CodeBehind技术和服务器端控件,加入了服务器端的事件的概念,改变了脚本语言编写的模式,更加贴近Window编程,使Web编程更加简单、直观;但是我们要看到,ASP.Net本身并没有改变Web编程的基本模式,只是封装了一些细节、提供了一些易用的功能,使代码更容易编写和维护;从某种程度上来说,将服务器端执行的方式复杂化了,这就是我们今天要讨论的主体:ASP.NetWebPage的生存周期。

三、ASP.Net请求处理模式

我们说,ASP.Net的WebPage并没有脱离Web编程的模式,所以它仍然是以请求->接收请求->处理请求->发送响应这样的模式在工作,每一次与客户端的交互都会引发一次新的请求,所以一个WebPage的生命周期是以一次请求为基础的。

当IIS收到客户端的请求的时候,会将请求交给aspnet_wp这个进程来处理,这个进程会查看请求的应用程序域是否存在,如果不存在则会创建一个,然后会创建一个Http运行时(HttpRuntime)来处理请求,这个运行时“为当前应用程序提供一组ASP.NET运行时服务”(摘自MSDN)。

HttpRuntime在处理请求的时候,会维护一系列的应用程序实例,也就是应用程序的Global类(global.asax)的实例,这些实例在没有请求的时候,会存放在一个应用程序池中(实际上应用程序池由另一个类来维护,HttpRuntime只是简单的调用),每接收到一个请求,HttpRuntime都会获取一个闲置的实例来处理请求,这个实例在请求结束前不会处理其他的请求,处理完毕之后,它又会回到池中,“一个实例在其生存期内被用于处理多个请求,但它一次只能处理一个请求。”(摘自MSDN)

当应用程序实例处理请求的时候,它会创建请求页面类的实例,执行它的ProcessRequest方法来处理请求,这个方法也就是WebPage生命周期的开始。

四、Aspx页面与CodeBehind

在深入了解页面的生命周期之前,我们先来探讨一些Aspx与CodeBehind之间的关系。

<%@Pagelanguage="c#"Codebehind="WebForm.aspx.cs"Inherits="MyNamespace.WebForm"%>

相信使用过CodeBehind技术的朋友,对ASPX顶部的这句话应该是非常熟悉了,我们来一项一项的分析它:

Pagelanguage="c#"这个就不用多说了吧

Codebehind="WebForm.aspx.cs"这一句表示绑定的代码文件

Inherits="MyNamespace.WebForm"这句非常重要,它表示页面继承的类名称,也就是CodeBehind的代码文件中的类,这个类必须从System.Web.WebControls.Page派生

从上面我们可以分析出,实际上CodeBehind中的类就是页面(ASPX)的基类,到这里,可能有些朋友要问了,在编写ASPX的时候,完全是按照ASP的方式,在Html中嵌入代码或者嵌入服务器控件,没有看到所谓“类”的影子啊?

这个问题实际上并不复杂,各位使用ASP.Net编程的朋友可以到你们的系统盘:/WINDOWS/Microsoft.NET/Framework/<版本号>/TemporaryASP.NETFiles这个目录下,这个下面就放了所有本机上存在的ASP.Net应用程序的临时文件,子目录的名称就是应用程序的名称,然后再下去两层(为了保证唯一,ASP.Net自动产生了两层子目录,并且子目录名称是随机的),然后我们会发现有很多类似:“yfy1gjhc.dll”、“xeunj5u3.dll”这样的链接库以及“komee-bp.0.cs”、“9falckav.0.cs”这样的源文件,实际上这就是ASPX被ASP.Net动态编译后的结果,打开这些源文件我们可以发现:

publicclassWebForm_aspx:MyNamespace.WebForm,System.Web.SessionState.IRequiresSessionState

这就印证了我们前面的说法,ASPX是代码绑定类的子类,它的名称是ASPX文件名加上“_aspx”后缀,通过研究这些代码我们可以发现,实际上所有aspx中定义的服务器控件都是在这些代码中生成的,然后动态产生这些代码的时候,把原来在ASPX中嵌入的代码写在了相应的位置。

当某个页面第一次被访问的时候,Http运行时就会使用一个代码生成器去解析ASPX文件并生成源代码并编译,然后以后的访问就直接调用编译后的dll,这也是为什么ASPX第一次访问的时候非常慢的原因。

解释了这个问题,我们再来看另一个问题。我们在使用代码绑定的时候,在设计页面拖一个控件,然后切换到代码视图,就可以直接在Page_Load中使用这个控件了,既然控件是在子类中产生的,那为什么在父类中可以直接使用呢?

实际上我们可以发现,每当用VS.Net拖一个控件到页面上,代码绑定文件中总是会类似这样的添加一个声明:

protectedSystem.Web.WebControls.ButtonButton1;

我们可以发现这个字段被声明成protected,而且名字与ASPX中控件的ID一致,仔细想一想,这个问题就迎刃而解了。我们前面提到ASPX的源代码是被生成器动态生成和编译的,生成器会产生动态生成每一个服务器控件的代码,在生成的时候,它会检查父类有没有声明这个控件,如果声明了,它会添加类似下面的一句代码:

this.DataGrid1=__ctrl;

这个__ctrl就是生成该控件的变量,这时候它就把控件的引用赋给了父类中相应的变量,这也是为什么父类中的声明必须为protected(实际上也可以为public),因为要保证子类能够调用。

然后在执行Page_Load的时候,因为这时候父类的声明已经被子类中的初始化代码赋了值,所以我们就可以使用这个字段来访问对应的控件,了解了这些,我们就不会犯在代码绑定文件中的构造器里使用控件,造成空引用的异常的错误了,因为构造器是最先执行的,这时候子类的初始化还没有开始,所以父类中的字段是空值,至于子类是什么时候初始化我们放到后面讨论。

五、页面生存周期

现在回到第三个标题中讲到的内容,我们讲到了HttpApplication的实例接收请求,并创建页面类的实例,实际上这个实例也就是动态编译的ASPX的类的一个实例,上一个标题中我们了解到ASPX实际上是代码绑定中类的子类,所以它继承了所有的protected方法。

现在我们来看看VS.Net自动生成的CodeBehind类的代码,以此来开始我们对页面生命周期的探讨:

#regionWebFormDesignergeneratedcode

overrideprotectedvoidOnInit(EventArgse)
{
 //
 //CODEGEN:该调用是ASP.NETWeb窗体设计器所必需的。
 //
 InitializeComponent();
 base.OnInit(e);
}

///<summary>
///设计器支持所需的方法-不要使用代码编辑器修改
///此方法的内容。
///</summary>

privatevoidInitializeComponent()
{
 this.DataGrid1.ItemDataBound+=newSystem.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemDataBound);

 this.Load+=newSystem.EventHandler(this.Page_Load);
}

#endregion

这个就是使用VS.Net产生的Page的代码,我们来看,这里面有两个方法,一个是OnInit,一个是InitializeComponent,后者被前者调用,实际上这就是页面初始化的开始,在InitializeComponent中我们看到了控件的事件声明和Page的Load声明。

下面是从MSDN中摘录的一段描述和一个页面生命周期方法和事件触发的顺序表:

“每次请求ASP.NET页时,服务器就会加载一个ASP.NET页,并在请求完成时卸载该页。页及其包含的服务器控件负责执行请求并将HTML呈现给客户端。虽然客户端和服务器之间的通讯是无状态的和断续的,但是必须使客户感觉到这是一个连续执行的过程。”

“这种连续性假象是由ASP.NET页框架、页及其控件实现的。回发后,控件的行为必须看起来是从上次Web请求结束的地方开始的。虽然ASP.NET页框架可使执行状态管理相对容易一些,但是为了获得连续性效果,控件开发人员必须知道控件的执行顺序。控件开发人员需要了解:在控件生命周期的各个阶段,控件可使用哪些信息、保持哪些数据、控件呈现时处于哪种状态。例如,在填充页上的控件树之前控件不能调用其父级。”“下表提供了控件生命周期中各阶段的高级概述。有关详细信息,请点击表中的链接。”

阶段控件需要执行的操作要重写的方法或事件
初始化初始化在传入Web请求生命周期内所需的设置。请参阅处理继承的事件。Init事件(OnInit方法)
加载视图状态在此阶段结束时,就会自动填充控件的ViewState属性,详见维护控件中的状态中的介绍。控件可以重写LoadViewState方法的默认实现,以自定义状态还原。LoadViewState方法
处理回发数据处理传入窗体数据,并相应地更新属性。请参阅处理回发数据。
注意只有处理回发数据的控件参与此阶段。LoadPostData方法(如果已实现IPostBackDataHandler)
加载执行所有请求共有的操作,如设置数据库查询。此时,树中的服务器控件已创建并初始化、状态已还原并且窗体控件反映了客户端的数据。请参阅处理继承的事件。Load事件
(OnLoad方法)
发送回发更改通知引发更改事件以响应当前和以前回发之间的状态更改。请参阅处理回发数据。

注意只有引发回发更改事件的控件参与此阶段。RaisePostDataChangedEvent方法
(如果已实现IPostBackDataHandler)

处理回发事件处理引起回发的客户端事件,并在服务器上引发相应的事件。请参阅捕获回发事件。

注意只有处理回发事件的控件参与此阶段。RaisePostBackEvent方法
(如果已实现IPostBackEventHandler)

预呈现在呈现输出之前执行任何更新。可以保存在预呈现阶段对控件状态所做的更改,而在呈现阶段所对的更改则会丢失。请参阅处理继承的事件。PreRender事件
(OnPreRender方法)
保存状态在此阶段后,自动将控件的ViewState属性保持到字符串对象中。此字符串对象被发送到客户端并作为隐藏变量发送回来。为了提高效率,控件可以重写SaveViewState方法以修改ViewState属性。请参阅维护控件中的状态。SaveViewState方法
呈现生成呈现给客户端的输出。请参阅呈现ASP.NET服务器控件。Render方法
处置执行销毁控件前的所有最终清理操作。在此阶段必须释放对昂贵资源的引用,如数据库链接。请参阅ASP.NET服务器控件中的方法。
Dispose方法
卸载执行销毁控件前的所有最终清理操作。控件作者通常在Dispose中执行清除,而不处理此事件。UnLoad事件(OnUnLoad方法)

从这个表里面我们可以清楚的看到一个Page从装载到卸载之间调用的方法和触发的时间,接下来我们就深入的对其进行一些分析。

看了上面的表,细心的朋友可能要问了,既然OnInit是页面生命周期的开始,而我们在上一讲中谈到控件在子类中被创建,那么在这里实际上在InitializeComponent方法中我们已经可以使用父类中声名的字段了,那么就意味着子类的初始化更在这之前?

在第三个标题中我们讲到了页面类的ProcessRequest才是真正意义上的页面声明周期的开始,这个方法是由HttpApplication调用的(其中调用的方式比较复杂,有机会单独撰文来讲解),一个Page对请求的处理就是从这个方法开始,通过反编译.Net类库来查看源代码,我们发现在System.Web.WebControls.Page的基类:System.Web.WebControls.TemplateControl(它是页面和用户控件的基类)中定义了一个“FrameworkInitialize”虚拟方法,然后在Page的ProcessRequest中最先调用了这个方法,在生成器生成的ASPX的源代码中我们发现了这个方法的踪影,所有的控件都在这个方法中被初始化,页面的控件树就在这个时候产生。

接下来的事情就简单了,我们来逐步分析页面生命周期的每一项:

1、初始化

初始化对应Page的Init事件和OnInit方法。

如果要重写,MSDN推荐的方式是重载OnInti方法,而不是增加一个Init事件的代理,这两者是有差别的,前者可以控制调用父类OnInit方法的顺序,而后者只能在父类的OnInit后执行(实际上是在OnInit里面被调用的)。

2、加载视图状态

这是个比较重要的方法,我们知道,对于每次请求,实际上是由不同的页面类实例来处理的,为了保证blicvirtualboolostDataKey是标识控件的关键字(也就是postCollection中的Key),postCollection是包含回发数据的集合,我们可以重写这个方法,然后检查回发的数据是否发生了变化,如果是则返回一个True,“如果控件状态因回发而更改,则LoadPostData返回true;否则返回false。页框架跟踪所有返回true的控件并在这些控件上调用RaisePostDataCh个方法是System.Web.WebControls.Control中定义的,也是所有需要处理事件的自定义控件需要处理的方法,对于我们今天讨论的Page来说,可以不用管它。

3、处理回发数据

这个方法是用来检查客户端发回的控件数据的状态是否发生了改变。方法的原型:

publicvirtualboolLoadPostData(stringpostDataKey,NameValueCollectionpostCollection)

postDataKey是标识控件的关键字(也就是postCollection中的Key),postCollection是包含回发数据的集合,我们可以重写这个方法,然后检查回发的数据是否发生了变化,如果是则返回一个True,“如果控件状态因回发而更改,则LoadPostData返回true;否则返回false。页框架跟踪所有返回true的控件并在这些控件上调用RaisePostDataChangedEvent。”(摘自MSDN)

这个方法是System.Web.WebControls.Control中定义的,也是所有需要处理事件的自定义控件需要处理的方法,对于我们今天讨论的Page来说,可以不用管它。

4、加载

加载对应Load事件和OnLoad方法,对于这个事件,相信大多数朋友都会比较熟悉,用VS.Net生成的页面中的Page_Load方法就是响应Load事件的方法,对于每一次请求,Load事件都会触发,Page_Load方法也就会执行,相信这也是大多数人了解ASP.Net的第一步

Page_Load方法响应了Load事件,这个事件是在System.Web.WebControl.Control类中定义的(这个类是Page和所有服务器控件的祖宗),并且在OnLoad方法中被触发。

很多人可能碰到过这样的事情,写了一个PageBase类,然后在Page_Load中来验证用户信息,结果发现不管验证是否成功,子类页面的Page_Load总是会先执行,这个时候很可能留下一些安全性的隐患,用户可能在没有得到验证的情况下就执行了子类中的Page_Load方法。

出现这个问题的原因很简单,因为Page_Load方法是在OnInit中被添加到Load事件中的,而子类的OnInit方法中是先添加了Load事件,然后再调用base.OnInit,这样就造成了子类的Page_Load被先添加,那么先执行了。

解决这个问题也很简单,有两种方法:

1)在PageBase中重载OnLoad方法,然后在OnLoad中验证用户,然后调用base.OnLoad,因为Load事件是在OnLoad中触发,这样我们就可以保证在触发Load事件之前验证用户。

 2)在子类的OnInit方法中先调用base.OnInit,这样来保证父类先执行Page_Load

 5、发送回发更改通知

 这个方法对应第3步的处理回发数据,如果处理回发数据返回True,页面框架就会调用此方法来触发数据更改的事件,所以自定义控件的回发数据更改事件需要在此方法中触发。

 同样这个方法对于Page来说,没有太大的用处,当然你也可以在Page的基础上自己定义数据更改的事件,这当然也是可以的。

 6、处理回发事件

 这个方法是大多数服务器控件事件引发的地方,当请求中包含控件事件触发的信息时(服务器控件的事件是另一个论题,我会在不久将来另外撰文讨论),页面控件会调用相应控件的RaisePostBackEvent方法来引发服务器端的事件。

 这里又引出一个常见的问题:

经常有网友问,为什么修改提交后的数据并没有更改

多数的情况都是他们没有理解服务器事件的触发流程,我们可以看出,触发服务器事件是在Page的Load之后,也就是说页面会先执行Page_Load,然后才会执行按钮(这里以按钮为例)的点击事件,很多朋友都是在Page_Load中绑定数据,然后在按钮事件中处理更改,这样做有一个毛病,Page_Load永远都是在按钮事件之前执行,那么意味着数据还没来得及更改,Page_Load中的数据绑定的代码就先执行了,原有的数据又赋给了控件,那么执行按钮事件的时候,实际上获得的是原有的数据,那么更新当然就没有效果了。

更改这个问题也非常简单,比较合理的做法是把数据绑定的代码写成一个方法,我们假设为BindData:

privatevoidBindData()
{
 //绑定数据
}

然后修改PageLoad:

privatevoidPage_Load(objectsender,EventArgse)
{
 if(!IsPostBack)
 {
BindData();//在页面第一次访问的时候绑定数据
 }
}

最后在按钮事件中:

privateButton1_Click(objectsender,EventArgse)
{
 //更新数据
 BindData();//重新绑定数据
}

7、预呈现

最终请求的处理都会转变为发回服务器的响应,预呈现这个阶段就是执行在最终呈现之前所作的状态的更改,因为在呈现一个控件之前,我们必须根据它的属性来产生Html,比如Style属性,这是最典型的例子,在预呈现之前,我们可以更改一个控件的Style,当执行预呈现的时候,我们就可以把Style保存下来,作为呈现阶段显示Html的样式信息。

8、保存状态

这个阶段是针对加载状态的,我们多次提到,请求之间是不同的实例在处理,所以我们需要把本次的页面和控件的状态保存起来,这个阶段就是把状态写入ViewState的阶段。

9、呈现

到这里,实际上页面对请求的处理基本就告一段落了,在Render方法中,会递归整个页面的控件树,依次调用Render方法,把对应的Html代码写入最终响应的流中。

10、处置

实际上就是Dispose方法,在这个阶段会释放占用的资源,例如数据库连接。

11、卸载

最后,页面会执行OnUnLoad方法触发UnLoad事件,处理在页面对象被销毁之前的最后处理,实际上ASP.Net提供这个事件只是设计上的考虑,通常资源的释放都会在Dispose方法中完成,所以这个方法也变成鸡肋了。

我们简单的介绍了页面的生存周期,对于服务器端事件的处理做了不太深入的讲解,今天主要是想大家了解页面执行的周期,对于服务器控件的事件和生存期我会在后续在写一些文章来探讨。

这些内容是我在学习ASP.Net的时候对Page研究的一些心得,具体的细节没有很详细的探讨,更多的内容请大家参考MSDN,但是我举了一些初学者常犯的错误和出现错误的原因,希望可以给大家带来启发。
ISO7816协议深度解析-简单易懂协议详解(一)-- 复位,字符帧,及ATR 1. 摘要 IC卡必须支持T=0或T=1的协议,但不是同时支持这两种协议,而终端则必须同时支持T=0和T=1的协议。 • T=0通讯协议是异步半双工字符传输协议; • T=1通讯协议是异步半双工块传输协议; 在ISO7816-3标准中,具体规定了这两种协议:T0和T1。 IC卡所用的协议在TD1中指定,如果在复位应答信息中没有TD1,则表示用T=0的协议进行通讯。在复位应答后,IC卡和终端之间即用IC卡指定的协议进行通讯。 2. 硬件接口 1)VCC:电源输入(A类:5V, B类:3V) 2)GND:地 3 阅读详情

相关推荐

从零开始 使用OMNET++结合VEINS,INET和SUMO的联合仿真

搭建仿真的环境,导入VEINS和INET开源库,使用INET库中提供的网络协议和功能模型来模拟通信协议和网络功能,使用SUMO创建道路网络和车辆轨迹,并导出到OMNeT++中 在OMNeT++中使用VEINS通过socket和SUMO连接,借助VEINS实现的TRACI接口来设置车辆相关的行为和场景,最后在OMNET++中结合VEINS,SUMO和INET运行联合仿真实验,并分析车辆在遇到紧急情况下的通信状况和具体行为

mjmmm的博客 1万+

ASP.NET之Web Pages

ASP.NET 三种编程模型 Web Pages、 Web Forms 和 MVC (Model, View, Controller) Web Pages 是最简单的 ASP.NET 网页开发编程模型。它提供了一种简单的方法将 HTML、CSS、JavaScript 以及服务器代码结合起来: 易于学习、阅读和使用 围绕单一网页进行构建 类似 PHP 和 ASP 服务器脚本使用

一个IT菜鸟的自白 3873

SA8155 QNX显示框架与WFD配置实战:从黑屏排查到高可用设计

智能座舱中,车载显示系统的稳定性直接关系到驾驶安全。QNX作为高安全性的操作系统,在座舱仪表、ADAS等关键域中承担着确定性调度与隔离职责,其图形体系Screen与显示输出框架WFD协同工作,构成从应用渲染到面板点亮的完整链路。WFD配置涉及时序、通道映射与行为控制,任何参数偏差或加载异常都可能导致黑屏、花屏等故障。为保障系统可用性,需结合心跳监控、日志采集、通路重试与备份显示切换等策略,构建兼具快速感知与恢复能力的防御体系。本文以SA8155平台为例,深入拆解QNX显示框架的架构与WFD配置要点,结合一次

weixin_29165465的博客 206

ASP.Net Web Page深入研究

一、服务器脚本基础介绍首先,我们先复习一下Web服务器页面的基本执行方式:   1、客户端通过在浏览器的地址栏敲入地址来发送请求到服务器端   2、服务器接收到请求之后,发给相应的服务器端页面(也就是脚本)来执行,脚本产生客户端的响应,发送回客户端   3、客户端浏览器接收到服务器传回的响应,对Html进行解析,将图形化的网页呈现在用户面前对于服务器和客户端的交互,通常通过下面几种主要方式: 

QJH 1067

故障转移集群无法连接到节点_Windows 2012系统群集故障转移集群

理论知识很重要!集群和群集是什么意思?其实看到标题可能会感觉有点绕,简单易懂的来说一下:集群,英文名称为Cluster,集群的意思就是将多个系统连接在一起,可以让多台服务器能够像一台服务器那样工作。通常采用集群系统是为了提高系统的稳定性和网络中心的数据处理能力以及服务能力。第二个就是:群集,其实这个概念也不难理解,群集是把多个计算机连接在一起,形成整形,随后可以更好的利用设备资源的一项新...

weixin_39535283的博客 3253

Oracle EBS 帐套(Ledger/SOB)如何定义会计主体、如何支撑多准则 / 多报告、组织与帐套的绑定关系、以及项目落地时的设计差异。下面从实现逻辑、核心要素、组织模型、多账簿、科目设计、项

本文对比了Oracle EBS R12与SAP S/4HANA在帐套(Ledger)设计上的核心差异。Oracle采用4C架构(科目/币种/日历/准则),帐套作为独立会计主体,主辅账物理隔离;SAP则以公司代码为主体,通过平行分类账在同一凭证中实现多准则核算。关键差异体现在:Oracle强调边界隔离,适合差异大的集团;SAP注重统一视图,适合实时合并需求。实施时需注意:Oracle避免过度建账套,SAP需统筹科目与维度设计。两者分别体现了"盒子"与"滤镜"的设计哲学。

金牌架构师 417

ASP.NET Web Pages - 教程

Web Pages 是三种创建 ASP.NET 网站和 Web 应用程序的编程模式中的一种。其他两种编程模式是 Web Forms 和 MVC(Model View Controller 模型-视图-控制器)。Web Pages 是开发 ASP.NET 网页最简单的开发模式。容易学习,容易理解,容易使用围绕着单一的网页创建与 PHP 和经典 ASP 相似Visual Basic 或者 C# 的服务器脚本全 HTML、CSS 和 JavaScript 控制。

li514006030的博客 1088

virtuoso:layout如何做flat修drc

有些drc在virtuoso layout中修更节省时间,比如遇到一些via array需要做删改时,发现工具把via array做成了一个cell,如图。去改cell可能会影响很多via,所以最好的办法是做flat,去调整cut,比如删除。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 342

ASP.NET 教程之Web Pages I

asp.net之web pages基础,razor代码,页面布局,文件夹和全局页面。

Stephanie的博客 1389

如何使用 Python 爬取 58 同城招聘信息

职位名称:招聘的岗位名称,如“前端开发”、“数据分析师”等。公司名称:招聘公司的名称。薪资待遇:职位的薪资范围,通常以“面议”、“10k-20k”这样的形式表示。工作地点:公司所在的城市及具体地址。公司福利:例如五险一金、带薪年假、绩效奖金等。发布时间:职位信息的发布时间。一个典型的招聘页面 URL 格式通常如下:在这个页面上,职位信息会分页展示,爬虫需要模拟翻页,获取多个页面的招聘信息。

2201_76125261的博客 1291

RK3568平台(KBuild篇)KBuild编译体系

从Linux内核2.6开始,Linux内核的编译采用Kbuild系统,这和过去的编译系统有很大的不同,尤其对于Linux内核模块的编译。在新的系统下,Linux编译系统会两次扫描Linux的Makefile:首先编译系统会读取Linux内核顶层的Makefile,然后根据读到的内容第二次读取Kbuild的Makefile来编译Linux内核。kbuild,即 kernel build,用于编译 Linux 内核文件。

weixin_49303682的博客 349

ASP.NET Web Pages - 页面布局

通过 Web Pages ,创建一个布局一致的网站是很容易的事。

li514006030的博客 1265

1篇1章4节:生成对抗网络GAN和图像生成领域的StyleGAN

AI图像生成技术的革命性突破:从GAN到StyleGAN 近年来,人工智能在图像生成领域取得显著进展,尤其是生成对抗网络(GAN)的发展推动了技术的飞跃。从早期的基础GAN到渐进式GAN(Progressive GAN),再到革命性的StyleGAN,AI生成图像的逼真度已接近人类创作水平。StyleGAN通过引入风格潜向量和自适应实例归一化,实现了对图像风格与内容的精细控制,广泛应用于人脸生成、艺术创作及影视行业。后续的StyleGAN2解决了“斑点”问题,StyleGAN3进一步优化纹理过渡,提升了图像

MD Code 218

ASP.NET Web Page 应用深入探讨

ASP.NET Web Page 页面生存周期 一、服务器脚本基础介绍   首先,我们先复习一下Web服务器页面的基本执行方式:   1、客户端通过在浏览器的地址栏敲入地址来发送请求到服务器端   2、服务器接收到请求之后,发给相应的服务器端页面(也就是脚本)来执行,脚本产生客户端的响应,发送回客户端   3、客户端浏览器接收到服务器传回的响应,对Html进行解析,将图形化的网页呈现在用户面前  

624

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ASP.NET Web Page应用深入探讨(强烈建议开发web的人学习)

一、服务器脚本基础介绍   首先,我们先复习一下Web服务器页面的基本执行方式:   1、客户端通过在浏览器的地址栏敲入地址来发送请求到服务器端  2、服务器接收到请求之后,发给相应的服务器端页面(也就是脚本)来执行,脚本产生客户端的响应,发送回客户端  3、客户端浏览器接收到服务器传回的响应,对Html进行解析,将图形化的网页呈现在用户面前  对于服务器和客户端的交互,通常通过下面几种主要方式:...

weixin_30260399的博客 236

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 通过ASP.net程序创建域帐户故障
下一篇: 为ASP.NET封装的SQL数据库访问类
晓梦庄子
博客等级 码龄19年 4粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓梦庄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值