2018-01-09 .NET數(shù)據(jù)庫連接和參數(shù)化查詢、改變超鏈接樣式凄吏、Asp.Net底層解析-頁面生命周期远舅、 iOS獲取系統(tǒng)電量、javascript使用的兩項原則

第一組:劉聰 .NET數(shù)據(jù)庫連接和參數(shù)化查詢

.NET中連接MySql數(shù)據(jù)庫
  1. 引用MySql.Data:.NET框架一般連接數(shù)據(jù)庫為SQL SERVER 數(shù)據(jù)庫痕钢,如果需要連接Mysql數(shù)據(jù)庫图柏,則需要添加專用的引用。從官網(wǎng)http://dev.mysql.com/downloads/connector/net/下載最新的MySQL connection/Net組件mysql-connector-net-6.10.5.msi并運行后任连,在本地C:\Program Files (x86)\MySQL\MySQL Connector Net 6.10.5\Assemblies\v4.5.2路徑下得到MySql.Data.dll(如果沒有也可能在C:\Program Files下)蚤吹。

  2. 建立數(shù)據(jù)庫連接
    添加引用后可以使用using MySql.Data.MySqlClient;通過下列代碼實現(xiàn)MySql數(shù)據(jù)庫連接。


  3. 數(shù)據(jù)庫操作
    這里只進(jìn)行簡單的查詢操作:


控制臺輸出:

參數(shù)化查詢
  1. SQL注入問題

上面的查詢操作是通過查詢字符串拼接實現(xiàn)的随抠,模擬用戶輸入裁着。這里存在一個SQL注入的問題:


問題在于password = "111' or '1'='1";最后拼成的sql語句為:
select * from usertable where UserName='congliu' AND Password ='111' or '1'='1'
由于1=1恒為真,所以不管其他的輸入為什么都會返回當(dāng)前表的所有信息拱她。這是一個簡單的sql注入二驰。

  1. 參數(shù)化查詢

為了解決這個問題,比較好的方法是采用參數(shù)化查詢:



參數(shù)化查詢是訪問數(shù)據(jù)庫時秉沼,在需要填入數(shù)值或數(shù)據(jù)的地方桶雀,使用參數(shù) (Parameter) 來給值。
  
在使用參數(shù)化查詢的情況下唬复,數(shù)據(jù)庫服務(wù)器不會將參數(shù)的內(nèi)容視為SQL指令的一部份來處理矗积,而是在數(shù)據(jù)庫完成SQL指令的編譯后,才套用參數(shù)運行盅抚,因此就算參數(shù)中含有指令漠魏,也不會被數(shù)據(jù)庫運行倔矾。Access妄均、SQL Server、MySQL哪自、SQLite等常用數(shù)據(jù)庫都支持參數(shù)化查詢丰包。


第二組:趙彩鳳 改變超鏈接樣式、AppCan--Switch開關(guān)組件

  1. 改變超鏈接樣式
