C#構造方法(函數) C#方法重載 C#字段和屬性 MUI實現上拉加載和下拉刷新 SVN經常使用功能介紹(二) SVN經常使用功能介紹(一) ASP.NET經常使用內置對象之——Server sql server

C#構造方法(函數)

 

1、歸納javascript

1.一般建立一個對象的方法如圖:css

經過  Student tom = new Student(); 建立tom對象,這種建立實例的形式被稱爲構造方法。html

簡述:用來初始化對象的,爲類的成員賦值。java

 

2.構造方法特色程序員

a.方法名與類名相同;web

b.沒有返回值類型;面試

c.必需要經過new的形式調用;ajax

 

3.語法sql

訪問修飾符 類名([參數])數據庫

{

  方法體

}


2、 無參構造方法

1.在默認狀況下,系統將會給類分配一個無參構造方法,而且沒有方法體。

經過反編譯工具看出:

咱們也能夠自定義一個無參構造方法,在無參構造方法中對類的屬性進行賦值等操做。


3、帶參構造方法

 若是僅僅侷限於無參構造方法,那麼屬性賦值是固定的,沒有對外的可變性。有了參數,給予能夠根據業務邏輯,去針對性的賦值操做。


4、構造方法能夠造成方法的重載


5、強制使用有參構造方法

  上面描述了,系統在類沒有構造方法的時候,會生成一個無參構造方法。一旦咱們在類中編寫了構造方法,那麼這個自動生成的無參構造函數就不會生成。根據此特性,咱們能夠只定義有參構造方法,所以在建立對象的時候,就只能賦值使用有參的構造方法。

構造方法具備強制性的特色。


 

 6、構造方法的複用

1.遵循面向對象思想,所以咱們寫代碼的時候應該減小冗餘,加強複用性。構造方法複用形式以下:

用」:this」調用自身其餘構造方法。

2.this關鍵字

a.當成員變量和局部變量重名時使用this區分。

b.this表示當前類的對象,用於訪問該類的成員變量或方法。


7、對象初始化器

1.初始化對象的形式

  a.常規的「」對象名.屬性名=值;「」

  b.構造方法;

  c.對象初始化器;

2.實現形式:

3.描述

 對象初始化器是一種初始化對象的形式,本質上其實就是一種語法糖。它不具備像構造方法那樣的強制性,在爲屬性賦值的時候不用遵照賦值的順序和數量。

4.對象初始化器與構造方法的異同點

  a.構造方法具備強制性,對象初始化器沒有強制性。構造方法本質上是一種特性的方法,全部就要遵循方法的調用邏輯。

  b.對象初始化器功能單一,智能完成對象屬性初始化。而構造方法能夠在方法體中靈活的分配,如對象建立時讀取文件等需求。

  c.順序的不一樣,對象初始化器是在調用了構造方法才執行的屬性賦值。而構造方法在new 的時候進行調用,而且邏輯代碼都是在類裏面的。


 

知識改變命運
 
 
 

C#方法重載

 

1、 描述

  在面向對象的語言中,容許咱們在同一個類中定義多個方法名相同、參數列表(參數類型,參數個數)不一樣的方法,這樣的形式咱們稱爲方法重載。調用時編譯器會根據實際傳入參數的形式,選擇與其匹配的方法執行。


2、 重載的分析

1.生活中的方法重載

2.將生活重載的表現形式,抽象成代碼的形式:

3.構成方法重載的條件

a方法名相同。

b.方法參數類型不一樣或者參數個數不一樣。

c.在同一個類中。


3、 重載示例

1.咱們實現一個薪水計算類,用重載的方法實現項目經理和程序員的薪水計算

複製代碼
 1   class ComSalary
 2     {
 3         
 4         //項目經理的薪水計算:薪水=基礎工資+項目獎金+分成
 5         public static int Pay(PM pm)
 6         {
 7             return pm.BasePay + pm.MeritPay + pm.Bonus;
 8         }
 9 
10         //程序員的薪水計算:薪水=基礎工資+項目獎金
11         public static int Pay(SE se)
12         {
13             return se.BasePay + se.MeritPay;
14         }
15 
16 }
17 
18      static void Main(string[] args)
19         {
20 
21              //實例化一個程序員對象
22             SE tom = new SE {  Id="998", Name="湯姆", BasePay=6000, MeritPay=1000};
23 
24             //實例化一個項目經理對象
25             PM jack = new PM { Id = "110", Name = "傑克", BasePay = 9000, MeritPay = 2000, Bonus=1500};
26 
27             //計算工資
28             Console.WriteLine("程序員的薪水:"+ComSalary.Pay(tom));
29             Console.WriteLine("項目經理的薪水:" + ComSalary.Pay(jack));
30 
31         }
複製代碼

