簡介
Server對象是HttpServerUtility的一個實例,也是上下文對象context的一個屬性,提供用於處理Web請求的Helper方法。
經常使用成員
1、Server.MapPath()方法
方法簽名:public string MapPath(string path)
描述:指定一個虛擬路徑傳入,返回對應虛擬路徑的Web服務器上的物理路徑。等同於Request.MapPath()方法。
2、Server.Execute()方法
方法簽名:public void Execute(string path)
描述:在當前請求的上下文中執行指定虛擬路徑的處理程序,而後執行返回給調用它的頁面。
通俗的說,也就是當前頁面調用了Server.Execute方法將一個指定路徑的頁面進行執行,將內容嵌套在當前頁面中,能夠實現iframe相似的效果。
示例圖解:

WebForm2.apx內容:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication2.WebForm2" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<% Response.Write("我是頁面2"); %>
</div>
</form>
</body>
</html>
讓咱們這經過一張圖片看看執行原理:

從查看網頁源代碼,能夠看出,Execute方法將指定路徑的頁面執行輸出,做爲頁面中的一部分進行顯示,此技術徹底能夠實現相似iframe的功能,父頁面中嵌套一個子頁面
3、Server.Transfer()方法
方法簽名:public void Tarnsfer(string path)
描述:對於當前請求(當前頁面),終止當前頁的執行,並根據傳入的URL執行新的頁面。
其實Server.Transfer()方法能夠看作是一個內部的重定向,是由服務器內部的資源接管,
瀏覽器察覺不到該請求,Htpp報文裏也沒法查看到請求信息。還要注意的是該方法重定向請求的頁面資源必須是服務器內部的,不能重定向外部的網站。
示例圖解:

在執行結束後瀏覽器的地址欄不會發生變化,由於是內部的,瀏覽器不知道,因此地址欄仍是轉移以前頁面的url地址
俗解:
Server.Transfer就比如一個公交站點,一輛596公交車帶着一批乘客開到了這個站點,就表示說,要換另外一個司機了,
新的司機上車,跟着新司機又有一批新的乘客,就繼續駕駛着這個596公交車。頁面的Url是沒有改變的,Url就像沒有改變的公交車線路號(596)。
注意:還有一點須要注意的是該方法不能重定向到ashx的通常處理程序頁面,不然會報「子查詢出錯」
4、Server.Execute()、Server.Transfer()和Response.Redirect()的區別
1.從三者字面意上就是就能夠看出三個方法的核心,那麼根據關鍵字簡單歸納一下:
Server.Execute():執行。根據傳入的指定路徑,在當前頁面執行該路徑對應的頁面,此內容做爲頁面的一部分。
Server.Transfe():轉移。在方法執行處,結束當前請求輸出的內容,轉移到一個指定頁面,輸出新頁面的內容。
Response.Redirect():從新寄送。接收客戶端請求後執行該方法後,返回給瀏覽器304狀態碼,讓瀏覽器在發一次http請求,請求Redirect()方法指定路徑的頁面。
2.三者的共同點:
均可以指定一個路徑參數,而後根據這個路徑,實現跳轉執行路徑對應的頁面。
3.地址欄的區別:
Server.Execute()和Server.Transfer()方法執行輸出後,瀏覽器的地址欄不會改變,仍是當前請求的地址。
然而Response.Redirect()則會告訴瀏覽器在一塊兒發送一個http請求,最終地址欄會發送改變,地址欄爲Redirect()方法參數路徑的地址。
4.Server.Execute()和Server.Transfer()區別:
兩則表面上很是類似,執行後地址欄未改變,執行結果也很相似。其實二者有本質上的區別,
Server.Execute()實際上是執行一個頁面,執行輸出在當前頁面中,當前頁面下部分還要輸出的。
可是,Server.Transfer()方法執行,當前頁面的請求輸出就中斷了,轉移給另外一個頁面了,下部分顯示的是另外一個頁面的內容。
5.Server.Transfer()和Response.Redirect()的區別:
二者形式上相同,都是重定向到另外一個資源。Response.Redirect()方法執行後會返回給瀏覽器一個304狀態碼,
瀏覽器根據指定的路徑在發送一次http請求。若是請求的頁面執行Response.Redirect()方法,其實在http報文裏能夠看到相關線索的。
而後Server.Transfer()是一個內部的重定向,瀏覽器沒法察覺它的操做,Http報文裏也沒法看到相關線索。
還有一點是,Redirect能夠傳一個外部的地址,重定向外部的網站,然而Transfer只能限定說,傳入的路徑資源必須是服務器內部的。Redirect方法相對比較靈活。
5、Server.HtmlEncode()方法
方法簽名:public string HtmlEncode(string s)
描述:一個字符串內容若是包含html標籤,那麼輸出到客戶端瀏覽器會解析成一個html標籤,
若是咱們不想讓這個含有html內容的字符串輸出成標籤,而是輸出字符串內容,那麼使用Server.HtmlEncode()方法就能夠實現。
實例圖片:

