J2EE学习笔记
我们的失落……
posts - 13,comments - 1,trackbacks - 0
     摘要: 提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比。内部类从表面上看,就是在类中又定义了一个类(下文会看到,内部类可以在很多地方定义),而实际上并没有那么简单,乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了解,你会发现Java的...  阅读全文
posted @ 2010-06-30 14:26 J2EE学习笔记 阅读(297) | 评论 (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学习笔记 阅读(182) | 评论 (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学习笔记 阅读(313) | 评论 (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学习笔记 阅读(563) | 评论 (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学习笔记 阅读(2011) | 评论 (0)编辑 收藏