運行結果:

 

2.示例解析:

  經過Pay()方法重載計算項目經理和程序員的薪水。假如咱們不用方法重載會怎麼樣呢?例如,計算程序員薪水寫成PaySE(SE se)方法,而計算項目經理的薪水用PayPM(PM pm)方法。這樣確實也能完成計算薪水的任務,可是不符合面向對象的思想,形成一些冗餘形式。       你們能夠想一想,在實際開發中計算薪水的員工可能還有不少種角色,如股東等,咱們誇張一點,將須要計算的角色設爲上千個,那麼將不得不寫一百個不一樣的方法。此時,延伸出來的問題有:1.方法命名的困難;2.調用方法者調用方法選擇的困難。所以,方法重載就解決了這樣的麻煩。


 4、重載的細節

1.無關返回值,圖例:

結論:僅方法名相同參數列表相同,但返回值類型不一樣的方法不能構成重載。

2.類中的構造函數也能夠實現重載,是方法重載的一種特殊形式。


 

知識改變命運
 
 

C#字段和屬性

 

1、淺談訪問修飾符

做用:設定訪問權限,限制類中的成員(屬性、方法等)可訪問的範圍,訪問範圍一般有,類的內部、類的外部。

最經常使用的類型:private(私有的,僅類的內部使用);public(公有的,沒有訪問限制)

注意:類的成員在定義的時候沒有顯示的寫出訪問修飾符,則默認是private。對應到字段和屬性中,一般字段修飾爲private,屬性修飾爲public。


 

2、字段的使用

1.關於字段

a.字段又稱爲:「成員變量」,通常在類的內部作數據交互使用。

b.字段命名規範:camel命名法(首單詞字母小寫)。

 

2.通俗的理解

私有化:字段就比如咱們的我的財產,僅供我的使用,因此通常是private修飾。

添加標準:根據程序的功能需求,具體來添加須要的不一樣類型的字段。


 

4、屬性

1.屬性的使用

做用:在面向對象設計中主要使用屬性描述對象的靜態特徵。

要求:通常採用Pascal命名法(首字母大寫),數據類型要和對應的字段要一致。

 

2.屬性的理解

a.屬性其實就是外界訪問私有字段的入口,屬性自己不保存任何數據,在對屬性賦值和讀取的時候其實就是操做的對應私有字段。

圖例:

b.屬性本質其實就是一個方法,經過get和set方法來操做對應的字段,經過反編譯工具咱們能夠看出,如圖:

3.屬性的做用

A.避免出現非法數據,例如一個年齡屬性,正常邏輯是年齡是不能夠出現負數的,若是用戶對年齡進行了負數的賦值,咱們經過屬性的set方法加入判斷邏輯,從而排除這種非法數據。

示例:

B.限定屬性只讀或者只寫,例若有些屬性爲了保護數據,咱們只能讀取,而不能賦值。具體使用的話,咱們根據須要,屏蔽set或get方法達到只讀和只寫。

示例:

C.沒有對應私有字段的屬性,例如根據生日屬性獲取到年齡。

示例:

 

 

 


 

 

5、字段與屬性比較

字段(成員變量)

a.字段主要是爲類的內部作數據交互使用,字段通常是private。

b.字段可讀可寫。

c.當字段須要爲外部提供數據的時候,請將字段封裝爲屬性,而不是使用公有字段(public修飾符),這是面向對象思想所提倡的。

 

屬性(方法)

a.屬性通常是向外提供數據,主要用來描述對象的靜態特徵,因此,屬性通常是public。

b.屬性具有get和set方法,能夠在方法里加入邏輯處理數據,靈活拓展使用。


 

6、自動屬性

1.屬性編寫新語法(自動屬性:.NET3.0及其後續版本)

示例:

 

 

快捷方式:prop+tab+tab

