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

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

              JScript對于邏輯運算的true|false是這么定義的:

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

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

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

           

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

              對于||運算同理,對于下面的表達式:

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

           

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

          posted @ 2010-05-13 15:11 J2EE學習筆記 閱讀(192) | 評論 (0)編輯 收藏

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

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

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

          首先我們運行一下下面這段代碼:

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


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

          再運行一下下面這段代碼:

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


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

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

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

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


          這僅僅是個簡單的例子。如果返回true則變量i不是user類型,返回false則變量是user類型。
          當然,這樣檢測是不夠精確的,比如其實他是一個myuser類型的時候,同樣會被認為是user類。所以你需要書寫更精確的正則表達式去進行匹配。

          可以這樣簡單改進你的正則表達式:

          /function user\(\)/


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

          /function user\(a\)/



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

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

          posted @ 2010-04-14 14:30 J2EE學習筆記 閱讀(325) | 評論 (0)編輯 收藏
          /**  
          使用三種Callback接口作為參數(shù)的query方法的返回值不同:   
          以ResultSetExtractor作為方法參數(shù)的query方法返回Object型結(jié)果,要使用查詢結(jié)果,我們需要對其進行強制轉(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)部持有一個RowMapper實例的引用,當處理結(jié)果集的時候, 會將單行數(shù)據(jù)的處理委派給其所持有的RowMapper實例,而其余工作它負責  
            
          */
            
           
          public void getListRowMapperResultSetExtractor() {   
            ApplicationContext context 
          = new FileSystemXmlApplicationContext(   
              
          "src/database_config.xml");   
            
          // E:\demoworkspace\spring 為工程主目錄   
            JdbcTemplate jt = new JdbcTemplate((DataSource) context   
              .getBean(
          "oracleDataSourceTest")); // 測試用的方法   
            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值對象(簡單Java對象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要方便的多,只負責處理單行結(jié)果就行,現(xiàn)在,我們只需要將單行的結(jié)果組裝后返回就行,  
            剩下的工作,全部都是JdbcTemplate內(nèi)部的事情了。 實際上,JdbcTemplae內(nèi)部會使用一個ResultSetExtractor實現(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é)果,它還得負責最終結(jié)果的組裝和獲取工作,  
            在這里我們是使用當前上下文聲明的List取得最終查詢結(jié)果, 不過,我們也可以單獨聲明一個RowCallbackHandler實現(xiàn)類,  
            在其中聲明相應(yīng)的集合類,這樣,我們可以通過該RowCallbackHandler實現(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學習筆記 閱讀(574) | 評論 (0)編輯 收藏
               摘要: 1.springJdbcContext.xml <?xml version="1.0" encoding="UTF-8"?>    <beans xmlns="http://www.springframework.org/schema/beans"      &nb...  閱讀全文
          posted @ 2010-03-09 19:10 J2EE學習筆記 閱讀(2023) | 評論 (0)編輯 收藏

          很多朋友在深入的接觸JAVA語言后就會發(fā)現(xiàn)這樣兩個詞:反射(Reflection)和內(nèi)省(Introspector),經(jīng)常搞不清楚這到底是怎么回事,在什么場合下應(yīng)用以及如何使用?今天把這二者放在一起介紹,因為它們二者是相輔相成的。

          反射

          相對而言,反射比內(nèi)省更容易理解一點。用一句比較白的話來概括,反射就是讓你可以通過名稱來得到對象(類,屬性,方法)的技術(shù)。例如我們可以通過類名來生成一個類的實例;知道了方法名,就可以調(diào)用這個方法;知道了屬性名就可以訪問這個屬性的值。

          還是寫兩個例子讓大家更直觀的了解反射的使用方法:

          // 通過類名來構(gòu)造一個類的實例
          Class cls_str = Class.forName( "java.lang.String" );
          // 上面這句很眼熟,因為使用過 JDBC 訪問數(shù)據(jù)庫的人都用過 J
          Object str = cls_str.newInstance();
          // 相當于 String str = new String(); 


          // 通過方法名來調(diào)用一個方法
          String methodName = "length" ;
          Method m 
          = cls_str.getMethod(methodName, null );
          System.out.println( 
          "length is " + m.invoke(str, null ));
          // 相當于 System.out.println(str.length()); 


          上面的兩個例子是比較常用方法??吹缴厦娴睦泳陀腥艘l(fā)問了:為什么要這么麻煩呢?本來一條語句就完成的事情干嗎要整這么復(fù)雜?沒錯,在上面的例子中確實沒有必要這么麻煩。不過你想像這樣一個應(yīng)用程序,它支持動態(tài)的功能擴展,也就是說程序不重新啟動但是可以自動加載新的功能,這個功能使用一個具體類來表示。首先我們必須為這些功能定義一個接口類,然后我們要求所有擴展的功能類必須實現(xiàn)我指定的接口,這個規(guī)定了應(yīng)用程序和可擴展功能之間的接口規(guī)則,但是怎么動態(tài)加載呢?我們必須讓應(yīng)用程序知道要擴展的功能類的類名,比如是test.Func1,當我們把這個類名(字符串)告訴應(yīng)用程序后,它就可以使用我們第一個例子的方法來加載并啟用新的功能。這就是類的反射,請問你有別的選擇嗎?

          內(nèi)省

          內(nèi)省是Java語言對Bean類屬性、事件的一種缺省處理方法。例如類A中有屬性name,那我們可以通過getName,setName來得到其值或者設(shè)置新的值。通過getName/setName來訪問name屬性,這就是默認的規(guī)則。Java中提供了一套API用來訪問某個屬性的getter/setter方法,通過這些API可以使你不需要了解這個規(guī)則(但你最好還是要搞清楚),這些API存放于包java.beans中。

          一般的做法是通過類Introspector來獲取某個對象的BeanInfo信息,然后通過BeanInfo來獲取屬性的描述器(PropertyDescriptor),通過這個屬性描述器就可以獲取某個屬性對應(yīng)的getter/setter方法,然后我們就可以通過反射機制來調(diào)用這些方法。下面我們來看一個例子,這個例子把某個對象的所有屬性名稱和值都打印出來:

          /* 
           * Created on 2004-6-29
           
          */
           

          package demo; 


          import java.beans.BeanInfo;
          import java.beans.Introspector;
          import java.beans.PropertyDescriptor; 


          /**
            * 內(nèi)省演示例子
            * 
          @author liudong
            
          */
           

          public class IntrospectorDemo {
              String name;
              
          public static void main(String[] args) throws Exception{
                  IntrospectorDemo demo 
          = new IntrospectorDemo();
                  demo.setName( 
          "Winter Lau" );         

                  
          // 如果不想把父類的屬性也列出來的話,
                  
          // 那 getBeanInfo 的第二個參數(shù)填寫父類的信息
                  BeanInfo bi = Introspector.getBeanInfo(demo.getClass(), Object. class );
                  PropertyDescriptor[] props 
          = bi.getPropertyDescriptors();
                  
          for ( int i=0;i<props.length;i++){
                      System.out.println(props[i].getName()
          + "=" +
                              props[i].getReadMethod().invoke(demo, 
          null ));
                  }
           

              }
               

              
          public String getName() {
                  
          return name;
              }
           

              
          public void setName(String name) {
                  
          this .name = name;
              }

          }


          Web開發(fā)框架Struts中的FormBean就是通過內(nèi)省機制來將表單中的數(shù)據(jù)映射到類的屬性上,因此要求FormBean的每個屬性要有g(shù)etter/setter方法。但也并不總是這樣,什么意思呢?就是說對一個Bean類來講,我可以沒有屬性,但是只要有g(shù)etter/setter方法中的其中一個,那么Java的內(nèi)省機制就會認為存在一個屬性,比如類中有方法setMobile,那么就認為存在一個mobile的屬性,這樣可以方便我們把Bean類通過一個接口來定義而不用去關(guān)系具體實現(xiàn),不用去關(guān)系Bean中數(shù)據(jù)的存儲。比如我們可以把所有的getter/setter方法放到接口里定義,但是真正數(shù)據(jù)的存取則是在具體類中去實現(xiàn),這樣可提高系統(tǒng)的擴展性。

          總結(jié)

          將Java的反射以及內(nèi)省應(yīng)用到程序設(shè)計中去可以大大的提供程序的智能化和可擴展性。有很多項目都是采取這兩種技術(shù)來實現(xiàn)其核心功能,例如我們前面提到的Struts,還有用于處理XML文件的Digester項目,其實應(yīng)該說幾乎所有的項目都或多或少的采用這兩種技術(shù)。在實際應(yīng)用過程中二者要相互結(jié)合方能發(fā)揮真正的智能化以及高度可擴展性。

          posted @ 2010-02-04 13:42 J2EE學習筆記 閱讀(381) | 評論 (1)編輯 收藏
               摘要: 原文出處:http://blog.chenlb.com/2008/11/join-or-countdownlatch-make-main-thread-wait-all-sub-thread.html 在編寫多線程的工作中,有個常見的問題:主線程(main) 啟動好幾個子線程(task)來完成并發(fā)任務(wù),主線程要等待所有的子線程完成之后才繼續(xù)執(zhí)行main的其它任務(wù)。 默認主線程退出時其它子線程不...  閱讀全文
          posted @ 2010-01-26 18:00 J2EE學習筆記 閱讀(1211) | 評論 (0)編輯 收藏

          這是jQuery里常用的2個方法。
          他們2者功能是完全不同的,而初學者往往會被誤導(dǎo)。


          首先 我們看.find()方法:
          現(xiàn)在有一個頁面,里面HTML代碼為:

          <div class="css">
              
          <class="rain">測試1</p>
          </div>
          <div class="rain">
              
          <p>測試2</p>
          </div>


          如果我們使用find()方法:

          var $find = $("div").find(".rain");
          alert( $find.html() );


          將會輸出:

          如果使用filter()方法:

          var $filter = $("div").filter(".rain");
          alert( $filter.html() );


          將會輸出:

          也許你已經(jīng)看出它們的區(qū)別了。
          find()會在div元素內(nèi) 尋找 class為rain 的元素。
          而filter()則是篩選div的class為rain的元素。
          一個是對它的子集操作,一個是對自身集合元素篩選。

          另外find()其實還可以用選擇器表示:

          var $select = $("div .rain");
          posted @ 2009-11-09 16:00 J2EE學習筆記 閱讀(382) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 海南省| 班戈县| 外汇| 娄底市| 平邑县| 措美县| 房山区| 九寨沟县| 鸡泽县| 陇南市| 万山特区| 林西县| 滕州市| 金湖县| 南通市| 南漳县| 庄河市| 格尔木市| 邯郸市| 扶绥县| 铁岭县| 礼泉县| 全椒县| 河西区| 遂川县| 都兰县| 克山县| 青川县| 嘉义县| 宜兴市| 光山县| 富平县| 民勤县| 龙游县| 廊坊市| 响水县| 台州市| 龙江县| 清徐县| 乐都县| 白河县|