摘要: 提起Java內部類(Inner Class)可能很多人不太熟悉,實際上類似的概念在C++里也有,那就是嵌套類(Nested Class),關于這兩者的區別與聯系,在下文中會有對比。內部類從表面上看,就是在類中又定義了一個類(下文會看到,內部類可以在很多地方定義),而實際上并沒有那么簡單,乍看上去內部類似乎有些多余,它的用處對于初學者來說可能并不是那么顯著,但是隨著對它的深入了解,你會發現Java的...
閱讀全文
posted @
2010-06-30 14:26 J2EE學習筆記 閱讀(307) |
評論 (0) |
編輯 收藏
在JScript的眾多運算符里,提供了三個邏輯運算符&&、||和!,噢?! 是高級語言都提供的
。按我們對邏輯運算的正常認識,邏輯運算的結果因該是ture或者false。但是JScript的邏輯運算卻不完全是這么定義的,這里只有!運算符總是返回true|false,而||和&&運算比較的好玩。
JScript對于邏輯運算的true|false是這么定義的:
- 所有對象都被認為是 true。
- 字符串當且僅當為空(""或'')時才被認為是 false。
- null 和未定義的均被認為是 false。
- 數字當且僅當為 0 時才是 false。
可是邏輯運算符||和&&雖然遵循上面的定義規則,但是它們返回的值卻很有意思。
對于&&運算,按照上面的規則,表達式 if ( 'abc' && '123' && new Date() ) 是執行true分支,可是這個表達式如果寫成:
var value = 'abc' && '123' && new Date();
結果value=Fri Jan 21 00:01:17 UTC+0800 2005,原它從左到右檢測,如果到了最后一個表達式也是為true的,就返回那個表達式。
對于||運算同理,對于下面的表達式:
var value1 = 'abc' || '123' || null || false;
var value2 = null || '' || false || 'ok';
結果value1='abc',value2='ok'。這是因為||運算會有"短路"特性,他也是從左向右檢測,只不過它是一但發現有為true的值,就立即返回該表達式。
這樣的特性可以幫組我們寫出精簡的代碼,可是同時也帶來代碼不便于閱讀維護的問題。
由于我手頭暫時沒有NS和moz什么的瀏覽器,不知道標準JavaScript是否也是這樣支持的?如果您方便的話,請告如我運行后的結果
posted @
2010-05-13 15:11 J2EE學習筆記 閱讀(188) |
評論 (0) |
編輯 收藏
有時你可能需要對變量進行類型檢查,或者判斷變量是否已定義。有兩種方法可以使用:typeof函數與constructor屬性。
typeof函數的用法可能不用我多說,大家都知道怎么用。而constructor屬性大家可能就陌生點。在《精通JavaScript》這本書中有提到construct的用法,但我用自己的幾個瀏覽器(IE7.0 / Firefox1.9 / Opera9.50)測試的結果卻和書上說的不一樣。但是仍然是有辦法通過constructor屬性來檢查變量類型的。
這里先補充一下,為什么明明有typeof函數可以很方便地用來檢測類型,還要用constructor呢?
因為typeof會把所有的數組類型以及用戶自定義類型判斷為object,從而無法知道更確切的信息。而constructor卻可以解決這個問題。
ok,明白了我們為什么要用constructor,現在讓我帶大家一步步認識一下typeof和constructor用法之間的差異吧~
首先我們運行一下下面這段代碼:
var i;
alert(typeof(i));
alert(i.constructor);
這3行代碼告訴你什么情況下可以用constructor。
你可以看到第2行返回了字符串'undefined',而第三行則發生了錯誤,原因是i變量還沒有類型定義,自然也沒有constructor的存在。
從這一點上看,typeof可以檢查到變量是否有定義,而construct只能檢查已定義變量的類型。
再運行一下下面這段代碼:
var i = 2;
alert(typeof(i));
alert(i.constructor);
alert(typeof(i.constructor));
你會看到第2行返回了字符串'number’,第3行返回了一串類似函數定義的代碼字符串(這就是跟《精通JavaScript》一書中介紹的不一樣的地方)。
我們再用typeof檢查一下constructor到底是個什么樣類型的屬性,第4行返回結果'function',也就是說,實際上constructor是一個函數,更確切地說是一個構造函數。這時你就可以知道,為什么constructor可以檢查出各種類型了。
有經驗的程序員看到這里應該知道要怎么利用constructor來檢查變量類型了。方法有多種,這里提供一種比較容易理解的方法。
其實想法很簡單,就是把construcor轉化為字符串,通過尋找匹配字符串(function名)來確定是否指定類型。如下例子:

function user()
{};
var i = new user();
alert((i.constructor+'').match(/user/) == null);
這僅僅是個簡單的例子。如果返回true則變量i不是user類型,返回false則變量是user類型。
當然,這樣檢測是不夠精確的,比如其實他是一個myuser類型的時候,同樣會被認為是user類。所以你需要書寫更精確的正則表達式去進行匹配。
可以這樣簡單改進你的正則表達式:
/function user\(\)/
替換上面代碼段中的/user/。當然,如果你的構造函數原型是user(a),那么應該這樣書寫你的正則表達式:
/function user\(a\)/
到這里你應該知道怎樣使用constructor類型去檢查變量類型了吧?
ok,最后再提個醒,如果你要用基于constructor的方法去檢查一些基本類型,如
Object / Array / Function / String / Number / Boolean
在你的正則表達式中,一定要將這些單詞的首字母大寫!!而如果該類型是自定義類型,則根據你定義的時候標識符的寫法確定。
posted @
2010-04-14 14:30 J2EE學習筆記 閱讀(321) |
評論 (0) |
編輯 收藏

/** *//**
使用三種Callback接口作為參數的query方法的返回值不同:
以ResultSetExtractor作為方法參數的query方法返回Object型結果,要使用查詢結果,我們需要對其進行強制轉型;
以RowMapper接口作為方法參數的query方法直接返回List型的結果;
以RowCallbackHandler作為方法參數的query方法,返回值為void;
RowCallbackHandler和RowMapper才是我們最常用的選擇
* @author Administrator
*
*/

public class SpringTest
{

/** *//**
* 返回結果是List里裝Map,使用參數,使用回調 RowMapperResultSetExtractor用于處理單行記錄,
* 它內部持有一個RowMapper實例的引用,當處理結果集的時候, 會將單行數據的處理委派給其所持有的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());
}
}

/** *//**返回結果是List里裝Map,不使用參數,使用回調
使用RowMapper比直接使用ResultSetExtractor要方便的多,只負責處理單行結果就行,現在,我們只需要將單行的結果組裝后返回就行,
剩下的工作,全部都是JdbcTemplate內部的事情了。 實際上,JdbcTemplae內部會使用一個ResultSetExtractor實現類來做其余的工作,
畢竟,該做的工作還得有人做不是?!
*/

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同是處理單行數據,不過,除了要處理單行結果,它還得負責最終結果的組裝和獲取工作,
在這里我們是使用當前上下文聲明的List取得最終查詢結果, 不過,我們也可以單獨聲明一個RowCallbackHandler實現類,
在其中聲明相應的集合類,這樣,我們可以通過該RowCallbackHandler實現類取得最終查詢結果
*/

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學習筆記 閱讀(569) |
評論 (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學習筆記 閱讀(2017) |
評論 (0) |
編輯 收藏