注意:沒有特定業務邏輯的屬性均可以簡寫成自動屬性,自動屬性的格式不能修改。自動屬性對應的字段由編譯器自動生成。


 

知識改變命運
 
 

MUI實現上拉加載和下拉刷新

 

編寫存儲過程分頁(此處使用T-SQL)

複製代碼
 1 CREATE PROC [dbo].[Common_PageList]
 2 (
 3 @tab nvarchar(max),---表名
 4 @strFld nvarchar(max), --字段字符串
 5 @strWhere varchar(max), --where條件 
 6 @PageIndex int, --頁碼
 7 @PageSize int, --每頁容納的記錄數
 8 @Sort VARCHAR(255), --排序字段及規則,不用加order by
 9 @IsGetCount bit  --是否獲得記錄總數,1爲獲得記錄總數,0爲不獲得記錄總數,返回記錄集
10 )
11 AS
12 declare @strSql nvarchar(max)
13 set nocount on;
14 if(@IsGetCount = 1)
15 begin
16  set @strSql='SELECT COUNT(0) FROM ' + @tab + ' WHERE ' + @strWhere
17 end
18 else
19 begin
20   set @strSql=' SELECT * FROM (SELECT ROW_NUMBER() 
21   OVER(ORDER BY ' + @Sort + ') AS rownum, ' + @strFld + ' FROM ' + @tab + ' where ' + @strWhere + ') AS Dwhere
22   WHERE rownum BETWEEN ' + CAST(((@PageIndex-1)*@PageSize + 1) as nvarchar(20)) + ' and ' + cast((@PageIndex*@PageSize) as nvarchar(20))
23 end
24 
25 print @strSql
26 exec (@strSql)
27 
28 set nocount off;
複製代碼

 

 

webApi接口(ADO.NET部分封裝了,此處是調用形式)

