ASP.Net中


1 aspx需要的原因
  • 如果每次輸出頁面都是一般處理程序的話太痛苦了,每次都要寫大量的html代碼,所以一般生成html的時候都直接創建aspx(Web窗體,WebForm)
  • WebForm分爲兩個文件aspx和aspx.cs,aspx是頁面模版,是頁面描述文件,就是html+js+css的內容,和aspx.cs結合地更好,空間在aspx中,js,css都寫在aspx中,C#寫在cs文件中,實現代碼後置(CodeBehind)
  • 瀏覽器如果報錯"***行錯誤"(js腳本錯誤), 不要看aspx,要看生成的源代碼
2 WebForm
  • cs可以直接使用前臺 runat="server" 的控件 注意: 必須有id
  • aspx也可以訪問cs中定義的字段,函數,還可以編寫C#代碼,for等所有C#代碼都可以寫在aspx(不推薦)
  • 前面<% {C#代碼} %>   <%=strHello%>相當於<%Response.Write(strHello)%>
  • 前臺文件和後臺文件在運行的時候是兩個分開的類,前臺文件類 -- 繼承 -- 後臺文件類
  • aspx使用cs文件紅的行數,執行代碼,必須是(非private修飾的,因爲繼承的關係)
  • <%%>是運行在服務器端的代碼, 運行完傳給瀏覽器, 不像js,html是瀏覽器運行
  • •< div>
    
            <%  //在html中可以編寫C#代碼
    
                for (int i = 0; i < 3; i++)
    
                {
    
                    Response.Write(i + Hello() + strHello + "<br />" );
    
                } //前臺頁面是後臺文件的繼承,protected可以使用,或public
    
            %>
    
            < input type ="text" id ="txtName" runat ="server" value ="" />
    
        </ div>

3 aspx, cs, dll之間的關係(*) 重要
  •  this.GetType().Assenbly.Location 程序集的地址
  • 通過反編譯代碼,可以知道 服務器發送請求過來 反射指向的是 前臺文件類  因爲前臺文件類繼承與後臺文件類, 創建前臺文件類時自動創建了後臺文件類
  • LiteralControl文字控件   呈現(Render) -- 將服務器端控件類對象轉成對應的html代碼
  • 如果在前臺類文件中出現<%=, 或者Response.Write 就可能使用呈現的方法, 使用委託方法追加一個呈現的方法
  • 頁面類對象,通過控件樹的方式,幫我們封裝了整個頁面的HTML代碼和C#代碼, (封裝到頁面類對象的 控件集合中, 那麼要生成頁面的HTML代碼只需要循環遍歷整個控件樹,並調用美國控件的_Rander_方法獲得每個控件的html代碼,就可以拼成一個完整的頁面HTML代碼了
  •    
4 頁面生命週期   -- 大的流程,大體的概念的理解
闡述下上圖:  瀏覽器請求發送到瀏覽器, 擴展程序(這裏針對動態網頁代碼), Framework,HttpRuntime 1.創建PR對象 2.創建上下文對象(Context)使用HttpWorkerRequest 3.創建Application對象,負責整個請求, 中間19個事件   執行頁面類的PR方法, 構建ControlTree, 執行生命週期前幾百代碼(處理完後臺代碼), 調用頁面Render方法, 寫出html代碼

頁面核心方法 
ProcessRequestMain()

Trace="True" 可以跟蹤信息
頁面生命週期: 頁面生成的方法過程

*前臺頁面類的ProcessRequest方法實際是,調用了父類的ProcessRequest方法,在此方法中,父類調用了父類的FrameworkInitialize方法,但因爲這個在前臺頁面類被重寫了,調用了_buildControlTree()方法. --- 這個調用過程,具體可以看反編譯工具

5 登陸
後臺:
 
  //對於程序員來說, Page_Load方法是我們第一個進行編輯的方法

    //頁面對象從它"開始"執行.

    protected void Page_Load(object sender, EventArgs e)

    {

        if (!string .IsNullOrEmpty(Request.Form["IsPostBack"]))

        {

            //Response.Write("123123");

            string strName = Request.Form["txtName" ];

            string strPassword = Request.Form["txtPassword" ];

            if (strName == "admin" && strPassword == "123")

            {

                Response.Write( "登陸成功!" );

            }

        }

        else //否則,是通過get方式過來的,(地址直接輸入,超鏈接過來,表單get過來)

        {

            Response.Write( "Get過來的" );

        }

    }

前臺:
<head runat="server">

    <title> 登陸代碼</title >

    <script type="text/javascript">

        function get(id) {

            return document.getElementById(id);

        }

        function doLogin() {

            var domName = get("txtName" );

            var strName = domName.value;

            var strPwd = get("txtPwd" ).value;

            if (strName == "" || strPwd == "") {

                alert( "請輸入用戶名和密碼" );

                domName.focus();

            }

            else {

                get( "form1").submit();

            }

        }

    </script>

</head>

<body>

    <form id="form1" action="Login.aspx" method="post">

    <div>

        <input id="txtName" type="text" name="txtName"/><br />

        <input id="txtPwd" type="password" name="txtPassword"/><br />

        <input  type="button" onclick="doLogin()" value="登陸" />

        <input type="hidden" name="IsPostBack" value="1" />

    </div>

    </form>

</body>


5 Request其他成員
  1. Request.UrlReferrer 請求的來源,  (在請求報文裏的referrer),可以根據這個判斷從百度搜的哪個關鍵詞,防盜鏈下載,防圖片下載,可以僞造(比如迅雷)."本圖片僅供汝鵬網內部交流使用",在DZ中測試.全局防盜鏈用Global.asax
  2. Request.UserHostAddress 訪問服務器的客戶端ip   是通過瀏覽器通信套接字的RemoteEndPoint(遠程網絡節點)拿到的
  3. Request.Cookies    直接使用Request.Cookies["Name"]
  4. Request.MapPath(virtulPath)   將虛擬路徑轉換爲磁盤上的物理路徑 Response.Write(Request.MapPath("~/Login.aspx")); 得到 "... \ASP學習\Class01WebForm\Web\Login.aspx"
6 Response其他成員
  • 響應的緩存輸出: 爲了提高服務器性能,asp.net想瀏覽器Write的時候默認不會每Write一次都會立即輸出瀏覽器,而是會緩存數據,到合適的時機或者響應結束纔會將緩衝區中的數據一起發送到瀏覽器   發送bite arr[]
  • Response對象的主要成員:
  • 1 - Response.Buffer, Response.BufferOutput: 經過Reflector反編譯, 發現兩個屬性是一樣的,Buffer內部就是調用BufferOutput. 這個屬性是用用來控制是否響應緩存,默認是True, false就是不緩存, Write一下就輸出一下
  • 2 - Response.Flush()將緩衝區的數據發送給瀏覽器. 這在需要將Write出來的內容立即輸出到瀏覽器的場合非常合適. 案例: 大批量的數據的導入, 顯示正在導入第*條數據, 用Thread.Sleep模擬耗時
  • 3 - Response.Clear() 清空緩存區的數據, 這樣緩存區就還沒有發送到瀏覽器端的數據清空, 不會被髮送到瀏覽器
  • 4 - Response.ContentEncoding 輸出流的編碼  默認是charset=utf-8
  • 5 - Response.ContentType  輸出流的內容類型 比如html(text/html) 還是普通文本(text\plain) 還是JPEG圖片(image/JPEG)
  • 6 - Response.Cookies 返回瀏覽器的Cookie的集合, 可以通過它來設置Cookie
  • 7 - Response.OutputStream 輸出流, 在輸出圖片, Excel等非文本內容是用到
  • 8 - Response.End() 終止響應, 將之前緩存的數據發給瀏覽器, End()之後的代碼就不會繼續執行,End方法裏調用了Flush()方法. 在終止一些非法請求的時候, 比如盜鏈等可以用End()立即終止請求
  • 9 - Response.Redirect(url) 重定向瀏覽器到新的網址. 即可以重定向到站外網址也可以重定向到站內地址. Redirect是向瀏覽器發回302重定向(還有一個Location告訴瀏覽器要重定向到哪個頁面), 是通知瀏覽器"請重新訪問url這個網址", 這個過程經歷了服務器通知瀏覽器,瀏覽器街道名冷訪問新網址的過程.使用HttpWatch可以看到整個Http報文. 用Redirect因爲是瀏覽器自己去重新訪問新網址的,所以在地址欄中可以看到網址的變化的, 後面會用來防止刷新瀏覽器是提示重試. 
  • 10 - Response.SetCookie(HttpCookie cookie), 向葉面輸出流更新寫到瀏覽器中的Cookie,如果Cookie存在就更新不存在就增加,是對Response.Cookies的簡化
  • 11 - Response.Write()想瀏覽器輸出內容
6 Server屬性

*WebForm前臺頁面文件在被訪問時,會被編譯成類,前臺類繼承於後臺類.
*被訪問時,服務器會創建前臺類對象來作爲處理瀏覽器請求的對象.
*前臺類對象是如何結合後臺類的方法,生成整個頁面的HTML代碼的呢? -- 被請求是,頁面控件(控件其實就是一個類)對象樹的生成
     控件樹負責整個頁面的內容(__BuildControlTree()生成控件樹方法) 
前臺頁面類->後臺頁面類->Page->TemplateControl->Control(半酣ControlCollection對象)

*WebForm結構分析,如何在aspx指定位置輸出後臺變量,前後臺文件編譯後的結構(頁面原理),前臺%=的作用,服務器控件登錄, 圖片防盜, 服務器的輸出緩存機制, Sever.Execute, Server.Transfer, Sever.Html加解碼

1.瀏覽器和服務器的交互 是通過Socket
2.瀏覽器和服務器交互的語法: Http協議
3.瀏覽器要和服務器交互的目的: 獲取服務器資源(html,圖片,js,css)
4.服務器要做的事情就是想盡辦法,滿足瀏覽器的需求. 所以一旦瀏覽器請求的是動態頁面的時候,服務器就要創建頁面對象,並執行裏面的方法, 最後將生成的html代碼返回瀏覽器

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章