<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    云自無心水自閑

    天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
    posts - 288, comments - 524, trackbacks - 0, articles - 6
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    先給一個例子:
    $http. get('/remote/item' ). then(function(response) {
    console.log('成功。');
    }, function(errResponse) {
    console. error('出錯.' );
    });

    一。介紹Promise
    在這個例子中,$http.get()函數返回了一個Promise對象, 有了這個對象,我們才能很方便地直接在后面添加then函數的定義。
    Promise對象在AngularJS中是一個非常重要的存在。它提供了強大的功能和便利性。

    1。異步性
    從定義的語法上看,操作似乎是同步的,但是Promise的工作其實是異步的,只有在服務端返回數據后,后續的函數才會被調用。這是一個事件驅動,非阻塞式的框架。

    2。它避免了其它框架的嵌套回調函數的缺點。
    -所有異步任務都會返回一個Promise對象
    -每個Promise對象都有一個then函數,then函數有兩個參數,分別是成功處理函數和失敗處理函數
    -失敗處理函數和成功處理函數都只會在異步處理完成后被調用一次
    -then函數也會返回Promise對象,這樣,我們可以把多個函數串連起來成為一個函數鏈
    -成功處理函數和失敗處理函數的返回值可以被傳遞到函數鏈下一個的函數中
    -如果在成功(或者失敗)處理函數中,又開始了一個異步調用,那么函數鏈中的函數將會在這個異步調用結束后才開始

    二。異步鏈式調用的后續處理
    假如我們定義了如下的函數鏈:
    $http.get('/item').then(s1, e1).then(s2, e2).then(s3, e3);
    我們如何自主的根據函數鏈中每個函數的運行結果,決定觸發后續函數的成功處理函數或者失敗處理函數呢?
    比如說,在s1處理過程中,發生問題,于是我們觸發了e2, 但是在e2處理完后,我們又想觸發s3.
    AnguarJS提供了$q來滿足這樣的需求。
    如果我們想觸發函數鏈中下一個函數的成功處理,我們只需要最后給出一個返回值,有了返回值,AngularJS會認為函數執行正確,自動調用下一個函數中的成功處理
    如果想觸發失敗處理,那么可以簡單地返回$q.reject(data),這樣就會觸發下一個函數的失敗處理

    posted @ 2015-02-27 18:39 云自無心水自閑 閱讀(2637) | 評論 (1)編輯 收藏



    在前文(http://www.tkk7.com/usherlight/archive/2015/02/01/422633.html)中我們曾經介紹過,定義controller時,需要2個參數,第一個參數是controller的名稱,第二個參數是一個數組,數組的最后一個元素將是controller的函數,前面的參數是controller的依賴項。我們現在就來仔細分析一下其中的具體過程。

    先給一個例子:
    angular. module('notesApp' , [])
     . controller('MainCtrl' , ['$log' , function($log) {
     var self = this;
     self. logStuff = function() {
     $log. log('The button was pressed' );
     };
     }])

    在這個例子中可以看到,我們在第一個參數中用字符串(服務名稱)添加了一個依賴項。當我們通過字符串聲明了這一個服務之后,我們就可以把它當作一個變量注入到函數中。AngularJS會自動查找字符串名稱對應的服務名,按照順序將其注入到函數中。
    myModule.controller("MainCtrl",  ["$log", "$window", function($l, $w) {}]);
    在這個例子中,$log, $windows是AngularJS自帶的兩個服務,在數組中通過名稱聲明后,會被注入到函數的兩個參數中。
    比較常用的AngularJS自帶的服務有:$window, $location, $http等

    從上面的例子中可以看出,AngularJS的設計思想就是不要在函數中自己去實例化或者通過其它途徑來獲取服務的實例,而是聲明需要的對象,由AngularJS來注入具體的實例。

    創建自己的服務
    什么時候應該創建服務,而不是controller呢?
    1。 需要重用的時候
    2。需要保留應用級的狀態。這是非常重要的一點,controller是會不斷地被創建和銷毀的,如果需要保存應用級的狀態,就需要使用service
    3。和頁面顯示無關
    4。需要和第三方服務整合
    5。緩存

    服務是會被延遲加載的,也就是說只有在第一次被引用的時候,才會被創建。
    服務將會被定義一次,也只會被實例化一次。

    posted @ 2015-02-09 19:28 云自無心水自閑 閱讀(7296) | 評論 (0)編輯 收藏

         摘要: 默認情況下,每隔一秒種,SpringLoaded就會掃描類路徑,自動加載改變過的類, 而不需要重新啟動應用  閱讀全文

    posted @ 2015-02-07 09:16 云自無心水自閑 閱讀(11142) | 評論 (4)編輯 收藏

    07. ng-repeart
    a. 在循環map的時候,會自動根據鍵值進行排序。
    b. 一些自帶的變量,$first(是否是第一個), $last(是否是最后一個), $middle(是否是中間的), $index(下標,根據鍵值排序后的下標), $even, $odd
    08. 自己定義新變量時不要使用$$開頭。
    09. 可以使用track-by表達式來優化對DOM的操作,對DOM對象使用從數據庫取得的ID來進行標記,這樣的話,當我們重復多次從數據庫中取出相同的數據的時候,DOM對象就能夠被重用。
    10. 數據雙向綁定的好處
    a. 如果我們想改變頁面Form中的數值,我們不需要在Javascript中,根據ID或者名稱來查找相應的Form控件,只需要改變Controller變量的值,不需要JQuery的Selector,也不需要findElementByID
    b. 如果我們想在javascript中獲取Form控件的值,在控件的變量中就能直接獲得。
    11. 使用ng-submit比在button上使用ng-click要好一些。HTML的表單的提交有多種方式,比如在輸入域中按回車鍵就會觸發ng-submit,而不會觸發button的ng-click事件。
    12. 在ng-model中,可以直接引用一個對象,比如:<input type="text" ng-model="ctrl.user.name">,而不需要事先在model中以self.user={}定義。在AngularJS中,使用了ng-model的話,AngularJS在初始化數據綁定的時候,自動創建其中的對象和鍵值。在剛才的例子中,一旦用戶開始在輸入域中鍵入第一個字母,用戶user就會被自動創建。
    13. 推薦使用將相關數據集中到一個對象的方式來進行數據綁定,比如,用戶名和密碼,推薦使用:
    <input type="text" ng-model="ctrl.user.name">
    <input type="text" ng-model="ctrl.user.password">
    而不是:
    <input type="text" ng-model="ctrl.name">
    <input type="text" ng-model="ctrl.password">

    posted @ 2015-02-03 19:36 云自無心水自閑 閱讀(2650) | 評論 (1)編輯 收藏

    1. AngularJS的module函數有兩種用法,
    a. 定義一個module, 需要傳入2個參數,module('moduleName', []), 第一個參數是新的module名稱,第二個參數是新module所依賴的module數組。
    b. 載入一個module, 只需要1個參數,module('moduleName'), 唯一的一個參數指定要載入的module名稱。
    2. 使用controller函數來定義一個控制器(controller), 用ng-controller將控制器綁定到具體的HTML組件上。定義控制器的controller函數也需要2個參數,第一個是控制器名稱,第二個參數同樣也是一個數組,數組的最后一個元素就是controller本身的函數,前面的元素用字符串的形式指定其需要的依賴項。如果沒有依賴項,那就只需要定義函數。比如:
    angular.module('app1', [])
    .controller('mainControl', [function() {
    console.log('controller created.');
    }]);
    3. 在controller函數中用var定義的局部變量,在HTML中是不可見的。
    4. 推薦在controller函數中盡量避免直接引用this, 比較好的做法是使用代理。原因是一個函數中的this關鍵詞在被外部調用的時候,是會被覆蓋掉的。這樣的話,在函數內部和外部的this會是完全不同兩個對象。
    代理用法示例:
    angular.module('app1', [])
    .controller('mainControl', [function() {
    var self = this;
    self.message = 'Hello world';
    self.changeMessage = function() {
    self.message = 'Goodbye.';
    };
    }]);
    5. ng-bind與雙大括號的區別, ng-bind和{{}}可以說基本上是可以互相替換的,但是也有區別。區別在于:AngularJS在啟動的時候就會執行ng-bind, 而{{}}的替換時間會稍晚一些。有可能發現頁面在加載的時候,雙括號被一閃而過地替換掉(只在頁面初次加載的時候發生)。但是ng-bind就沒有這個問題。
    6. ng-cloak可以用于解決雙括號閃現的問題。

    posted @ 2015-02-01 19:19 云自無心水自閑 閱讀(5038) | 評論 (1)編輯 收藏

    1. HTML頁面的加載,這會觸發加載頁面包含的所有JS (包括 AngularJS)
    2. AngularJS啟動,搜尋所有的指令(directive)
    3. 找到ng-app,搜尋其指定的模塊(Module),并將其附加到ng-app所在的組件上。
    4. AnguarJS遍歷所有的子組件,查找指令和bind命令
    5. 每次發現ng-controller或者ng-repeart的時候,它會創建一個作用域(scope),這個作用域就是組件的上下文。作用域指明了每個DOM組件對函數、變量的訪問權。
    6. AngularJS然后會添加對變量的監聽器,并監控每個變量的當前值。一旦值發生變化,AngularJS會更新其在頁面上的顯示。
    7. AngularJS優化了檢查變量的算法,它只會在某些特殊的事件觸發時,才會去檢查數據的更新,而不是簡單地在后臺不停地輪詢。

    posted @ 2015-01-31 20:36 云自無心水自閑 閱讀(4791) | 評論 (2)編輯 收藏

    Java虛擬機規范規定JVM的內存分為了好幾塊,比如堆,棧,程序計數器,方法區等,而Hotspot jvm的實現中,將堆內存分為了三部分,新生代,老年代,持久帶,其中持久帶實現了規范中規定的方法區,而內存模型中不同的部分都會出現相應的OOM錯誤,接下來我們就分開來討論一下。 

    棧溢出(StackOverflowError) 

    棧溢出拋出java.lang.StackOverflowError錯誤,出現此種情況是因為方法運行的時候棧的深度超過了虛擬機容許的最大深度所致。 

    出現這種情況,一般情況下是程序錯誤所致的,比如寫了一個死遞歸,就有可能造成此種情況。 下面我們通過一段代碼來模擬一下此種情況的內存溢出。 
    Java代碼 
    1. import java.util.*;  
    2. import java.lang.*;  
    3. public class OOMTest{  
    4.    
    5.   public void stackOverFlowMethod(){  
    6.       stackOverFlowMethod();  
    7.   }  
    8.    
    9.   public static void main(String... args){  
    10.       OOMTest oom = new OOMTest();  
    11.       oom.stackOverFlowMethod();  
    12.   }  
    13.    
    14. }  

    運行上面的代碼,會拋出如下的異常: 
    引用

    Exception in thread "main" java.lang.StackOverflowError 
            at OOMTest.stackOverFlowMethod(OOMTest.java:6) 

    堆溢出(OutOfMemoryError:java heap space) 

    堆內存溢出的時候,虛擬機會拋出java.lang.OutOfMemoryError:java heap space,出現此種情況的時候,我們需要根據內存溢出的時候產生的dump文件來具體分析(需要增加-XX:+HeapDumpOnOutOfMemoryErrorjvm啟動參數)。出現此種問題的時候有可能是內存泄露,也有可能是內存溢出了。 
    如果內存泄露,我們要找出泄露的對象是怎么被GC ROOT引用起來,然后通過引用鏈來具體分析泄露的原因。 
    如果出現了內存溢出問題,這往往是程序本生需要的內存大于了我們給虛擬機配置的內存,這種情況下,我們可以采用調大-Xmx來解決這種問題。 

    下面我們通過如下的代碼來演示一下此種情況的溢出: 
    Java代碼 
    1. import java.util.*;  
    2. import java.lang.*;  
    3. public class OOMTest{  
    4.    
    5.         public static void main(String... args){  
    6.                 List<byte[]> buffer = new ArrayList<byte[]>();  
    7.                 buffer.add(new byte[10*1024*1024]);  
    8.         }  
    9.    
    10. }  

    我們通過如下的命令運行上面的代碼: 

    Java代碼 
    1. java -verbose:gc -Xmn10M -Xms20M -Xmx20M -XX:+PrintGC OOMTest  


    程序輸入如下的信息: 
    引用

    [GC 1180K->366K(19456K), 0.0037311 secs] 
    [Full GC 366K->330K(19456K), 0.0098740 secs] 
    [Full GC 330K->292K(19456K), 0.0090244 secs] 
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
            at OOMTest.main(OOMTest.java:7) 

    從運行結果可以看出,JVM進行了一次Minor gc和兩次的Major gc,從Major gc的輸出可以看出,gc以后old區使用率為134K,而字節數組為10M,加起來大于了old generation的空間,所以拋出了異常,如果調整-Xms21M,-Xmx21M,那么就不會觸發gc操作也不會出現異常了。 

    通過上面的實驗其實也從側面驗證了一個結論:當對象大于新生代剩余內存的時候,將直接放入老年代,當老年代剩余內存還是無法放下的時候,出發垃圾收集,收集后還是不能放下就會拋出內存溢出異常了 

    持久帶溢出(OutOfMemoryError: PermGen space) 

    我們知道Hotspot jvm通過持久帶實現了Java虛擬機規范中的方法區,而運行時的常量池就是保存在方法區中的,因此持久帶溢出有可能是運行時常量池溢出,也有可能是方法區中保存的class對象沒有被及時回收掉或者class信息占用的內存超過了我們配置。當持久帶溢出的時候拋出java.lang.OutOfMemoryError: PermGen space。 
    我在工作可能在如下幾種場景下出現此問題。 

    1.使用一些應用服務器的熱部署的時候,我們就會遇到熱部署幾次以后發現內存溢出了,這種情況就是因為每次熱部署的后,原來的class沒有被卸載掉。 
    2.如果應用程序本身比較大,涉及的類庫比較多,但是我們分配給持久帶的內存(通過-XX:PermSize和-XX:MaxPermSize來設置)比較小的時候也可能出現此種問題。 
    3.一些第三方框架,比如spring,hibernate都通過字節碼生成技術(比如CGLib)來實現一些增強的功能,這種情況可能需要更大的方法區來存儲動態生成的Class文件。 
    我們知道Java中字符串常量是放在常量池中的,String.intern()這個方法運行的時候,會檢查常量池中是否存和本字符串相等的對象,如果存在直接返回對常量池中對象的引用,不存在的話,先把此字符串加入常量池,然后再返回字符串的引用。那么我們就可以通過String.intern方法來模擬一下運行時常量區的溢出.下面我們通過如下的代碼來模擬此種情況: 
    Java代碼 
    1. import java.util.*;  
    2. import java.lang.*;  
    3. public class OOMTest{  
    4.    
    5.         public static void main(String... args){  
    6.                 List<String> list = new ArrayList<String>();  
    7.                 while(true){  
    8.                         list.add(UUID.randomUUID().toString().intern());  
    9.                 }  
    10.         }  
    11.    
    12. }  

    我們通過如下的命令運行上面代碼: 
    java -verbose:gc -Xmn5M -Xms10M -Xmx10M -XX:MaxPermSize=1M -XX:+PrintGC OOMTest 
    運行后的輸入如下圖所示: 
    引用

    Exception in thread "main" java.lang.OutOfMemoryError: PermGen space 
            at java.lang.String.intern(Native Method) 
            at OOMTest.main(OOMTest.java:8) 

    通過上面的代碼,我們成功模擬了運行時常量池溢出的情況,從輸出中的PermGen space可以看出確實是持久帶發生了溢出,這也驗證了,我們前面說的Hotspot jvm通過持久帶來實現方法區的說法。 

    OutOfMemoryError:unable to create native thread 

    最后我們在來看看java.lang.OutOfMemoryError:unable to create natvie thread這種錯誤。 出現這種情況的時候,一般是下面兩種情況導致的: 

    1.程序創建的線程數超過了操作系統的限制。對于Linux系統,我們可以通過ulimit -u來查看此限制。 
    給虛擬機分配的內存過大,導致創建線程的時候需要的native內存太少。我們都知道操作系統對每個進程的內存是有限制的,我們啟動Jvm,相當于啟動了一個進程,假如我們一個進程占用了4G的內存,那么通過下面的公式計算出來的剩余內存就是建立線程棧的時候可以用的內存。 線程棧總可用內存=4G-(-Xmx的值)- (-XX:MaxPermSize的值)- 程序計數器占用的內存 通過上面的公式我們可以看出,-Xmx 和 MaxPermSize的值越大,那么留給線程棧可用的空間就越小,在-Xss參數配置的棧容量不變的情況下,可以創建的線程數也就越小。因此如果是因為這種情況導致的unable to create native thread,那么要么我們增大進程所占用的總內存,或者減少-Xmx或者-Xss來達到創建更多線程的目的。

    posted @ 2015-01-20 07:12 云自無心水自閑 閱讀(877) | 評論 (0)編輯 收藏

    現在的顯示屏都在飚像素,商家的宣傳一個比一個噱頭大,什么 Retina、4K、8K 這種名詞一個接一個的出來, 這些到底都是啥意思?
     
    首先,Retina 和 4K 以及 8K 并不是同一層面的定義。屏幕一般是以像素點做單位的,4K 和 8K 就是直接限定了像素點的多少,而 Retina 則是沒有硬性的規范。

    Retina 屏幕的概念最早由蘋果公司執行長史蒂夫·喬布斯(Steve Jobs)于 WWDC2010 發布 iPhone 4 時提出的。

      定義是:要求在正常觀看距離下,足以使人肉眼無法分辨其中的單獨像素。因此它并沒有限定像素值多少。

    4K 就是水平方向每一行的像素值達到或是接近 1024 的 4 倍,8K 就是達到或接近 8 倍。

      以此為標準,4K 一般圖像就是指 4096*2160 的分辨率。當然,這也不是硬性要求,像市場上很多 4K 屏幕其實是 3840*2160 或是 3656*2664,這些都是 4K 圖像分辨率的范疇。

      8K 就是分辨率在 7680*4320 左右。

    順便說一下,720p 則是指豎直方向的像素點達到 720 個,1080p 則是 1080 個,“P”是逐行掃描的意思

    問:那到底 Retina 和 4K 或是 Retina 和 8K 哪個更清楚呢?

      答:不一定,二者不能平行比較。

      因為 4K 和 8K 是限定了像素點的多少,而 Retina 是要求正常距離看不到像素點。

      舉個例子:如果放到正常的 42 寸屏幕上,4K 和 8K 在正常距離觀看下都看不到像素點,那么兩者都可以被稱作“Retina 屏幕”。

          可是如果給你一臺 500 寸的巨大屏幕,那么即便是 8K 也會到處是馬賽克,這時 Retina 觀感依然是高清無像素點,必然比 8K 和 4K 清楚的多。

    posted @ 2015-01-15 07:17 云自無心水自閑 閱讀(656) | 評論 (0)編輯 收藏


    Last_SQL_Error: Error 'Lock wait timeout exceeded; try restarting transaction' on query. Default database: 'test'. Query: 'DELETE FROM table1 WHERE id = 361'
    1 row in set (0.00 sec)

    solution:
    restart slave;

    stop slave;
    start slave;

    posted @ 2015-01-13 08:01 云自無心水自閑 閱讀(599) | 評論 (0)編輯 收藏

    1. server.xml
    在<engine>中添加
    <Realm className="org.apache.catalina.realm.MemoryRealm" />
    2. tomcat-user.xml
    <role rolename="manager"/>   
    <role rolename="manager-gui"/>

    <user username="admin" password="tomcat" roles="manager"/>

    posted @ 2015-01-09 09:32 云自無心水自閑 閱讀(673) | 評論 (0)編輯 收藏

    僅列出標題
    共29頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
    主站蜘蛛池模板: 1000部啪啪毛片免费看| 亚洲αv在线精品糸列| 日本XXX黄区免费看| 成全高清视频免费观看| 在线成人a毛片免费播放| 浮力影院第一页小视频国产在线观看免费 | 91精品成人免费国产片| 免费无码又爽又刺激高潮| 亚洲冬月枫中文字幕在线看| 亚洲一区二区三区深夜天堂| 四虎永久在线精品免费一区二区| 一区二区三区免费电影| 51视频精品全部免费最新| 亚洲系列国产精品制服丝袜第| 亚洲av永久无码精品网址| 两性色午夜视频免费网| 岛国av无码免费无禁网站| 亚洲乱亚洲乱妇无码麻豆| 亚洲资源最新版在线观看| 中文字幕免费在线视频| 久久亚洲国产成人亚| 亚洲精品自偷自拍无码| 中文字幕无码免费久久| 日韩中文无码有码免费视频| 久久精品国产亚洲av麻| 99精品视频在线观看免费专区| 国产v片免费播放| 亚洲人和日本人jizz| 成人奭片免费观看| 美女一级毛片免费观看| 欧美在线看片A免费观看| 国产精品亚洲专区无码唯爱网 | 亚洲VA成无码人在线观看天堂| 四虎国产成人永久精品免费| va亚洲va日韩不卡在线观看| 亚洲大香伊人蕉在人依线| 久久永久免费人妻精品下载| 国产99在线|亚洲| 精品亚洲一区二区三区在线观看 | 黄人成a动漫片免费网站| 亚洲Av无码专区国产乱码DVD|