J2EE學(xué)習(xí)筆記
          我們的失落……
          posts - 13,comments - 1,trackbacks - 0
               摘要: 提起Java內(nèi)部類(Inner Class)可能很多人不太熟悉,實(shí)際上類似的概念在C++里也有,那就是嵌套類(Nested Class),關(guān)于這兩者的區(qū)別與聯(lián)系,在下文中會(huì)有對(duì)比。內(nèi)部類從表面上看,就是在類中又定義了一個(gè)類(下文會(huì)看到,內(nèi)部類可以在很多地方定義),而實(shí)際上并沒有那么簡單,乍看上去內(nèi)部類似乎有些多余,它的用處對(duì)于初學(xué)者來說可能并不是那么顯著,但是隨著對(duì)它的深入了解,你會(huì)發(fā)現(xiàn)Java的...  閱讀全文
          posted @ 2010-06-30 14:26 J2EE學(xué)習(xí)筆記 閱讀(307) | 評(píng)論 (0)編輯 收藏

          在JScript的眾多運(yùn)算符里,提供了三個(gè)邏輯運(yùn)算符&&||!,噢?! 是高級(jí)語言都提供的。按我們對(duì)邏輯運(yùn)算的正常認(rèn)識(shí),邏輯運(yùn)算的結(jié)果因該是ture或者false。但是JScript的邏輯運(yùn)算卻不完全是這么定義的,這里只有!運(yùn)算符總是返回true|false,而||和&&運(yùn)算比較的好玩。

              JScript對(duì)于邏輯運(yùn)算的true|false是這么定義的:

          • 所有對(duì)象都被認(rèn)為是 true。
          • 字符串當(dāng)且僅當(dāng)為空(""或'')時(shí)才被認(rèn)為是 false。
          • null 和未定義的均被認(rèn)為是 false。
          • 數(shù)字當(dāng)且僅當(dāng)為 0 時(shí)才是 false。

              可是邏輯運(yùn)算符||&&雖然遵循上面的定義規(guī)則,但是它們返回的值卻很有意思。
              對(duì)于&&運(yùn)算,按照上面的規(guī)則,表達(dá)式 if ( 'abc' && '123' && new Date() ) 是執(zhí)行true分支,可是這個(gè)表達(dá)式如果寫成:

          var value = 'abc' && '123&& new Date();

           

              結(jié)果value=Fri Jan 21 00:01:17 UTC+0800 2005,原它從左到右檢測(cè),如果到了最后一個(gè)表達(dá)式也是為true的,就返回那個(gè)表達(dá)式。

              對(duì)于||運(yùn)算同理,對(duì)于下面的表達(dá)式:

          var value1 = 'abc' || '123|| null || false;
          var value2 = null || '' || false || 'ok';

           

              結(jié)果value1='abc',value2='ok'。這是因?yàn)閨|運(yùn)算會(huì)有"短路"特性,他也是從左向右檢測(cè),只不過它是一但發(fā)現(xiàn)有為true的值,就立即返回該表達(dá)式。
              這樣的特性可以幫組我們寫出精簡的代碼,可是同時(shí)也帶來代碼不便于閱讀維護(hù)的問題。
              由于我手頭暫時(shí)沒有NS和moz什么的瀏覽器,不知道標(biāo)準(zhǔn)JavaScript是否也是這樣支持的?如果您方便的話,請(qǐng)告如我運(yùn)行后的結(jié)果

          posted @ 2010-05-13 15:11 J2EE學(xué)習(xí)筆記 閱讀(188) | 評(píng)論 (0)編輯 收藏

          有時(shí)你可能需要對(duì)變量進(jìn)行類型檢查,或者判斷變量是否已定義。有兩種方法可以使用:typeof函數(shù)與constructor屬性。

          typeof函數(shù)的用法可能不用我多說,大家都知道怎么用。而constructor屬性大家可能就陌生點(diǎn)。在《精通JavaScript》這本書中有提到construct的用法,但我用自己的幾個(gè)瀏覽器(IE7.0 / Firefox1.9 / Opera9.50)測(cè)試的結(jié)果卻和書上說的不一樣。但是仍然是有辦法通過constructor屬性來檢查變量類型的。
          這里先補(bǔ)充一下,為什么明明有typeof函數(shù)可以很方便地用來檢測(cè)類型,還要用constructor呢?
          因?yàn)閠ypeof會(huì)把所有的數(shù)組類型以及用戶自定義類型判斷為object,從而無法知道更確切的信息。而constructor卻可以解決這個(gè)問題。

          ok,明白了我們?yōu)槭裁匆胏onstructor,現(xiàn)在讓我?guī)Т蠹乙徊讲秸J(rèn)識(shí)一下typeof和constructor用法之間的差異吧~

          首先我們運(yùn)行一下下面這段代碼:

          var i;
          alert(
          typeof(i));
          alert(i.constructor);


          這3行代碼告訴你什么情況下可以用constructor。
          你可以看到第2行返回了字符串'undefined',而第三行則發(fā)生了錯(cuò)誤,原因是i變量還沒有類型定義,自然也沒有constructor的存在。
          從這一點(diǎn)上看,typeof可以檢查到變量是否有定義,而construct只能檢查已定義變量的類型

          再運(yùn)行一下下面這段代碼:

          var i = 2;
          alert(
          typeof(i));
          alert(i.constructor);
          alert(
          typeof(i.constructor));


          你會(huì)看到第2行返回了字符串'number’,第3行返回了一串類似函數(shù)定義的代碼字符串(這就是跟《精通JavaScript》一書中介紹的不一樣的地方)。
          我們?cè)儆胻ypeof檢查一下constructor到底是個(gè)什么樣類型的屬性,第4行返回結(jié)果'function',也就是說,實(shí)際上constructor是一個(gè)函數(shù),更確切地說是一個(gè)構(gòu)造函數(shù)。這時(shí)你就可以知道,為什么constructor可以檢查出各種類型了。

          有經(jīng)驗(yàn)的程序員看到這里應(yīng)該知道要怎么利用constructor來檢查變量類型了。方法有多種,這里提供一種比較容易理解的方法。

          其實(shí)想法很簡單,就是把construcor轉(zhuǎn)化為字符串,通過尋找匹配字符串(function名)來確定是否指定類型。如下例子:

          function user() {};
          var i = new user();
          alert((i.constructor
          +'').match(/user/== null);


          這僅僅是個(gè)簡單的例子。如果返回true則變量i不是user類型,返回false則變量是user類型。
          當(dāng)然,這樣檢測(cè)是不夠精確的,比如其實(shí)他是一個(gè)myuser類型的時(shí)候,同樣會(huì)被認(rèn)為是user類。所以你需要書寫更精確的正則表達(dá)式去進(jìn)行匹配。

          可以這樣簡單改進(jìn)你的正則表達(dá)式:

          /function user\(\)/


          替換上面代碼段中的/user/。當(dāng)然,如果你的構(gòu)造函數(shù)原型是user(a),那么應(yīng)該這樣書寫你的正則表達(dá)式:

          /function user\(a\)/



          到這里你應(yīng)該知道怎樣使用constructor類型去檢查變量類型了吧?

          ok,最后再提個(gè)醒,如果你要用基于constructor的方法去檢查一些基本類型,如
          Object / Array / Function / String / Number / Boolean
          在你的正則表達(dá)式中,一定要將這些單詞的首字母大寫!!而如果該類型是自定義類型,則根據(jù)你定義的時(shí)候標(biāo)識(shí)符的寫法確定。

          posted @ 2010-04-14 14:30 J2EE學(xué)習(xí)筆記 閱讀(321) | 評(píng)論 (0)編輯 收藏
          /**  
          使用三種Callback接口作為參數(shù)的query方法的返回值不同:   
          以ResultSetExtractor作為方法參數(shù)的query方法返回Object型結(jié)果,要使用查詢結(jié)果,我們需要對(duì)其進(jìn)行強(qiáng)制轉(zhuǎn)型;   
          以RowMapper接口作為方法參數(shù)的query方法直接返回List型的結(jié)果;   
          以RowCallbackHandler作為方法參數(shù)的query方法,返回值為void;  
          RowCallbackHandler和RowMapper才是我們最常用的選擇   
           * 
          @author Administrator  
           *   
           
          */
            
          public class SpringTest {   
           
          /**  
            * 返回結(jié)果是List里裝Map,使用參數(shù),使用回調(diào) RowMapperResultSetExtractor用于處理單行記錄,  
            * 它內(nèi)部持有一個(gè)RowMapper實(shí)例的引用,當(dāng)處理結(jié)果集的時(shí)候, 會(huì)將單行數(shù)據(jù)的處理委派給其所持有的RowMapper實(shí)例,而其余工作它負(fù)責(zé)  
            
          */
            
           
          public void getListRowMapperResultSetExtractor() {   
            ApplicationContext context 
          = new FileSystemXmlApplicationContext(   
              
          "src/database_config.xml");   
            
          // E:\demoworkspace\spring 為工程主目錄   
            JdbcTemplate jt = new JdbcTemplate((DataSource) context   
              .getBean(
          "oracleDataSourceTest")); // 測(cè)試用的方法   
            Object[] arg = new Object[] 10 };   
            List list 
          = (ArrayList) jt.query("select * from region where rownum<?",   
              arg, 
          new RowMapperResultSetExtractor(new RowMapper() {   
               
          public Object mapRow(ResultSet rs, int index)   
                 
          throws SQLException {   
                Map u 
          = new HashMap(); //可以是自己的JavaBean值對(duì)象(簡單Java對(duì)象POJO)   
                u.put("region_id", rs.getString("region_id"));   
                u.put(
          "region_name", rs.getString("region_name"));   
                
          return u;   
               }
             
              }
          ));   
            Iterator it 
          = list.iterator();   
            
          while (it.hasNext()) {   
             Map map 
          = (Map) it.next();   
             System.out.println(map.toString());   
            }
             
           }
             
            
            
           
          /**返回結(jié)果是List里裝Map,不使用參數(shù),使用回調(diào)  
            使用RowMapper比直接使用ResultSetExtractor要方便的多,只負(fù)責(zé)處理單行結(jié)果就行,現(xiàn)在,我們只需要將單行的結(jié)果組裝后返回就行,  
            剩下的工作,全部都是JdbcTemplate內(nèi)部的事情了。 實(shí)際上,JdbcTemplae內(nèi)部會(huì)使用一個(gè)ResultSetExtractor實(shí)現(xiàn)類來做其余的工作,  
            畢竟,該做的工作還得有人做不是?!    
            
          */
            
           
          public void getListRowMapper() {   
            ApplicationContext context 
          = new FileSystemXmlApplicationContext(   
              
          "src/database_config.xml");   
            JdbcTemplate jt 
          = new JdbcTemplate((DataSource) context   
              .getBean(
          "oracleDataSourceTest"));   
            List list 
          = jt.query(   
              
          "select * from region where rownum<10"new RowMapper() {   
               
          public Object mapRow(ResultSet rs, int index)   
                 
          throws SQLException {   
                Map u 
          = new HashMap();   
                u.put(
          "region_id", rs.getString("region_id"));   
                u.put(
          "region_name", rs.getString("region_name"));   
                
          return u;   
               }
             
              }
          );   
            Iterator it 
          = list.iterator();   
            
          while (it.hasNext()) {   
             Map map 
          = (Map) it.next();   
             System.out.println(map.toString());   
            }
             
           }
             
            
           
          // 返回記錄集   
           /**  
            RowCallbackHandler雖然與RowMapper同是處理單行數(shù)據(jù),不過,除了要處理單行結(jié)果,它還得負(fù)責(zé)最終結(jié)果的組裝和獲取工作,  
            在這里我們是使用當(dāng)前上下文聲明的List取得最終查詢結(jié)果, 不過,我們也可以單獨(dú)聲明一個(gè)RowCallbackHandler實(shí)現(xiàn)類,  
            在其中聲明相應(yīng)的集合類,這樣,我們可以通過該RowCallbackHandler實(shí)現(xiàn)類取得最終查詢結(jié)果   
            
          */
            
           
          public void getListRowCallbackHandler() {   
            ApplicationContext context 
          = new FileSystemXmlApplicationContext(   
              
          "src/database_config.xml");   
            
            JdbcTemplate jt 
          = new JdbcTemplate((DataSource) context   
              .getBean(
          "oracleDataSourceTest"));   
            String sql 
          = "select * from region  where region_id>?";   
            
          final List<Map> list=new ArrayList<Map>(); //一定要用final定義   
            Object[] params = new Object[] 0 };   
            jt.query(sql, params, 
          new RowCallbackHandler() {   
             
          public void processRow(ResultSet rs) throws SQLException {   
              Map u 
          = new HashMap();     
              u.put(
          "region_id", rs.getString("region_id"));   
              u.put(
          "region_name", rs.getString("region_name"));   
              list.add(u);   
             }
             
            }
          );   
               
            Iterator it 
          = list.iterator();   
            
          while (it.hasNext()) {   
             Map map 
          = (Map) it.next();   
             System.out.println(map.toString());   
            }
             
           }
          posted @ 2010-03-10 10:27 J2EE學(xué)習(xí)筆記 閱讀(569) | 評(píng)論 (0)編輯 收藏
          主站蜘蛛池模板: 密山市| 柯坪县| 英超| 阜新| 潼南县| 宁海县| 博乐市| 苏尼特左旗| 夏河县| 马公市| 昆明市| 洛扎县| 石首市| 白银市| 淮北市| 三门县| 清河县| 新乡县| 安福县| 鹿泉市| 长沙市| 股票| 微山县| 佛教| 溧阳市| 龙山县| 三原县| 永丰县| 新田县| 元谋县| 六盘水市| 车险| 芦山县| 眉山市| 黄平县| 西平县| 漳平市| 汪清县| 手游| 咸宁市| 泰州市|