注意:原模原樣的輸出了字符串內容,而不是解析成一個Html標籤,實際上Encode()方法將那些有html字符替代用特殊的轉義字符表示
Server.HtmlEncode()方法實際運用的狀況1
假設咱們項目中有一個評論功能,這個時候若是用戶評論的內容,是有特殊含義的JavaScript腳本,若是順利執行保存到數據庫中,
又剛好讀取評論這個頁面向服務器反應的 context.Response.ContentType = "text/html";這種形式,
那麼用戶在讀取查看這個評論的時候,腳本就會執行,那麼咱們極可能存在一個風險,被這個腳本有意圖的打亂系統運行。
這個時候,咱們可使用Server.HtmlEncode()方法評論內容進行處理,只是讓參數本分純粹的將內容以字符串形式表示。
Server.HtmlEncode()實戰示例狀況2:
需求:一個程序員社區,須要你們分享代碼交流,提供了相應提交評論和讀取評論的功能
界面:

後臺服務器接收到該參數的時候,.net平臺會報一個錯誤,如圖:

這說明,.net對客戶端提交的參數,有一道檢驗的屏障,可是根據功能設計,這裏提交的腳本代碼我認爲是安全的,那麼就要關閉.net的這個屏障。
如何關閉:
1、將配置文件裏httpRuntime標籤下的requestValidationMode設置爲2.0