<style type="text/css">
a:link {color: #FF0000}     /* 未訪問的鏈接 */
a:visited {color: #00FF00}  /* 已訪問的鏈接 */
a:hover {color: #FF00FF}    /* 鼠標(biāo)移動到鏈接上 */
a:active {color: #0000FF}   /* 選定的鏈接 */
</style>
  1. AppCan--Switch開關(guān)組件

(1)對象

appcan.switchBtn(selector, css, callback)
Selector  按鈕的選擇器壤巷,例如 .btn邑彪、div或#id‰驶可同時處理多個按鈕
css Switch  開啟后的背景CSS類名稱寄症。預(yù)置 bc-head宙彪。可選參數(shù) 
callback switch  狀態(tài)變更后的回調(diào)函數(shù)

(2)代碼
HTML:

 <div class="switch uba bc-border data-checked="true">
        <div class="switch-btn sc-bg-active "></div>
</div>

JS:

appcan.switchBtn(switchBtns,function(obj,value) {
            console.log(“switch status:”,value);
})
appcan.updateSwitch(obj)有巧;//obj:需要操作的dom對象

E.g.

<div class="switch uba bc-border" data-checked="true">
    <div class="switch-btn sc-bg-active "></div>
</div>
appcan.updateSwitch($('.switch'))

第三組:蔡永堅 Asp.Net底層解析-頁面生命周期

頁面生命周期總體理解起來其實很容易释漆,說白了就是在客戶端提出了一個頁面請求之后,服務(wù)器端將ASPX頁面源代碼轉(zhuǎn)化為正確的HTML和JS代碼的整個過程篮迎。服務(wù)端在轉(zhuǎn)化的過程中當(dāng)然不是調(diào)用一兩個方法就能解決了的男图,是經(jīng)歷被設(shè)計好的若干個階段,一步一步完成的甜橱,且各個階段的功能很明確彼此是承前啟后的關(guān)系逊笆。這些階段大體上可以分為:初始化、加載岂傲、回發(fā)事件處理难裆、呈現(xiàn)、卸載等等镊掖。關(guān)于這些階段的具體細(xì)節(jié)本文將在后面說明差牛,現(xiàn)在先來看一個簡單的從整體上反映頁面生命周期的實例(頁面周期每達(dá)到一個事件時,就往頁面中寫入一些字符串)堰乔,新建一個空頁面偏化,并在后臺編寫以下代碼:

[csharp] view plain copy
1.  protected void Page_PreInit(object sender, EventArgs e)  
2.  {   //這里設(shè)置斷點  
3.      Response.Write("執(zhí)行Page_PreInit<br/>");  
4.  }  
5.  protected void Page_Init(object sender, EventArgs e)  
6.  {   //這里設(shè)置斷點  
7.      Response.Write("執(zhí)行Page_Init<br/>");  
8.  }  
9.  protected void Page_InitComplete(object sender, EventArgs e)  
10. {   //這里設(shè)置斷點  
11.     Response.Write("執(zhí)行Page_InitComplete<br/>");  
12. }  
13. protected void Page_PreLoad(object sender, EventArgs e)  
14. {   //這里設(shè)置斷點  
15.     Response.Write("執(zhí)行Page_PreLoad<br/>");  
16. }  
17. protected void Page_Load(object sender, EventArgs e)  
18. {   //這里設(shè)置斷點  
19.     Response.Write("執(zhí)行Page_Load<br/>");  
20. }  
21. protected void Page_LoadComplete(object sender, EventArgs e)  
22. {   //這里設(shè)置斷點  
23.     Response.Write("執(zhí)行Page_LoadComplete<br/>");  
24. }  
25. protected void Page_PreRender(object sender, EventArgs e)  
26. {   //這里設(shè)置斷點  
27.     Response.Write("執(zhí)行Page_PreRender<br/>");  
28. }  
29. protected void Page_PreRenderComplete(object sender, EventArgs e)  
30. {   //這里設(shè)置斷點  
31.     Response.Write("執(zhí)行Page_PreRenderComplete<br/>");  
32. }  
33. protected void Page_SaveStateComplete(object sender, EventArgs e)  
34. {   //這里設(shè)置斷點  
35.     Response.Write("執(zhí)行Page_SaveStateComplete<br/>");  
36. }  
37. protected void Page_Unload(object sender, EventArgs e)  
38. {   //這里設(shè)置斷點  
39.     //這里是頁面卸載階段,不能使用Response.Write方法镐侯,一般該事件內(nèi)執(zhí)行釋放本頁面控制的系統(tǒng)資源  
40. }   

如果在每個方法的內(nèi)部都設(shè)置了斷點侦讨,那么當(dāng)運行該頁面后會發(fā)現(xiàn),斷點的觸發(fā)是從頂部往底部依次執(zhí)行的苟翻,觸發(fā)一個事件之后再觸發(fā)下一步事件韵卤,有條不紊,最終得到頁面效果如下截圖所示:

上面的示例是每次頁面(無論是首次請求還是PostBack)的請求都要觸發(fā)的一系列事件崇猫,而當(dāng)請求為PostBack時沈条,會在Page_Load事件與Page_LoadComplete事件之間觸發(fā)引起本次PostBack的控件對應(yīng)的事件,在上面的示例上進(jìn)行簡單的修改诅炉,前臺頁面添加Bot同控件蜡歹,代碼如下:

[html] view plain copy
1.  <form id="form1" runat="server">  
2.  <asp:Button ID="aspbtn_TestPostBack" runat="server" Text="點擊提交"   
3.      onclick="aspbtn_TestPostBack_Click" />  
4.  </form>  

后臺代碼與上面的示例一致,只是添加了Button控件的Click事件對應(yīng)的方法涕烧,添加的方法如下:

[csharp] view plain copy
1.  //這里是Button的Click事件  
2.  protected void aspbtn_TestPostBack_Click(object sender, EventArgs e)  
3.  {  
4.      Response.Write("執(zhí)行Button控件的Click事件<br/>");  
5.  }  

首次運行頁面得到結(jié)果與上次示例一致月而,而當(dāng)點擊按鈕產(chǎn)生PostBack時,發(fā)現(xiàn)在Page_Load事件與Page_LoadComplete事件之間執(zhí)行了按鈕的事件议纯,即aspbtn_TestPostBack_Click方法父款。


第四組:張元一 iOS獲取系統(tǒng)電量

EFB項目中,需要實現(xiàn)后臺持續(xù)監(jiān)控電量的功能,這可以拆分為三個需求:

  1. 程序需要保持在后臺可以運行憨攒。
  2. 程序需要獲取ipad精確電量世杀。
  3. 需要每隔一段時間掃描一次電量,以獲取當(dāng)前有效的電量肝集。

上次文章實現(xiàn)了需求一玫坛,本文先討論需求二的實現(xiàn):
獲取ios系統(tǒng)電量,有幾種方法:

方法一:

通過蘋果官方文檔里面UIDevice public API來獲取包晰,代碼如下:

 [UIDevice currentDevice].batteryMonitoringEnabled = YES;
    [[NSNotificationCenter defaultCenter]
   addObserverForName:UIDeviceBatteryLevelDidChangeNotification
     object:nil queue:[NSOperationQueue mainQueue]
     usingBlock:^(NSNotification *notification) {
         self.myVC.batteryLevellb.text = [NSString stringWithFormat:@"CurrentBatteryLevel:%.f%%",[UIDevice currentDevice].batteryLevel*100];
}];

方法獲取的電量是1%精度的湿镀,可以滿足要求。

方法二:通過runtime 獲取StatusBar上電池電量控件類私有變量的值伐憾,此方法可精準(zhǔn)獲取iOS6以上電池電量
- (int)getCurrentBatteryLevel
{
    
    UIApplication *app = [UIApplication sharedApplication];
    if (app.applicationState == UIApplicationStateActive||app.applicationState==UIApplicationStateInactive) {
        Ivar ivar=  class_getInstanceVariable([app class],"_statusBar");
        id status  = object_getIvar(app, ivar);
        for (id aview in [status subviews]) {
            int batteryLevel = 0;
            for (id bview in [aview subviews]) {
                if ([NSStringFromClass([bview class]) caseInsensitiveCompare:@"UIStatusBarBatteryItemView"] == NSOrderedSame&&[[[UIDevice currentDevice] systemVersion] floatValue] >=6.0)
                {
                    
                    Ivar ivar=  class_getInstanceVariable([bview class],"_capacity");
                    if(ivar)
                    {
                        batteryLevel = ((int (*)(id, Ivar))object_getIvar)(bview, ivar);
                        //這種方式也可以
                        /*ptrdiff_t offset = ivar_getOffset(ivar);
                         unsigned char *stuffBytes = (unsigned char *)(__bridge void *)bview;
                         batteryLevel = * ((int *)(stuffBytes + offset));*/
                        NSLog(@"電池電量:%d",batteryLevel);
                        if (batteryLevel > 0 && batteryLevel <= 100) {
                            return batteryLevel;
                            
                        } else {
                            return 0;
                        }
                    }
                    
                }
                
            }
        }
    }
    
    return 0;
}

經(jīng)測試勉痴,此方法獲取電量精度為5%,且在程序退出到后臺后树肃,此方法不能獲取到電量蒸矛,不能滿足要求。

方法三:

通過IOKit framework來獲取

IOKit framework在IOS中用來跟硬件或內(nèi)核服務(wù)通信胸嘴,常用于獲取硬件詳細(xì)信息雏掠。

首先,需要將IOPowerSources.h劣像,IOPSKeys.h乡话,IOKit三個文件導(dǎo)入到工程中。然后即可通過如下代碼獲取1%精確度的電量信息:

-(double) getBatteryLevel{
    // returns a blob of power source information in an opaque CFTypeRef
    CFTypeRef blob = IOPSCopyPowerSourcesInfo();
    // returns a CFArray of power source handles, each of type CFTypeRef
    CFArrayRef sources = IOPSCopyPowerSourcesList(blob);
    CFDictionaryRef pSource = NULL;
    const void *psValue;
    // returns the number of values currently in an array
    int numOfSources = CFArrayGetCount(sources);
    // error in CFArrayGetCount
    if (numOfSources == 0) {
        NSLog(@"Error in CFArrayGetCount");
        return -1.0f;
    }
    
    // calculating the remaining energy
    for (int i=0; i<numOfSources; i++) {
        // returns a CFDictionary with readable information about the specific power source
        pSource = IOPSGetPowerSourceDescription(blob, CFArrayGetValueAtIndex(sources, i));
        if (!pSource) {
            NSLog(@"Error in IOPSGetPowerSourceDescription");
            return -1.0f;
        }
        psValue = (CFStringRef) CFDictionaryGetValue(pSource, CFSTR(kIOPSNameKey));
        
        int curCapacity = 0;
        int maxCapacity = 0;
        double percentage;
        
        psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSCurrentCapacityKey));
        CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &curCapacity);
        
        psValue = CFDictionaryGetValue(pSource, CFSTR(kIOPSMaxCapacityKey));
        CFNumberGetValue((CFNumberRef)psValue, kCFNumberSInt32Type, &maxCapacity);
        
        percentage = ((double) curCapacity / (double) maxCapacity * 100.0f);
        NSLog(@"curCapacity : %d / maxCapacity: %d , percentage: %.1f ", curCapacity, maxCapacity, percentage);
        return percentage;
    }
    return -1.0f;
}

相比方法一耳奕,此方法麻煩很多绑青,不過現(xiàn)在的EFB使用的是這種方式。

本項目demo的GitHub地址:
https://github.com/Frued/BatteryLevel


第五組:陳孚楠 javascript使用的兩項原則

兩項原則之平穩(wěn)退化和漸進(jìn)增強

  1. 平穩(wěn)退化
    如果正確地使用了JavaScript腳本屋群,就可以讓訪問者在他們?yōu)g覽器不支持javascript的情況下仍能順利地瀏覽你的網(wǎng)站闸婴。
    即當(dāng)客戶禁止javascript功能后,仍能看到網(wǎng)頁的內(nèi)容芍躏。

  2. 漸進(jìn)增強
    即用一些額外的信息層去包裹原始數(shù)據(jù)邪乍。若按照“漸進(jìn)增強”原則創(chuàng)建的網(wǎng)頁幾乎都能符合“平穩(wěn)退化”原則。
    例如:先只使用常規(guī)的鏈接对竣,然后通過JavaScript去攔截默認(rèn)動作庇楞。同理:先構(gòu)建常規(guī)網(wǎng)站,然后再Hijax它
    大概可以說:
    “平穩(wěn)退化”是在瀏覽器沒有JavaScript功能柏肪,或沒有開啟JavaScript功能情況下姐刁,我們解決這種問題的方式;
    “漸進(jìn)增強”是在瀏覽器開啟JavaScript功能后烦味,如果瀏覽器版本不支持某些JavaScript能力,我們解決這種問題的方式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谬俄,一起剝皮案震驚了整個濱河市柏靶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌溃论,老刑警劉巖屎蜓,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钥勋,居然都是意外死亡炬转,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門算灸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扼劈,“玉大人,你說我怎么就攤上這事菲驴〖龀常” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵赊瞬,是天一觀的道長先煎。 經(jīng)常有香客問我,道長巧涧,這世上最難降的妖魔是什么薯蝎? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮谤绳,結(jié)果婚禮上良风,老公的妹妹穿的比我還像新娘。我一直安慰自己闷供,他們只是感情好烟央,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歪脏,像睡著了一般疑俭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婿失,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天钞艇,我揣著相機與錄音,去河邊找鬼豪硅。 笑死哩照,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的懒浮。 我是一名探鬼主播飘弧,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼识藤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了次伶?” 一聲冷哼從身側(cè)響起痴昧,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎冠王,沒想到半個月后赶撰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡柱彻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年豪娜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哟楷。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘤载,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吓蘑,到底是詐尸還是另有隱情惕虑,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布磨镶,位于F島的核電站溃蔫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏琳猫。R本人自食惡果不足惜伟叛,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脐嫂。 院中可真熱鬧统刮,春花似錦、人聲如沸账千。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匀奏。三九已至鞭衩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娃善,已是汗流浹背论衍。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留聚磺,地道東北人坯台。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像瘫寝,于是被迫代替她去往敵國和親蜒蕾。 傳聞我的和親對象是個殘疾皇子稠炬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350