對於 Web 開發來說,最重要的就是生成 HTML 頁面,除了用流的方式一個字符一個字符地輸出,有沒有簡單的方式來創建一個處理程序生成網頁呢?
有!就是什么代碼也不寫的方式。當然,是我們自己不寫,由程序生成。
對於網站開發來說,最常用的功能就是生成 HTML 網頁,雖然通過處理程序再結合文本輸出流,從理論上就可以生成任何網頁,但是開發效率顯然不容樂觀。
為了從根本上解決這個主要的開發問題,ASP.NET 使用模板的方式來生成一個處理程序。模板的擴展名為 aspx ,通過一個內置的處理程序工廠 PageHandlerFactory 將 aspx 形式的模板編譯生成處理程序代碼,然后,將這個處理程序返回給 HttpApplication 完成請求的處理。aspx 形式的模板文件可以直接通過文本編輯器進行編輯,甚至可以通過 DreamWeaver 之類的網頁設計軟件進行排版,極大地提高了網站開發的效率,帶來了網站開發技術的革命性升級。
在 ASP.NET 的系統配置文件中,已經進行了如下的配置,可以看到,對於擴展名為 aspx 的請求,將由 PageHandlerFactory 這個處理程序工廠進行處理,代碼如下:
<add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" />
這個類定義在命名空間 System.Web.UI 下,具體的定義如下:
public class PageHandlerFactory : IHttpHandlerFactory
aspx 模板文件與 Page 類和生成類之間的關系如圖所示:
需要注意的是, aspx 模板的解析和代碼生成僅僅出現在第一次處理的時候,以后的請求將直接使用已經編譯生成的程序集,所以,這個處理過程並不會降低網站的處理速度。
對於一個 aspx 模板文件來說,一般情況下將對應存在一個同名的 cs 后台代碼文件,其中定義了一個與頁面同名的類,通過代碼文件可以看到這個類派生自 Page 基的類。
PageHandlerFactory 通過 aspx 文件將生成兩個類,一個為與后台代碼中定義的類同名的部分類,這個部分類將與后台代碼中定義的類在編譯的時候合並為一個派生自 Page 的頁面派生類。但是,在 ASP.NET 中,創建實際頁面對象的類並不是這個類,而是生成的第二個類,一般情況下,這個類的名字為頁面的名字后面加上下划線和 aspx。這才是實際創建頁面對象的頁面類。
例如,我們有一個頁面文件 MyPage.aspx,那么,應該存在一個對應的后台代碼文件 MyPage.aspx.cs 或者 MyPage.aspx.vb,其中定義了 MyPage 這個 Page 的派生類。
通過 PageHandlerFactory,MyPage.aspx 將生成兩個類,部分類 MyPage 和 MyPage_aspx,其中,后台代碼文件中的 MyPage 將和生成的部分類 MyPage 在編譯的時候合並為一個完整的 MyPage 類定義,而 MyPage_aspx 則是從 MyPage 派生的一個頁面類,用來創建實際的頁面對象實例。它們之間的關系如下圖所示:
由於頁面處理程序是通過模板生成的,所以,大多數情況下,我們只要創建好這個 aspx 的模板就可以了,HttpApplication 會通過 PageHandlerFactory 創建這個生成的處理程序,然后使用這個處理程序完成服務器的處理任務。
現在,如果我們需要通過處理程序生成一個網頁的話,只需要設計一個 aspx 的頁面即可。
在一些特殊的情況下,我們需要創建一些生成 HTML 輸出的程序,但是這些程序並不希望能夠被客戶端直接請求,那么,可以借助 PageParser 或者 BuildManager 通過 aspx 格式的模板來創建一個自定義的處理程序完成處理任務。
[請點擊下面綠色通道“關注DebugLZQ”,與DebugLZQ共同成長進步!]