2、這Page指令集處設置ValidateRequest屬性爲false(此處只是針對WebForm程序的設定,其餘應用請參考https://msdn.microsoft.com/en-us/library/hh882339.aspx)

這樣,服務器就能夠把有代碼含義的內容保存到數據庫,在讀取評論的時候,咱們對這個有代碼含義的內容使用Server.HtmlEncode()方法,將他響應給瀏覽器,瀏覽器就能夠顯示這個包含代碼含義的字符串,爲何讀取的時候使用Server.HtmlEncode()方法由於默認Response.write()肯會將內容轉義交給瀏覽器,瀏覽器會執行這個代碼腳本。
6、Server.HtmlDecode()方法
方法簽名:public string HtmlDecode(string s)
描述:將一個含有html內容含義的字符串,解析成一個html標籤輸出給瀏覽器
實例圖片:

根據Encode()方法推理,Encode()方法內部實際上把字符串裏那些有html含義的字符,替代成特殊轉義字符進行顯示,那麼HtmlDecode()方法一樣能夠把含義轉義字符的字符串解析成html標籤,如圖:

注意:服務器調用context.Response.Write()方法輸出一個字符串,若是字符串是html含義的,
那麼服務器默認使用的是Server.HtmlDecode()方法輸出給瀏覽器,固然這個還要看Context.Response.ContentType屬性的設置
7、Server.UrlEncode()方法和Server.UrlDecode()方法
Server.UrlEncode():傳一個url格式的字符串,對url進行編碼,通俗的理解爲加密
Server.UrlDecode():對Server.UrlEncode()編碼加密事後的Url進行解碼,還本來來面目
示例圖解:

結論:兩個方法的特色,咱們能夠在請求一些重要頁面的時候,使用編碼解碼的方法來提升,請求URL地址的安全性。
以上知識點根據學習,不斷領悟後對知識不斷的剖解
簡述:
在查詢語句中包含着有另一條查詢語句,被包含的查詢語句稱爲子查詢,包含着子查詢的查詢就稱爲父查詢。
總之,子查詢就是在查詢語句裏嵌套一條或者多條查詢語句。
經常使用子查詢分類:
1、獨立子查詢

特徵:子查詢語句能夠獨立運行
2、相關子查詢
select * from student where majorId = (select majorId from major where majorId=student.majorId)
特徵:子查詢中引用了父查詢中的字段,依賴於父查詢
1、子查詢作爲查詢條件
描述:當一條查詢語句須要一個外部的值作爲條件的時候,可使用一個獨立的查詢先獲得這個值,在將值返回進行條件的判斷。
注意1:使用子查詢作爲條件的時候,子查詢的查詢結果只能返回一列的值,若是返回多列將報錯:

注意2:子查詢若是返回單列多行的結果,應該在查詢語句where 後將"="換成"in",in關鍵字能夠接收多行結果集。使用"="接收多行報錯:

注意3:若是子查詢作爲條件返回的是,多行多列的結果集,能夠採用exists接收查詢結果
2、將子查詢作爲一個結果集
select * from (select * from student where majorId=1) tab where stuGender=1
注意:將子查詢作爲結果集,那麼必需要爲這個結果集取一個別名
3、將子查詢作爲查詢語句中的某一列
select stuName,(select majorName from major where student.majorId=major.majorId) from student
4、子查詢實現分頁
方式1:
--pageIndex=2 pageSize=5
select * from (select ROW_NUMBER() over (order by did) as num ,* from DonationDetail ) tab
where num>=6 and num <=10
方式2:
--pageIndex=3 pageSize=5
select top 5 * from (select ROW_NUMBER() over (order by did) as num,* from DonationDetail) tab
where num not in (select top (3*5-5) ROW_NUMBER() over (order by did) as num2 from DonationDetail)
ROW_NUMBER() over (order by 字段):
根據指定的字段排序,對排序後的結果集的每一行添加一個不間斷的行號。
用的時候需注意:若是使用生成行號的查詢用做結果集,那麼必須爲該結果集取一個別名,同時生成的行號字段也要取一個別名
知識改變命運
概念
至關因而一個規則,完成是爲了約束(統一)類的行爲,接口光說而不作。
接口是一種規範,也是一種功能的體現。
在生活USB接口就相似咱們程序裏說的接口,定義了一個規定尺寸規格的插口,
無論你是手機數據線仍是移動硬盤等設備,只要你有數據線實現這個接口,就可使用這個接口帶來的功能。
接口命名規範通常以I開頭
語法:
[訪問修飾符] interface 接口名
{
//接口成員定義
}
經過.NET Reflector反編譯工具看看接口的本質
原代碼:

反編譯:

從反編譯看出接口的本質其實也是一個抽象類
接口定義的規則:
1.在編寫接口成員時,不要加訪問修飾符(由於接口的全部成員都默認就是公共抽象成員)
2.接口中不能有非抽象的實現成員,只能聲明。例如屬性自能寫自動屬性、方法不能寫方法體。
3.接口不能包含字段
實現接口
1.一個類能夠實現多個接口。實現了接口的類,必須實現這個接口中聲明的全部成員。
2.實現接口的方法,是類自身的方法,而不是重寫的方法,跟接口沒有關係
接口多態的體現
接口的運用也主要爲用於多態
1.實現接口的類的對象賦值給一個接口類型的變量
2.以接口做爲數組類型,存儲實現該接口的類的對象
3.以接口看成方法的參數類型,在調用方法時,傳入實現該接口類的對象
4.以接口做爲方法的返回值類型,return時能夠返回實現類的對象
一個實現接口的類不想實現該接口的成員,解決辦法
將實現接口的成員,標記abstract,類也要加上abstract
觀察狀況一(字符串實例直接賦值給string類型的變量):

分析:
經過調試看出,兩個變量存儲的內存地址是同樣的,這個內存地址其實指向的是字符串常量區
圖解:

原理:
建立一個字符串對象,系統會先掃描常量區有沒有相同值的字符串,若是有,就直接返回常量區對應的地址 。
觀察狀況二(經過 new 關鍵字實例化string類型的對象):

分析:
此時爲何使用new關鍵字建立字符串實例,怎麼內存地址沒有像狀況一中內存地址都同樣。緣由是new關鍵字的本質促使。
new的做用:
1.開闢堆內存空間或者常量區
2.建立對象
3.調用構造函數
4.返回開闢的內存地址
由此分析new,是開闢了新的內存區域,天然返回的內存地址也不會同樣。
觀察狀況三:

思考:
從正常邏輯分析,a和b指向了同一個對象的引用,案例b="bb";後變量a的值也應該發生改變纔對。因爲是根據字符串特性的不一樣,這裏才使a得值沒有發生變化。
圖解:

原理:
若是對一個字符串類型的變量的內容進行修改,實際上是沒法修改變量存儲的字符串自己的,而是根據這個新的字符串,去掃描常量區,若是沒有就開闢新的空間存儲這個字符串,並返回新的內存空間地址。
字符串本質總結:
1. 建立一個字符串,系統會先掃描常量區有沒有相同值的字符串,若是有,就直接返回常量區對應的地址 。
2. 若是對一個字符串類型的變量的內容進行修改,實際上是沒法修改變量存儲的字符串自己的,而是根據這個新的字符串,去掃描常量區,若是沒有就開闢新的空間存儲這個字符串,並返回新的內存空間地址。
3.字符串具備恆定性(值不能改)的特色,一旦在常量區中建立,生命週期是隨着應用程序結束而釋放。
4.字符串存儲在常量區中,做用域是一個公共的區域。
面試實戰題目:
不是說字符串是不可變的嗎?string s="abc";s="123"不就是變了嗎?
答:
在這裏,變量s的存儲的值確實是由"abc"變成"123"。可是這僅僅改變的是變量s所指向的不一樣引用。"abc"是一個字符串實例對象,
"abc"的建立首先會掃描堆區域中的常量區,有沒有"abc",若是有則直接返回地址,若是沒有則開闢一塊新的區域,並返回新的地址。
根據字符串的恆定性,一旦在常量區中建立,生命週期是隨着應用程序結束而釋放。
因此當建立"123"時,沒有改變"abc"。
知識改變命運 字符串駐留機制
GET方式
1 //建立XMLHttpRequest對象,爲考慮兼容性問題,老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 對象
2 var ajax = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
3
4 //設定請求的類型,服務器URL,以及是否異步處理
5 ajax.open("get","test.ashx?name=jcx&id="+new Date(),true);
6
7 ajax.onreadystatechange=function()
8 {
9 //4:請求已完成,且響應已就緒
10 if(ajax.readyState==4)
11 {
12 //200:成功
13 if(ajax.status==200)
14 {
15 //處理結果
16 alert(ajax.responseText);
17 }else
18 {
19 alert("AJAX服務器返回錯誤!");
20 }
21 }
22
23 }
24
25 //將請求發送到服務器
26 ajax.send();
POST方式
1 var ajax=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");
2
3 ajax.open("post", "test.ashx", true);
4
5 ajax.onreadystatechange = function () {
6 if (ajax.readyState==4)
7 {
8 if (ajax.status==200) {
9 alert(ajax.responseText);
10 }
11 }
12 }
13
14 ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
15 ajax.send("name=jcx&id=23");