複製代碼
 1         /// 測試mui下拉刷新
 2         /// </summary>
 3         /// <param name="flag"></param>
 4         /// <returns></returns>
 5         [HttpPost]
 6         public object test(JObject data)
 7         {
 8 
 9             using (var db = new DbBase())
10             {
11                 SqlParameter[] arr = { 
12                                      new SqlParameter{ ParameterName="tab",Value=data["tab"].ToString()},
13                                      new SqlParameter{ ParameterName="strFld",Value=data["strFld"].ToString()},
14                                      new SqlParameter{ ParameterName="strWhere",Value=data["strWhere"].ToString()},
15                                      new SqlParameter{ ParameterName="PageIndex",Value=Convert.ToInt32(data["PageIndex"])},
16                                      new SqlParameter{ ParameterName="PageSize",Value=Convert.ToInt32(data["PageSize"])},
17                                      new SqlParameter{ ParameterName="Sort",Value=data["Sort"].ToString()},
18                                       new SqlParameter{ ParameterName="IsGetCount",Value=Convert.ToInt32(data["IsGetCount"])},
19                                      };
20 
21 
22             return    RepositoryBase.ExecuteReader(db, "Common_PageList", arr);
23 
24 
25             }
複製代碼

 

頁面實現

複製代碼
  1 <!DOCTYPE html>
  2 <html>
  3 
  4     <head>
  5         <meta charset="utf-8">
  6         <title>Hello MUI</title>
  7         <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
  8         <meta name="apple-mobile-web-app-capable" content="yes">
  9         <meta name="apple-mobile-web-app-status-bar-style" content="black">
 10 
 11         <link rel="stylesheet" href="../css/mui.min.css">
 12         <style type="text/css">
 13             
 14             
 15             
 16         </style>
 17     </head>
 18 
 19     <body>
 20         
 21             <header class="mui-bar mui-bar-nav">
 22             <h1 class="mui-title">下拉刷新(單webview模式)</h1>
 23         </header>
 24         
 25         <div id="pullrefresh" class="mui-content mui-scroll-wrapper">
 26             <div class="mui-scroll">
 27                 
 28                     <ul id="container" class="mui-table-view mui-table-view-chevron"></ul>
 29                 
 30             
 31                 
 32             </div>
 33         </div>
 34  
 35      
 36          <ul id="temp" class="mui-table-view" style="display: none;">
 37                  <li class="mui-table-view-cell">
 38                      <a class="mui-navigate-right">
 39                          @name
 40                      </a>
 41                  </li>
 42                 
 43              </ul>
 44         
 45      
 46         
 47         
 48         
 49         <script src="../js/mui.js" type="text/javascript" charset="utf-8"></script>
 50         <script>
 51         
 52         
 53         
 54                 /**
 55                  數據源分頁參數對象
 56                  * */
 57                 var obj={ tab:'SystemUsers',
 58                             strFld:'code,Username',
 59                             strWhere:'1=1',
 60                             PageIndex:1,
 61                             PageSize:10,
 62                             Sort:'Username',
 63                             IsGetCount:0,
 64                             pageCount:0
 65                         }
 66                 
 67             //webApi服務器接口    
 68             var apiUrl="http://192.168.200.114:8123/api/Common/Base/test";
 69             
 70             
 71                 /**
 72                  * 定義數據源按什麼html方式展現,動態生成html字符串的邏輯
 73                  **/                
 74                 var drawHtml=function(data){
 75                         var html=""
 76                          for (var i=0;i<data.length;i++) 
 77                          {
 78                             var temp=document.getElementById("temp").innerHTML; //模板
 79                             html+=temp.toString().replace('@name',data[i].Username);  //替換參數疊加
 80                         }
 81                          
 82                      return html;
 83                 }
 84             
 85             
 86             
 87             mui.ready(function(){
 88              
 89  
 90              /**
 91                  MUI配置項
 92                  * */        
 93             mui.init({
 94                 pullRefresh: {
 95                     container: '#pullrefresh',
 96                     down: {
 97                         callback: pulldownRefresh
 98                     }, //END 下拉刷新
 99                     up : {    
100                           contentrefresh : "正在加載...",//可選,正在加載狀態時,上拉加載控件上顯示的標題內容
101                           contentnomore:'沒有更多數據了',//可選,請求完畢若沒有更多數據時顯示的提醒內容;
102                           callback :pullupRefresh //必選,刷新函數,根據具體業務來編寫,好比經過ajax從服務器獲取新數據;
103                     } //END 上拉加載
104                 }
105             });
106      
107          
108          
109 
110                             
111                 //統計:數據總數、分頁總數    
112                 obj.IsGetCount=1;                     
113                 loadData(apiUrl,obj,0);
114              
115                 //初始化列表數據(第一頁)
116                 obj.IsGetCount=0;        
117                  loadData(apiUrl,obj,0,"down",function(data){                     
118                      //此處實現動態繪製DOM的邏輯,根據數據源自行處理要展現的html方式                                          
119                      return drawHtml(data);
120                      
121                  });
122                 
123                 
124             });
125              
126         
127         
128             
129             /*
130              讀取數據源
131              url:api地址
132              dataObj:數據源分頁查詢參數對象
133              Timeout:指定多少時間後繪製頁面DOM展現對象,
134                              動態生成的元素代碼包含在一個setTimeout函數裏,
135                              用    setTimeout,主要對於下拉刷新間隔時間
136              loadType:加載方式:up(上拉加載)、down(上拉刷新)        
137              drawFunction:回調函數,處理拿到數據源,繪製DOM展現界面的html
138                                      ,要接收返回的html字符串
139              * */
140             
141             var loadData=function(url,dataObj,Timeout,loadType,drawFunction){
142                 
143                 mui.ajax(url, {
144                                 type: "post",
145                                 data:dataObj,
146                                 async:false,
147                                 headers: {'Content-Type': 'application/json'},
148                                 success: function(data) {
149                                        
150                                     //統計出數據總數
151                                     if(dataObj.IsGetCount==1)
152                                     {                                                                        
153                                         obj.pageCount=Math.ceil(parseInt(data[0].Column1)/obj.PageSize) ;                                     
154                                          return;
155                                     }
156                     
157                                     setTimeout(function() {            
158                                                                      
159                                     //動態繪製出的Dom元素,結合數據展示
160                                     var html=    drawFunction(data);
161                                          
162                                     if(loadType=="up")    //上拉加載
163                                     {
164                                                 if(obj.PageIndex==obj.pageCount)
165                                                 {
166                                                     //參數爲true表明沒有更多數據了。
167                                                     mui('#pullrefresh').pullRefresh().endPullupToRefresh(true);
168                                                 }
169                                                 else
170                                                 {
171                                                     mui('#pullrefresh').pullRefresh().endPullupToRefresh(); 
172                                                 }
173                                             
174                                         //將下一頁數據追加到容器    
175                                         document.getElementById("container").innerHTML=document.getElementById("container").innerHTML+html;
176                                     }
177                                     else if(loadType=="down")  //下拉刷新
178                                     {
179                                         // 該方法的做用是關閉「正在刷新」的樣式提示,內容區域回滾頂部位置
180                                         mui('#pullrefresh').pullRefresh().endPulldownToRefresh(); 
181                                         
182                                         //將第一頁數據覆蓋到容器
183                                         document.getElementById("container").innerHTML=html;
184                                         
185                                         //啓用上拉加載
186                                         mui('#pullrefresh').pullRefresh().enablePullupToRefresh();
187                                          
188                                     }
189                                     
190                                         
191                                         
192                                     
193                                 
194                                     
195                                 }, Timeout);//END setTimeout();
196             
197                                 },//END success();
198                                 
199                                 error: function(xhr, type, errorThrown) {                                 
200                                             console.log(type);
201                                 }//END error();
202                                 
203                     });//END ajax();
204                 
205             }//END loadData();
206             
207             
208             
209     
210              
211      
212             
213           /**
214              * 下拉刷新具體業務實現
215              */
216             function pulldownRefresh() {    
217                     console.log('重置數據,初始到第一頁');
218                     obj.PageIndex=1;
219     
220                      loadData(apiUrl,obj,1000,"down",function(data){
221                      //此處實現動態繪製DOM的邏輯,根據數據源自行處理要展現的html方式                                          
222                      return drawHtml(data);
223                          
224                      });
225         
226         } //END pulldownRefresh() 下拉刷新函數
227             
228             
229              
230             
231     
232             /**
233              * 上拉加載具體業務實現
234              */
235             function pullupRefresh() {
236                 obj.PageIndex++;//當前頁累加,加載下一頁的數據             
237                 console.log("加載第:"+obj.PageIndex+"頁");
238                 console.log("頁總數:"+obj.pageCount);
239                     
240              loadData(apiUrl,obj,1000,"up",function(data){
241                      //此處實現動態繪製DOM的邏輯,根據數據源自行處理要展現的html方式                                          
242                      return drawHtml(data);
243                      
244              });
245                 
246 
247             }
248             
249         
250 
251         </script>
252     </body>
253 
254 </html>
複製代碼

 

 

 

改進的問題:當單次數的下拉刷新會自動觸發上拉加載。好比:第一次進行下拉,就會自動觸發上拉加載,可是第二次就沒有。

      

 

知識改變命運
 
 

SVN經常使用功能介紹(二)

 

 

說明

上一章節主要描述了SVN的簡介、安裝搭建,和項目管理人員對SVN的經常使用操做。

這章主要講解,SVN對應角色組員,在實際運用中的經常使用操做。

 


 

 

將SVN服務器項目導入到開發組員的本地電腦裏

 

方式一:

新建一個文件夾,鼠標右鍵點擊文件夾,點擊Checkout

 

 

方式二(在VS裏操做依賴於VS的SVN插件):

 

點擊後,下面的操做和方式裏同樣,這裏不就不介紹了

 

 


 

 

在項目中新增文件或修改文件(Commit)

 

對於修改或者新增的文件,圖標爲橙色這就表示該文件和SVN服務器裏的文件不一致,如圖:

 

 

對於新增或修改的文件,一般進行任務完成後,咱們應當進行想SVN服務器提交的功能,操做如圖:

鼠標右鍵單擊文件,在菜單中單擊Commit操做,操做成功後文件圖標就變成綠色

 

 


 

 

從SVN服務器拿到一個最新的文件(Update)

 

 


 

 

VS中查看文件的歷史版本

右鍵單擊文件點擊菜單中的VisualSVN,在展開菜單中點擊Show Log For(查看文件對於歷史版本) ......

如圖:

單擊

 


 

 

經過查看歷史版本和項目當前使用文件版本進行對比,操做如圖

 

 

 

顏色的不一樣表示兩個文件的差別之處

 

 


 

 

 

恢復到歷史中的一個版本

 

 


 

 

總結一下SVN對於項目組員,要使用的經常使用功能

  1. 獲取最新代碼,完成後續開發
  2. Update:將服務器代碼更新到本地
  3. Commit:將本地代碼更新到服務器代碼
  4. 恢復歷史版本:右鍵文件—>show log—>在指定版本上右鍵—>revert
  5. 文件對比:右鍵文件—>show log—>在指定版本上右鍵compare with working copy

 

 

SVN經常使用功能介紹(一)

 

 

簡介

SVN是Subversion的簡稱,是一個開放源代碼的版本控制系統,相較於RCS、CVS,它採用了分支管理系統,它的設計目標就是取代CVS。

互聯網上不少版本控制服務已從CVS遷移到Subversion。說得簡單一點SVN就是用於多我的共同開發同一個項目,共用資源的目的。

 

SVN兩大功能的體現

(1)一個公司一個項目一般會是一個團隊一塊兒開發,那麼組員開發完了後,如何把代碼項目文件等組織到一塊兒來呢?SVN能夠解決此問題,組織分工協做的代碼,協同多人開發一個項目。

(2)一般一個功能點,可能在實際工做中會根據業務有不少的變動,例如第一期登錄版本開發完畢,又開發了第二期、第三期等等,

    這時,客戶說不想用當前的版本要使用當初第一期的版本。這個時候如何讓項目登錄功能回到第一期呢?SVN能夠解決此類問題,

    對於歷史存留的文件可訪問,能夠很好的恢復到以前的版本。

 


 

 

使用SVN主要安裝的軟件

1.VisualSVN-Server:搭建服務區,項目管理人員負責安裝

2.TortoiseSVN:將SVN功能集成到windows右鍵菜單上

3.VisualSVN:對於.net開發人員,至關於VS裏SVN的插件

 

 


 

 

使用SVN職責擔當之項目管理人員使用部分

 

1、主要使用軟件

 

2、服務器裏的層次關係

 

3、項目的權限分配

對於倉庫中的每個項目,項目管理人員能夠進行權限分配。能夠對一個項目指派一個用戶操做,也能夠指派一個組。

組合用戶,能夠指定相應的權限,例如說對於實習生一類的人羣能夠只分配它查看,沒有寫的功能。而對於開發人去,能夠指定權限讓他對項目可讀可寫的操做。

 

    1.在倉庫中建立一個項目

    

 

 

    2.項目URL

    建立完成後,每一個項目都有對應的服務器地址,如圖:

    

    https://lenovo-PC/svn/BLOG/

    URL的第一部分lenovo-PC是你電腦的主機名,能夠替換成本機的IP地址。  

    在開發過程當中,項目人員會將URL告知組員,組員根據URL對項目進行導出。

 

    3.爲項目分配管理人員

    建立用戶:

    

    建立組:

    

    將用戶加入到組中:

    

    指定項目分配一組管理人員:

    

    

    

    分配完成

    

    注意:在把項目添加到SVN服務器以前,要確保爲該項目分配了組員管理,不然在添加過程當中會報錯。

    

 

 

3、把項目文件加到SVN服務器

方式一:

點擊OK後

完成

 

方式二(經過VS的SVN插件操做):

 

注意此時還要有一項操做,才能真正把項目導入到SVN服務器中,右擊項目在菜單中,點擊Commit

 

知識改變命運
 
 

ASP.NET經常使用內置對象之——Server

 

簡介

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地址的安全性。

 

 

 

 


 

以上知識點根據學習,不斷領悟後對知識不斷的剖解

 

 

sql server——子查詢

 

簡述:

在查詢語句中包含着有另一條查詢語句,被包含的查詢語句稱爲子查詢,包含着子查詢的查詢就稱爲父查詢。

總之,子查詢就是在查詢語句裏嵌套一條或者多條查詢語句。

 


 

經常使用子查詢分類:

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 字段):

根據指定的字段排序,對排序後的結果集的每一行添加一個不間斷的行號。

用的時候需注意:若是使用生成行號的查詢用做結果集,那麼必須爲該結果集取一個別名,同時生成的行號字段也要取一個別名

 

知識改變命運
 
 

C#接口

 

概念

至關因而一個規則,完成是爲了約束(統一)類的行爲,接口光說而不作。

接口是一種規範,也是一種功能的體現。

 

在生活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"。

 

知識改變命運    字符串駐留機制 
 
 

AJAX原生JavaScript寫法

 

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");
複製代碼
相關文章
相關標籤/搜索