<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>kuru</title>
    <description>IT 民工</description>
    <link>http://kuru.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>ECMAScript 基础</title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/206967" style="color:red;">http://kuru.javaeye.com/blog/206967</a>&nbsp;
          发表时间: 2008年06月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文地址http://www.blogjava.net/flyingis/archive/2006/06/13/52484.html作者： Flyingis <br /><br />    JavaScript的核心之一ECMAScript的语言特性和Java、C、Perl都有许多相似之处，其中不少特性都是从这些语言借鉴而来，同时它们之间也存在许多差异。下面列举一些ECMAScript的基本特性。<br /><br />    --和Java一样，ECMAScript区分大小写，注释的格式相同，通过{}确定代码块，原始数据类型存储在堆栈，对象的引用存储在堆中<br />    --ECMAScript是一种松散的语言，ECMAScript通过var操作符声明变量，并且不限类型，例如var n = 25，那么n就是数字类型，var n = "string" ，那么n就是String类型<br />    --在每一行代码后，可以不写分号，ECMAScript自动认为该行的末尾为该行代码的最后；ECMAScript中的变量可以不用初始化，在幕后系统将自动完成初始化操作<br />    --同一变量可以赋予不同类型的数据；变量的第一个字符只能是字母、下划线或$ ，其他的字符可以是下划线、$、或任意的字母、数字、字符<br />    --和其他语言一样，变量最好遵循驼峰书写法，或Pascal表示法、或匈牙利表示法<br />    --和大多数语言不同的是， ECMAScript 变量在使用之前可以不必声明，系统会自动将该变量声明为全局变量，例如var m = " Good " ; n = m + " Morning " ; alert(n)输出结构是 " Good Morning " <br />    --在大多数语言里，String是对象，在ECMAScript中却是原始数据类型<br /><br />    原始数据类型 <br />  <br />    ECMAScript原始数据类型有五种：Undefined、Null、Boolean、Number、String。<br /><br />    typeof—判断变量和值的数据类型，通常有undefined、boolean、number、string、object五种类型。<br />    Undefined—当变量被声明但没有初始化，或函数没有明确返回一个值的时候，该变量或函数即为 Undefined 类型。<br />    Null—undefined是null的一种派生，当代表一个对象的值不存在时，该对象返回null。<br />    Boolean—包含两个值，true and false ， false不等于0，但0可以转换为false 。<br />    Number—可以定义32位整型数据或64位浮点型数据。定义数字类型变量时，在数字前加0即为八进制，加0x为十六进制，它们计算后返回的结果统一为十进制。通过var f = 1.0可以定义一个浮点类型变量，有意思的是，当f被用于计算之前，它实际是以 String类型存储的。当浮点类型数据很大或很小时（可以前后移动六位），将使用E表示法来表示浮点数据，最大可以存储17位数据。另外，isFinite()方法可以判断一个数值是否有限，isNaN()方法可以判断一个数据是非数字类型。<br />    String—String在ECMAScript中是原始数据类型，并且是唯一没有空间大小限制的数据类型。和Java不同的是，var s = " javascript " 和var s = 'javascript'均是合法的表示方法。<br /><br />    数据转换 <br />  <br />    在不同数据类型之间转换是任何一门编程语言的一个重要特性，ECMAScript提供了一系列简单的方法来实现数据的转换，大多数数据类型都提供了简单的转换方法，对于复杂的转换则有一些全局方法来完成，不管是哪一种方法，ECMAScript中数据转换都非常简单。 <br /><br />    Boolean、number和string数据类型是原始数据类型，但它们同时是伪对象（在ECMAScript中伪对象到底该怎么解释，运行机制如何还不清楚？有人知道请给予解答），拥有自己的属性和方法，可以通过toString()方法来实现string类型的转换。ECMAScript定义所有的对象，不管是伪对象还是真实的对象，都可以实现toString()方法，string被列为伪对象的行列，自然也拥有toString()方法。将数字类型数据转换为string的时候，可以在 toString() 方法中加入2、8、16参数，来实现不同进制的数据输出，例如var n = 10; alert(n.toString(2))输出为1010，alert(n.toString(8))输出为12，n.toString()和n.toString(10)相同。 <br />  <br />    ECMAScript提供了两种方法来实现string类型转化为数字类型的方法：parseInt()和parseFloat()。其他类型转换将会返回 NaN（Not a Number）。<br /><br />    Type Casting<br /><br />    ECMAScript数据类型的转换通常可以通过三个方法来实现：Boolean(value)、Number(value)和String(value)，这样通常会产生一些非预期的结果。<br /><br />    Boolean<br /><br />var b1 = Boolean( "" );  // false–empty string <br />var b2 = Boolean( " hi " );  // true–non-empty string <br />var b3 = Boolean( 100 );  // true–non-zero number <br />var b4 = Boolean( null );  // false-null <br />var b5 = Boolean( 0 );  // false-zero <br />var b6 = Boolean( new Object());  // true–object <br />    Number <br /><br />Number( false )  0 <br />Number( true )   1 <br />Number(undefined) NaN<br />Number( null )  0 <br />Number( " 5.5 " )  5.5 <br />Number( " 56 " )  56 <br />Number( " 5.6.7 " ) NaN<br />Number( new Object()) NaN<br />Number( 100 )  100 <br />    String<br /><br />    String()能实现所有类型数据的直接转换，和使用toString()不同的是，String()能够将null或undefined数据转换为string。<br /><br />    引用类型<br /><br />    ECMAScript 实际上并没有传统意义上的类，只是通过定义对象来等同于其他语言中的类，这一点我还比较含糊，以后可能会明白，在文中还是以“类”来说明。<br /><br />var  ob  =   new  Object(); <br />    以上定义了一个Object对象的实例，这种语法和Java比较类似。当有参数的时候需要括号来引用，当不存在参数时，括号可以去掉。由于ECMAScript语言比较松散，不管是前面所属的基础语法，还是后面将提到的语法知识，我们都应该尽量按照一定的书写规范来约定自己的代码格式，而不应充分发挥语言松散的特点。<br /><br />    Object类<br /><br />    Object类和Java里的java.lang.Object类比较相似，它是ECMAScript中其他所有类的基类，它具有如下属性：<br /><br />    constructor—建立对象的函数的一个引用，对于Object类而言，该引用指向本地Object()方法。<br />    prototype—对象里prototype对象的一个引用值。<br /><br />    Object 类拥有的方法：<br /><br />    hasOwnProperty(property)—判断property属性是否存在于对象中，property数据类型为string<br />    isPrototypeOf(object)— 判断一个对象是否是另一对象的 prototype<br />    propertyIsEnumerable(property)— 判断所给出的属性能否使用 for 语句列举出来<br />    toString()—返回对象的原始类型string<br />    valueOf()—返回对象合适的原始值，对于多数类而言，返回的值和toString()相同<br />    Object类的每一个属性和方法都被其他的类所重写<br /><br />    Boolean类<br /><br />    定义方法var ob = new Boolean(true); ob是Boolean原始数据类型的一个引用。在使用Boolean对象过程中，需要注意，所有的对象会自动转变为true，因此var ob1 = new Boolean(false);  var ob2 = ob1 && true; 最后ob2的值是true，非false。一般情况下，使用Boolean原始数据类型可以避免这种情况。<br /><br />    Number类<br /><br />    定义方法var o = new Number(15);<br />    获得原始数据的值var n = o.valueOf();<br /><br />    Number类有一些为数字类型的值特别设计的方法：<br /><br />alert(o.toFixed( 2 ));   // 输出15.00 <br />alert(o.toExponential( 1 ));   // 输出1.5e+1 <br />    在无法确定使用 toFixed 还是 toExponential 的时候，可以使用 toPrecision 方法来获得取值：<br /><br />alert(o.toPrecision( 1 ));   // 输出 2e+1 <br />alert(o.toPrecision( 2 ));   // 输出 15 <br />alert(o.toPrecision( 3 ));   // 输出 15.0 <br />    String类<br /><br />    String类是一种复杂引用类型，这里仅列出一些常见的方法，其中不少都是模仿java.lang.String：<br /><br />var  s  =   new  String( " Good Morning " );<br />alert(s.valueOf()  ==  s.toString());   // 输出true <br />alert(s.length);   // 输出12 <br />alert(s.charAt( 1 ));   // 输出o <br />var  sr  =  s.concat( "  ! " ); alert(sr);   // 输出Good morning ! <br />alert(s.indexOf( " o " );   // 输出1 <br />alert(s.lastIndexOf( " o " );   // 输出6 <br />alert(s.localeCompare(Good morning));   // 输出0 <br />alert(s.localeCompare(Apple));   // 输出1 <br />alert(s.localeCompare(House));   // 输出-1 <br />alert(s.slice( 2 ));   //  输出od morning <br />alert(s.substring( 2 ));   //  输出od morning <br />alert(s.slice( 2 ,  - 5 ));   //  输出od mo <br />alert(s.substring( 2 ,  - 5 ));   // 输出Go <br />alert(s.toUpperCase());   // 输出GOOD MORNING <br />alert(s.toLowerCase());   // 输出good morning <br />    另外，所有String类的方法同样可以用于String原始数据类型，因为它是伪对象。<br /><br />    instanceof <br /><br />    instanceof操作符和typeof作用类似，不同的是，instanceof需要明确指定对象是否属于某种特定类型。例如<br /><br />var  s  =   new  String( " Good morning ! " );<br />alert(s  instanceof  String); <br />    操作符和语句 <br /><br />    ECMAScript 中大多数操作符、语句和 Java 都比较类似，但也有一些其特有的，如 label 语句， with 语句， for-in 语句等等。<br /><br />    Functions<br /><br />    Functions是ECMAScript的核心，在任何时候任何地方都可以运行的一组代码语句。<br /><br />  function  functionName(arg0, arg1, …… , argN)   {<br />  statements<br />} <br />    当function没有返回值或return语句后没有值的时候，该function实际上会被系统定义为undefined，当function返回值的时候，function可以不必明确指定为某种数据类型。<br /><br />    关于重载<br /><br />    重载是面向对象语言的基本特性之一，但 ECMAScript 的 functions 并不能重载，在同一范围里可以定义两个完全相同的函数，在调用函数的时候，最后的一个函数发挥作用。这种特性比较麻烦，但可以通过 arguments 对象来实现和重载类似的功能。<br /><br />  function  func()   {<br />   if (arguments.length  ==   1 )   {<br />    alert(arguments[ 0 ]  +   5 );<br />  }   else   if  (arguments.length  ==   2 )   {<br />      alert(arguments[ 0 ]  +  arguments[ 1 ]);<br />    } <br />} <br /> <br />func( 5 );   // 输出10 <br /> func( 10 ,  15 );   // 输出25 <br />    前面提到过，在同一范围里可以定义两个完全相同的function，在调用function的时候，最后的一个function发挥作用。<br /> <br />  function  func(i)   {<br />  alert(i  +   10 );<br />} <br />  function  func(i)   {<br />  alert(i  +   20 );<br />} <br />func( 5 );   // 输出25 <br />    可以看出，是调用了最后的一个function使得数据结果为25，如果使用Function类来定义以上两个函数，那为什么会使用最后的一个function可能会更明确一些。 <br /><br />var  func  =   new  Function(“i”, “alert(i  +   10 )”);<br />var  func  =   new  Function(“i”, “alert(i  +   20 )”);<br />func( 5 ); <br />    func指向了另外一个引用，从而值发生了改变，func是作为function对象的引用而存在的，并且允许两个变量指向同一个 function。<br /><br />    和Function类相关的属性、方法有许多，例如length、toString()、valueOf()等等。其中toString()在调试程序中使用较多。
          <br/>
          <span style="color:red;">
            <a href="http://kuru.javaeye.com/blog/206967#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 23 Jun 2008 02:11:47 +0800</pubDate>
        <link>http://kuru.javaeye.com/blog/206967</link>
        <guid>http://kuru.javaeye.com/blog/206967</guid>
      </item>
      <item>
        <title>hibernate二级缓存攻略</title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/206685" style="color:red;">http://kuru.javaeye.com/blog/206685</a>&nbsp;
          发表时间: 2008年06月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          文章来源：http://www.javaeye.com/topic/18904<br />相关文章:   <br />关于Hibernate Cache <br />数据库对象的缓存策略 <br />Spring+Hibernate 缓存不起作用 <br /><br />更多相关推荐 很多人对二级缓存都不太了解，或者是有错误的认识，我一直想写一篇文章介绍一下hibernate的二级缓存的，今天终于忍不住了。 <br />我的经验主要来自hibernate2.1版本，基本原理和3.0、3.1是一样的，请原谅我的顽固不化。 <br /><br />hibernate的session提供了一级缓存，每个session，对同一个id进行两次load，不会发送两条sql给数据库，但是session关闭的时候，一级缓存就失效了。 <br /><br />二级缓存是SessionFactory级别的全局缓存，它底下可以使用不同的缓存类库，比如ehcache、oscache等，需要设置hibernate.cache.provider_class，我们这里用ehcache，在2.1中就是 <br />hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider <br />如果使用查询缓存，加上 <br />hibernate.cache.use_query_cache=true <br /><br /><br />缓存可以简单的看成一个Map，通过key在缓存里面找value。 <br /><br />Class的缓存 <br />对于一条记录，也就是一个PO来说，是根据ID来找的，缓存的key就是ID，value是POJO。无论list，load还是iterate，只要读出一个对象，都会填充缓存。但是list不会使用缓存，而iterate会先取数据库select id出来，然后一个id一个id的load，如果在缓存里面有，就从缓存取，没有的话就去数据库load。假设是读写缓存，需要设置： <br />&lt;cache usage="read-write"/> <br />如果你使用的二级缓存实现是ehcache的话，需要配置ehcache.xml <br />&lt;cache name="com.xxx.pojo.Foo" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" /> <br />其中eternal表示缓存是不是永远不超时，timeToLiveSeconds是缓存中每个元素（这里也就是一个POJO）的超时时间，如果eternal="false"，超过指定的时间，这个元素就被移走了。timeToIdleSeconds是发呆时间，是可选的。当往缓存里面put的元素超过500个时，如果overflowToDisk="true"，就会把缓存中的部分数据保存在硬盘上的临时文件里面。 <br />每个需要缓存的class都要这样配置。如果你没有配置，hibernate会在启动的时候警告你，然后使用defaultCache的配置，这样多个class会共享一个配置。 <br />当某个ID通过hibernate修改时，hibernate会知道，于是移除缓存。 <br />这样大家可能会想，同样的查询条件，第一次先list，第二次再iterate，就可以使用到缓存了。实际上这是很难的，因为你无法判断什么时候是第一次，而且每次查询的条件通常是不一样的，假如数据库里面有100条记录，id从1到100，第一次list的时候出了前50个id，第二次iterate的时候却查询到30至70号id，那么30-50是从缓存里面取的，51到70是从数据库取的，共发送1+20条sql。所以我一直认为iterate没有什么用，总是会有1+N的问题。 <br />（题外话：有说法说大型查询用list会把整个结果集装入内存，很慢，而iterate只select id比较好，但是大型查询总是要分页查的，谁也不会真的把整个结果集装进来，假如一页20条的话，iterate共需要执行21条语句，list虽然选择若干字段，比iterate第一条select id语句慢一些，但只有一条语句，不装入整个结果集hibernate还会根据数据库方言做优化，比如使用mysql的limit，整体看来应该还是list快。） <br />如果想要对list或者iterate查询的结果缓存，就要用到查询缓存了 <br /><br />查询缓存 <br />首先需要配置hibernate.cache.use_query_cache=true <br />如果用ehcache，配置ehcache.xml，注意hibernate3.0以后不是net.sf的包名了 <br />&lt;cache name="net.sf.hibernate.cache.StandardQueryCache" <br />maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600" <br />timeToLiveSeconds="7200" overflowToDisk="true"/> <br />&lt;cache name="net.sf.hibernate.cache.UpdateTimestampsCache" <br />maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/> <br />然后 <br />query.setCacheable(true);//激活查询缓存 <br />query.setCacheRegion("myCacheRegion");//指定要使用的cacheRegion，可选 <br />第二行指定要使用的cacheRegion是myCacheRegion，即你可以给每个查询缓存做一个单独的配置，使用setCacheRegion来做这个指定，需要在ehcache.xml里面配置它： <br />&lt;cache name="myCacheRegion" maxElementsInMemory="10" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" /> <br />如果省略第二行，不设置cacheRegion的话，那么会使用上面提到的标准查询缓存的配置，也就是net.sf.hibernate.cache.StandardQueryCache <br /><br />对于查询缓存来说，缓存的key是根据hql生成的sql，再加上参数，分页等信息（可以通过日志输出看到，不过它的输出不是很可读，最好改一下它的代码）。 <br />比如hql： <br />from Cat c where c.name like ? <br />生成大致如下的sql： <br />select * from cat c where c.name like ? <br />参数是"tiger%"，那么查询缓存的key*大约*是这样的字符串（我是凭记忆写的，并不精确，不过看了也该明白了）： <br />select * from cat c where c.name like ? , parameter:tiger% <br />这样，保证了同样的查询、同样的参数等条件下具有一样的key。 <br />现在说说缓存的value，如果是list方式的话，value在这里并不是整个结果集，而是查询出来的这一串ID。也就是说，不管是list方法还是iterate方法，第一次查询的时候，它们的查询方式很它们平时的方式是一样的，list执行一条sql，iterate执行1+N条，多出来的行为是它们填充了缓存。但是到同样条件第二次查询的时候，就都和iterate的行为一样了，根据缓存的key去缓存里面查到了value，value是一串id，然后在到class的缓存里面去一个一个的load出来。这样做是为了节约内存。 <br />可以看出来，查询缓存需要打开相关类的class缓存。list和iterate方法第一次执行的时候，都是既填充查询缓存又填充class缓存的。 <br />这里还有一个很容易被忽视的重要问题，即打开查询缓存以后，即使是list方法也可能遇到1+N的问题！相同条件第一次list的时候，因为查询缓存中找不到，不管class缓存是否存在数据，总是发送一条sql语句到数据库获取全部数据，然后填充查询缓存和class缓存。但是第二次执行的时候，问题就来了，如果你的class缓存的超时时间比较短，现在class缓存都超时了，但是查询缓存还在，那么list方法在获取id串以后，将会一个一个去数据库load！因此，class缓存的超时时间一定不能短于查询缓存设置的超时时间！如果还设置了发呆时间的话，保证class缓存的发呆时间也大于查询的缓存的生存时间。这里还有其他情况，比如class缓存被程序强制evict了，这种情况就请自己注意了。 <br /><br />另外，如果hql查询包含select字句，那么查询缓存里面的value就是整个结果集了。 <br /><br />当hibernate更新数据库的时候，它怎么知道更新哪些查询缓存呢？ <br />hibernate在一个地方维护每个表的最后更新时间，其实也就是放在上面net.sf.hibernate.cache.UpdateTimestampsCache所指定的缓存配置里面。 <br />当通过hibernate更新的时候，hibernate会知道这次更新影响了哪些表。然后它更新这些表的最后更新时间。每个缓存都有一个生成时间和这个缓存所查询的表，当hibernate查询一个缓存是否存在的时候，如果缓存存在，它还要取出缓存的生成时间和这个缓存所查询的表，然后去查找这些表的最后更新时间，如果有一个表在生成时间后更新过了，那么这个缓存是无效的。 <br />可以看出，只要更新过一个表，那么凡是涉及到这个表的查询缓存就失效了，因此查询缓存的命中率可能会比较低。 <br /><br />Collection缓存 <br />需要在hbm的collection里面设置 <br />&lt;cache usage="read-write"/> <br />假如class是Cat，collection叫children，那么ehcache里面配置 <br />&lt;cache name="com.xxx.pojo.Cat.children" <br />maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" <br />overflowToDisk="true" /> <br />Collection的缓存和前面查询缓存的list一样，也是只保持一串id，但它不会因为这个表更新过就失效，一个collection缓存仅在这个collection里面的元素有增删时才失效。 <br />这样有一个问题，如果你的collection是根据某个字段排序的，当其中一个元素更新了该字段时，导致顺序改变时，collection缓存里面的顺序没有做更新。 <br /><br />缓存策略 <br />只读缓存（read-only）：没有什么好说的 <br />读/写缓存（read-write）:程序可能要的更新数据 <br />不严格的读/写缓存（nonstrict-read-write）：需要更新数据，但是两个事务更新同一条记录的可能性很小，性能比读写缓存好 <br />事务缓存（transactional）：缓存支持事务，发生异常的时候，缓存也能够回滚，只支持jta环境，这个我没有怎么研究过 <br /><br />读写缓存和不严格读写缓存在实现上的区别在于，读写缓存更新缓存的时候会把缓存里面的数据换成一个锁，其他事务如果去取相应的缓存数据，发现被锁住了，然后就直接取数据库查询。 <br />在hibernate2.1的ehcache实现中，如果锁住部分缓存的事务发生了异常，那么缓存会一直被锁住，直到60秒后超时。 <br />不严格读写缓存不锁定缓存中的数据。 <br /><br /><br />使用二级缓存的前置条件 <br />你的hibernate程序对数据库有独占的写访问权，其他的进程更新了数据库，hibernate是不可能知道的。你操作数据库必需直接通过hibernate，如果你调用存储过程，或者自己使用jdbc更新数据库，hibernate也是不知道的。hibernate3.0的大批量更新和删除是不更新二级缓存的，但是据说3.1已经解决了这个问题。 <br />这个限制相当的棘手，有时候hibernate做批量更新、删除很慢，但是你却不能自己写jdbc来优化，很郁闷吧。 <br />SessionFactory也提供了移除缓存的方法，你一定要自己写一些JDBC的话，可以调用这些方法移除缓存，这些方法是： <br />void evict(Class persistentClass) <br />Evict all entries from the second-level cache. <br />void evict(Class persistentClass, Serializable id) <br />Evict an entry from the second-level cache. <br />void evictCollection(String roleName) <br />Evict all entries from the second-level cache. <br />void evictCollection(String roleName, Serializable id) <br />Evict an entry from the second-level cache. <br />void evictQueries() <br />Evict any query result sets cached in the default query cache region. <br />void evictQueries(String cacheRegion) <br />Evict any query result sets cached in the named query cache region. <br />不过我不建议这样做，因为这样很难维护。比如你现在用JDBC批量更新了某个表，有3个查询缓存会用到这个表，用evictQueries(String cacheRegion)移除了3个查询缓存，然后用evict(Class persistentClass)移除了class缓存，看上去好像完整了。不过哪天你添加了一个相关查询缓存，可能会忘记更新这里的移除代码。如果你的jdbc代码到处都是，在你添加一个查询缓存的时候，还知道其他什么地方也要做相应的改动吗？ <br /><br />---------------------------------------------------- <br /><br />总结： <br />不要想当然的以为缓存一定能提高性能，仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的，不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下乱用，可能会有1+N的问题。不当的使用还可能导致读出脏数据。 <br />如果受不了hibernate的诸多限制，那么还是自己在应用程序的层面上做缓存吧。 <br />在越高的层面上做缓存，效果就会越好。就好像尽管磁盘有缓存，数据库还是要实现自己的缓存，尽管数据库有缓存，咱们的应用程序还是要做缓存。因为底层的缓存它并不知道高层要用这些数据干什么，只能做的比较通用，而高层可以有针对性的实现缓存，所以在更高的级别上做缓存，效果也要好些吧。
          <br/>
          <span style="color:red;">
            <a href="http://kuru.javaeye.com/blog/206685#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 21 Jun 2008 17:05:57 +0800</pubDate>
        <link>http://kuru.javaeye.com/blog/206685</link>
        <guid>http://kuru.javaeye.com/blog/206685</guid>
      </item>
      <item>
        <title>实战DDD(Domain-Driven Design领域驱动设计)</title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/204764" style="color:red;">http://kuru.javaeye.com/blog/204764</a>&nbsp;
          发表时间: 2008年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.jdon.com/mda/ddd.html" target="_blank">http://www.jdon.com/mda/ddd.html</a>（转载请保留）<br /><br />2004 年著名建模专家Eric Evans发表了他最具影响力的著名书籍：Domain-Driven Design –Tackling Complexity in the Heart of Software（中文译名：领域驱动设计　2006年3月清华出版社译本，或称 Domain Driven-Design architecture [Evans DDD]）。<br /><br />　　Martin Fowler作序说；“希望本书是一本非常有影响力的书籍,....... Eric最值得我尊敬的一个方面是他敢于讨论还未取得成功的事情”，其实，时值今年2006年，DDD开发框架已经层出不穷（如RoR、RIFE、 JdonFramework等），我们项目软件包结构都变成了这样：xxx.model;xxx.service，DDD思想已经遍地开花，不能再说不成功了。<br /><br />　　DDD是告诉我们如何做好业务层！并以领域驱动设计思想来选择和合适的框架，本文以基于JdonFramework开发的JiveJdon3.0说明DDD方法的实战应用。<br /><br />　　首先必须认识到：领域建模是一种艺术的技术，不是数学的技术，它是用来解决复杂软件快速应付变化的解决之道（快速适应需求变化的软件复用）。<br /><br />　　我们知道软件的产生过程是：分析、设计、编程、测试、部署。过去，分析领域和软件设计是分裂的，分析人员从领域中收集基本概念；而设计必须指明一组能北项目中适应编程工具构造的组件，这些组件必须能够在目标环境中有效执行，并能够正确解决应用程序出现的问题。 模型驱动设计(Model-Driven Design)抛弃了分裂分析模型与设计的做法，使用单一的模型来满足这两方面的要求。这就是领域模型。<br /><br />　　单一的领域模型同时满足分析原型和软件设计，如果一个模型实现时不实用，重新寻找新模型。如果模型没有忠实表达领域关键概念时，也必须重新寻找新的模型。 建模和设计成为单个迭代循环。将领域模型和设计紧密联系。因此，建模专家必须懂设计，会编程。<br /><br />分层架构<br /><br />　　最初层次只分为三层：表现层、业务层和持久层；DDD其实告诉我们如何让实现业务层！<br /><br />　　一位道友曾经请教层次的职责，对服务Service提出疑问。根据Eric的理论，业务层将细分为两个层次：应用层和领域层。它们的定义是：应用层：定义软件可以完成的工作，并且指挥具有丰富含义的领域对象来解决问题，保持精练；不包括业务规则或知识，无业务情况的状态；领域层：负责表示业务概念、业务状态的信息和业务规则，是业务软件核心。<br /><br />　　层次之间必须清晰分离，每个层都是内聚的，并且只依赖它的下层，为了实现各层的最大解耦，Ioc模式和Ioc容器是目前最好的选择，JdonFramework使用基于PicoContainer的Ioc容器实现了各层的松耦合；<br /><br />　　Eric特别指出：那种将业务逻辑交由业务界面处理的快速UI方式是旁门左道。希望象C/S结构那样可视化拖拖图形就完成的软件开发是一种错误的方向，开发时快速，难于维护和扩展，虽然使用J2EE技术，其实是一种伪多层技术。可惜，有很多国人在疯狂开发这类工具，大有不撞南墙不低头之势，并且疯狂误导很多非专业人士，可悲可叹！如果对这段言论持不同意见，建议你购买"领域驱动设计"这本译书，见P53页。<br /><br />领域模型种类<br /><br />　　传统模型分为两种：实体（Entity）和值对象（Value Object），现在服务（Service）成为第三种模型元素。<br /><br />　　实体（Entity）定义：通过一系列连续性（continuity）和标识（identity　ID）来定义；个人认为它和分析领域的四色原型中的PPT原型非常类似，可以看成是PPT原型延续。<br /><br />　　实体必须拥有自己的唯一ID，主键，如果没有一个ID标识，为每个实例加上一个具有唯一性ID，可能是内部使用。 如JiveJdon3.0中jdonframework.xml中模型增删改查CRUD配置定义：<br /><br />程序代码 程序代码<br />model key="forumId"　 class="com.jdon.jivejdon.model.Forum"><br />　　　　..... 　　　<br />&lt;/model><br /><br />其中，forumId是模型com.jdon.jivejdon.model.Forum的主键，唯一ID，每个模型必须有一个专家。<br /><br />　　值对象（Value Object）：如果一个对象代表了领域的某种描述性特征，且没有概念性的标识。个人认为它是四色原型中Description原型延续。如果我们只关心模型中一个元素的属性，那么把这个元素划为值对象。值对象是不可变的，不要给它任何标识，避免实体的维护性，降低设计复杂性。我们不关心值对象是哪个实例。<br /><br />　　在JiveJdon3.0中，ForumState是一个值对象，它表示论坛当前最新帖子、论坛的主题数量和帖子数量，它的根对象是Forum，是被内聚嵌入到Forum这个实体模型中的，代码如下：<br />程序代码 程序代码<br />package com.jdon.jivejdon.model;<br /><br /><br />/**<br />* Forum State ValueObject<br />* this is a embeded class in Forum.<br />* @author &lt;a href="mailto:banqiao@jdon.com">banq&lt;/a><br />*<br />*/<br />public class ForumState {<br /><br />　　private int threadCount = 0; //主题数量<br /><br />　　<br />　　private int messageCount = 0;//帖子数量<br /><br /><br />　　private ForumMessage lastPost; //最新帖子<br /><br /><br /><br />　　public int getMessageCount() {<br />　　　　return messageCount;<br />　　}　　<br /><br />　　......<br />}<br /><br />同样ForumThreadState是也是一种值对象，根据Eric的值对象设计，ForumThreadState和ForumState是可以合并成一个对象的，值对象中没有ID等唯一标识。<br /><br />　　Eric认为：服务Service是描述领域概念最自然的方式，是四色原型的MI原型的延续， 优秀服务3个特征：<br />　　1.与领域概念相关的操作行为、但不是实体和值对象中固有的部分。<br />　　2.接口根据领域模型中其他元素定义<br />　　3.操作是无状态的。<br /><br />　　在JiveJdon3中，com.jdon.jivejdon.service.ForumService和Forum实体模型及其值对象 ForumState共同完成领域模型，其中ForumService属于应用服务层；而后两者属于领域层；其他服务 ForumMessageService、AccountService和UploadService等都是此类性质。<br /><br />领域对象的生命周期Scope<br /><br />　　Spring 1.x刚出来时确实忽悠了大家一把，因为他没有领域对象的生命周期支持，直到Spring 2.0才将如new Bean scope，当初那些疯狂捧Spring 1.x 臭脚的所谓高手是不是还是基于数据库驱动的思维，根本没有真正OO模式思维，当今天JBoss Seam、Scopes等框架开始重视对象生命周期支持后，曾经发生在Jdon社区争战硝烟已经过去，成为历史。<br /><br />　　Eric认为：每个对象独有器生命周期，一个对象在创建以后，可能要经历各种不同的状态，并最终消亡。对象生命周期由长短：临时对象；常驻内存；有的与其他对象存在复杂的依赖关系；状态变化时必须满足一些不变量的约束条件。如何管理这些对象提出挑战！处理不好会偏离MDD的方向。<br /><br />　　在生命周期中维护对象的完整性。避免模型由于管理生命周期的复杂性而陷入困境。有 三个模式来处理：聚合（Aggregate）：定义清晰的所有权和边界使模型更加紧凑，避免出现盘根错节的对象关系网；工厂（Factory）和组合（Respository）。<br /><br />　　当一个对象生命周期之始，使用工厂和组合提供了访问和控制模型对象的方法，完善了MDD。 建立聚合的模型，并且把工厂和组合加入设计中来，可以使我们系统地对模型对象进行管理。 聚合圈出一个范伟，在这个范围中，对象无论在哪个生命周期，保持不变性。<br /><br />　　在JiveJdon3.0中，值对象ForumState是被聚合在实体模型Forum中，Forum作为ForumState的一个根，由于它们数据必须保持一致性，不变量(invariant)是指无论何时发生数据变化必须满足一致性规则，由于根控制了访问，就无法绕过它修改内部元素，例如，如果没有Forum实体对象这个根，就无法去修改对象状态ForumState，ForumState获得是通过Forum的getter方法获得的。<br /><br />　　ForumState和Forum的分离有可以使修改论坛状态数据（当发一个新帖时，必须更新当前论坛的最新帖子为该新帖），不会影响到Forum其他元素，特别是使用事务锁定时，不必锁住整个对象，见"领域驱动设计"书籍P92。<br /><br />　　另外，ForumThread和ForumMessage的关联关系必设定成单向的，而不是双向的，因为领域建模中，关联越简单越好。<br /><br />　　在JiveJdon3.0中，你可能注意到有一个com.jdon.jivejdon.service.factory.ForumBuilder，所有实体模型对象的获得都是从这个工厂创建出来的，我曾经徘徊过：这个工厂类是否应该属于持久层，因为JiveJdon3.0持久层没有使用 Hibernate这样O/R Mapping框架，而是直接使用SQL，但是从持久层输出的都是对象，这是必须坚持的一个设计原则（好像是MF的一个什么元数据模式） 。<br /><br />　　但是，Eric明确告诉我们，领域模型的工厂属于应用层，页就是还是应该处于业务层的，这样好处很多，业务层设计根本无需从Hibernate等持久层框架获得，而是从自己的工厂获得。<br /><br />　　组合（Respository）又被翻译成仓储，我认为组合合适，主要用来返回一批对象，查询组合常用来返回批量查询结果，JdonFramework 两个快速开发支持：批量查询其实应该是Respository的实现，实际也是过去Master-details的一种查询实现。<br /><br />　　以 com.jdon.jivejdon.presentation.action.ThreadListAction为例子，其功能是查询论坛Forum下所有主题ForumThread，并分页显示，实现效果按这里，我们在customizeListForm方法中将根Model Forum设置进入，在threadList.jsp中，我们使用struts的标签库logic:iterator来遍历组合对象 threadListForm中的ForumThread集合。<br /><br />失血模型<br /><br />　　MF（Martin Fowler）曾经提出有名的贫血模型或失血模型，让我们好生迷惑和彷徨，他认为实体模型对象中只有弱行为setter和getter方法，没有真正行为，好像缺少血液的人，不和谐了，不少高手又被忽悠了，大谈贫血模型。<br /><br />　　其实，Eric已经认为，在DDD中，领域中一些概念不能作为模型中的对象来处理的，如果将这些功能概念强行加给实体对象和值对象，破坏模型中对象的定义，人为添加没有意义的对象。服务是描述领域概念最自然的方式。<br /><br />　　为了在这些大师之间取得一个平衡，有人将Model的持久化操作（CRUD行为）整入到领域模型中，这是不是违背当初Dao模式初衷，Dao模式其实是桥模式和适配器模式组合（见SUN的J2EE核心模式）。<br /><br />　　无论如何，我们的DDD项目中都是以失血模型存在着，所以，Eric呼唤：建模专家必须懂得实现，懂得软件技术，MF可能会听进去的。
          <br/>
          <span style="color:red;">
            <a href="http://kuru.javaeye.com/blog/204764#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 17 Jun 2008 17:47:46 +0800</pubDate>
        <link>http://kuru.javaeye.com/blog/204764</link>
        <guid>http://kuru.javaeye.com/blog/204764</guid>
      </item>
      <item>
        <title>SSH2</title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/196835" style="color:red;">http://kuru.javaeye.com/blog/196835</a>&nbsp;
          发表时间: 2008年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          使用分层结构,包括 dao,service,control,web层<br />Struts2 集成 Spring 需要以下几个步骤<br />1 加入struts2-spring-plugin-2.0.9.jar到项目中(web项目就是丢到/WEB-INF/lib中)<br />2 Web.xml文件里加入以下listener<br />代码<br /><br />&lt;listener>   <br />    &lt;listener-class>org.springframework.web.context.ContextLoaderListener&lt;/listener-class>   <br />&lt;/listener>   <br />&lt;!--默认加载/WEB-INF 目录下的applicationContext.xml -->  如果需要其它的spring配置文件可以在web.xml中加入以下配置<br />代码<br /><br />&lt;context-param>   <br />    &lt;param-name>contextConfigLocation&lt;/param-name>   <br />    &lt;param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml&lt;/param-value>   <br />&lt;/context-param>   <br />&lt;!--param-value 中间的多个配置文件可以使用 , 隔开-->  <br />3 在/WEB-INF 目录下新建applicationContext.xml,并在其中配置Struts2的action及其它需要的bean<br />4 在struts.xml中将 &lt;action 元素中 class="" 的属性改为spring配置文件中的id<br />代码<br /><br />&lt;!-- spring 配置文件中配置 action -->   <br />&lt;bean id="loginAction" class="login.LoginAction"   <br />    scope="prototype">   <br />    &lt;property name="userService" ref="userService" />   <br />&lt;/bean><br /> <br /> <br />代码<br /><br />&lt;!-- struts 配置文件中配置 action 注意class属性不再是类带路径全名了 -->   <br />&lt;action name="Login" class="loginAction">   <br />        &lt;result name="success">/login/success.jsp&lt;/result>   <br />        &lt;result name="error">/login/error.jsp&lt;/result>   <br />&lt;/action>  <br />Spring 集成 Hibernate 就不累述了,网上到处都有<br /><br />附件里有原代码,导入eclipse(需要myeclipse插件),修改数据源,就能运行了<br />数据源在src目录下dataSource.properties里,我将数据源配置在外部properties<br />文件里,spring的配置文件动态载入其内容,如果使用的不是mysql,请注意修改hibernate方言<br />代码<br /><br />&lt;prop key="hibernate.dialect">   <br />    org.hibernate.dialect.MySQLDialect    <br />&lt;/prop>  说明:项目内没有所需要的包(struts2,spring2,hibernate3),导入项目以后需要自己<br />导入相应的三方包,spring使用的是2.0<br />struts2 好像支持不了spring2.0 基于 XML Schmea 的配置,基于这个配置事务应用程序就出错,如果有人知道怎么在struts2集成spring2中使用spring2的xml Schmea的配置,请告知
          <br/>
          <span style="color:red;">
            <a href="http://kuru.javaeye.com/blog/196835#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 May 2008 02:27:04 +0800</pubDate>
        <link>http://kuru.javaeye.com/blog/196835</link>
        <guid>http://kuru.javaeye.com/blog/196835</guid>
      </item>
      <item>
        <title>[转载]Ext.data-GroupingStore/JsonStore/SimpleStore</title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/192921" style="color:red;">http://kuru.javaeye.com/blog/192921</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [转载]Ext.data-GroupingStore/JsonStore/SimpleStore <br />Ext.data.GroupingStore<br />继承自Ext.data.Store,为Store增加了分组功能.其它用法与Store一致,惟一需要注意的是使用GroupingStore时必须指定sortInfo信息<br />增加了配置属性 <br />groupField : String//用于分组的字段<br />groupOnSort : Boolean//如果为真,将依排序字段重新分组,默认为假<br />remoteGroup : Boolean//远程排序<br />当然也会多一个group方法<br />groupBy( String field, [Boolean forceRegroup] ) : void<br />顾名思义都是重新排序用的<br /><br />下面是个简单的示例<br />   var arr=[ [1, '本', '拉登'], [2, '笨', '拉登'],[3, '笨', '拉灯'] ];<br />    var reader = new Ext.data.ArrayReader(<br />   ...{id: 0},<br />   [<br />    ...{name: 'name', mapping: 1},        <br />    ...{name: 'occupation', mapping: 2}   <br />    ]);<br />   <br />    var store=new Ext.data.GroupingStore(...{<br />      reader:reader,<br />      groupField:'name',<br />      groupOnSort:true,<br />      sortInfo:...{field: 'occupation', direction: "ASC"} //使用GroupingStore时必须指定sortInfo信息<br />   });<br />   store.loadData(arr);<br />  <br />   //GridPanel以后会讨论,这儿使用它是为了直观的表现GroupingStore<br />   var grid = new Ext.grid.GridPanel(...{<br />    ds: store,<br />    columns: [<br />        ...{header: "name", width: 20, sortable: true,dataIndex: 'name'},<br />        ...{header: "occupation", width: 20,sortable: true, dataIndex: 'occupation'}<br />    ],<br />    view: new Ext.grid.GroupingView(...{<br />        forceFit:true,<br />        groupTextTpl: '{text} ({[values.rs.length]} {[values.rs.length > 1 ? "Items" : "Item"]})'<br />    }),<br />    frame:true,<br />    width: 700,<br />    height: 450,<br />    collapsible: true,<br />    animCollapse: false,<br />    title: 'Grouping Example',<br />    renderTo: 'Div_GridPanel'<br />    });<br /><br />Ext.data.JsonStore<br />也是Store子类,目标是更方便的使用json对象做数据源<br />构造中多了fields,root,用法如下例所示<br />/**//*<br />这是使用远程对象,返回内容与下面本地对象的data一致<br />var store=new Ext.data.JsonStore({<br />        url:'jsoncallback.js',<br />        root:'rows',<br />        fields:['id','name','occupation']<br />    });<br />    store.load();<br />*/<br />    var store=new Ext.data.JsonStore(...{<br />        data:...{ 'results': 2, 'rows': [<br />        ...{ 'id': 1, 'name': 'Bill', occupation: 'Gardener' },<br />        ...{ 'id': 2, 'name': 'Ben', occupation: 'Horticulturalist' }<br />        ]},<br />    autoLoad:true,<br />    root:'rows',<br />    fields:['id','name','occupation']<br />    })<br /><br />    //目前请先略过gridpanel,以后再说<br />    var grid = new Ext.grid.GridPanel(...{<br />    ds: store,<br />    columns: [<br />        ...{header: "id", width: 200, sortable: true,dataIndex: 'id'},<br />        ...{header: "name", width: 200, sortable: true,dataIndex: 'name'},<br />        ...{header: "occupation", width: 200,sortable: true, dataIndex: 'occupation'}<br />    ],height:350,<br />      width:620,<br />      title:'Array Grid',<br />      renderTo: 'Div_GridPanel'<br />    });<br /><br /><br />Ext.data.SimpleStore<br />从数组对象更方便的创建Store对象,<br />例<br />var store=new Ext.data.JsonStore(...{<br />        data:[<br />           [1, 'Bill', 'Gardener'], [2, 'Ben', 'Horticulturalist']<br />            ],<br />        autoLoad:true,<br />        fields:[...{name: 'name', mapping: 1},...{name:'occupation',mapping:2}]<br />    })<br />    var grid = new Ext.grid.GridPanel(...{<br />    ds: store,<br />    columns: [<br />        ...{header: "name", width: 200, sortable: true,dataIndex: 'name'},<br />        ...{header: "occupation", width: 200,sortable: true, dataIndex: 'occupation'}<br />    ],height:350,<br />      width:620,<br />      renderTo: 'Div_GridPanel'<br />    });
          <br/>
          <span style="color:red;">
            <a href="http://kuru.javaeye.com/blog/192921#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 13:36:33 +0800</pubDate>
        <link>http://kuru.javaeye.com/blog/192921</link>
        <guid>http://kuru.javaeye.com/blog/192921</guid>
      </item>
      <item>
        <title>[转载]Ext.data-Store </title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/192920" style="color:red;">http://kuru.javaeye.com/blog/192920</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [转载]Ext.data-Store <br />Ext.data.Store<br />store是一个为Ext器件提供record对象的存储容器,行为和属性都很象数据表<br /><br />方法:不列举继承来的方法<br />Store( Object config )<br />构造,config定义为{<br /> autoLoad : Boolean/Object,    //自动载入<br /> baseParams : Object,    //只有使用httpproxy时才有意义<br /> data : Array,        //数据<br /> proxy : Ext.data.DataProxy,//数据代理<br /> pruneModifiedRecords : boolean,//清除修改信息<br /> reader : Ext.data.Reader,    //数据读取器<br /> remoteSort : boolean,    //远程排序?<br /> sortInfo : Object,    //{field: "fieldName", direction: "ASC|DESC"}这样的排序对象<br /> url : String,        //利用url构造HttpProxy<br />}<br /><br />add( Ext.data.Record[] records ) : void<br />增加记录records 到store<br /><br />addSorted( Ext.data.Record record ) : void<br />增加record到store并排序(仅本地排序时有用)<br /><br />clearFilter( Boolean suppressEvent ) : void<br />清除过滤器<br /><br />collect( String dataIndex, [Boolean allowNull], [Boolean bypassFilter] ) : Array<br />收集由dataIndex指定字段的惟一值<br /><br />commitChanges() : void<br />提交Store所有的变更,会引发Update事件<br /><br /><br />filter( String field, String/RegExp value, [Boolean anyMatch], [Boolean caseSensitive] ) : void<br />设定过滤器<br />field:String    //字段名<br />value:String    //RegExp 如果是字符器,检查field是否以value开始,如果是正则,检查是否匹配<br />anyMatch:Boolean //匹配任何部分而不仅令是开始<br />caseSensitive:Boolean //大小写敏感?<br /><br />filterBy( Function fn, [Object scope] ) : void<br />更强悍的过滤方法.fn接收两个参数record和id<br /><br />find( String property, String/RegExp value, [Number startIndex], [Boolean anyMatch], [Boolean caseSensitive] ) : Number<br />找到符合条件的第一条记录,参数同filter<br /><br />findBy( Function fn, [Object scope], [Number startIndex] ) : Number<br />参见filterBy<br /><br />getAt( Number index ) : Ext.data.Record<br />getById( String id ) : Ext.data.Record<br />依充号/id得到record对象<br /><br />getCount() : void<br />得到记录数<br /><br />getModifiedRecords() : Ext.data.Record[]<br />得到修改过的记录集<br /><br />getRange( [Number startIndex], [Number endIndex] ) : Ext.data.Record[]<br />得到指定范围的记录集合<br /><br />getSortState() : void<br />得到排序状态:显然不是void而是返回一个排序对象,同sortInfo一样的结构{field: "fieldName", direction: "ASC|DESC"}<br /><br />getTotalCount() : void<br />这个对于翻页信息还是很有用的<br /><br />indexOf( Ext.data.Record record ) : Number<br />indexOfId( String id ) : Number<br />由记录或id得到序号<br /><br />insert( Number index, Ext.data.Record[] records ) : void<br />在指定的位置插入记录,并引发add事件<br /><br />isFiltered() : Boolean<br />当前设置了过滤器则返回真<br /><br />load( Object options ) : void<br />由指定的Proxy使用指定的reader读取远程数据<br />options定义为<br />{<br />    params :Object,    //请求url需要附加的参数<br />    callback :Function//回叫方法,接收三个参数<br />      //r : Ext.data.Record[] //返回的record数组<br />      //options: Options load方法传入的options<br />      //success: Boolean //成功<br />    scope :Object, //范围.默认是store本身<br />    add :Boolean 追加还是更新<br />}<br /><br /><br />loadData( Object data, [Boolean append] ) : void<br />用法比load简单一点,目的是一样的,只是这次数据由本地读取<br /><br />query( String field, String/RegExp value, [Boolean anyMatch], [Boolean caseSensitive] ) : MixedCollection<br />queryBy( Function fn, [Object scope] ) : MixedCollection<br />查询,参数和find类似,但返回所有符合条件的record,而不是第一个符合条件记录的序号<br /><br />rejectChanges() : void<br />放弃所有的变更<br /><br />reload( [Object options] ) : void<br />重新载入,相当于 load(options,false),如果连options都没有传入,则取最后一次load时使用的参数<br /><br />remove( Ext.data.Record record ) : void<br />移除指定记录<br /><br />removeAll() : void<br />移除所有记录<br /><br />setDefaultSort( String fieldName, [String dir] ) : void<br />设置默认排序规则<br /><br />sort( String fieldName, [String dir] ) : void<br />排序<br /><br />sum( String property, Number start, Number end ) : Number<br />对property字段由start开始到end求和<br /><br />事件列表<br />add : ( Store this, Ext.data.Record[] records, Number index )<br />beforeload : ( Store this, Object options )<br />clear : ( Store this )<br />datachanged : ( Store this )<br />load : ( Store this, Ext.data.Record[] records, Object options )<br />loadexception : ()<br />metachange : ( Store this, Object meta )<br />remove : ( Store this, Ext.data.Record record, Number index )<br />update : ( Store this, Ext.data.Record record, String operation )<br />看名字都很简单,参数也不复杂,略过<br /><br /><br />用例<br />//得到远程json对象<br />//其中jsoncallback.js内容为<br />//{ 'results': 2, 'rows': [<br />//    { 'id': 1, 'name': 'Bill', occupation: 'Gardener' },<br />//    { 'id': 2, 'name': 'Ben', occupation: 'Horticulturalist' } ]<br />//}<br />//定义proxy<br />      var proxy=new Ext.data.HttpProxy(...{url:'jsoncallback.js'});<br />//定义reader<br />      var reader=new Ext.data.JsonReader(<br />        ...{<br />        totalProperty: "results",//totalRecords属性由json.results得到<br />        root: "rows",            //构造元数据的数组由json.rows得到<br />        id: "id"                //id由json.id得到<br />        },[<br />        ...{name: 'name', mapping: 'name'},<br />        ...{name: 'occupation'}            //如果name与mapping同名,可以省略mapping<br />        ]<br />    )<br />//构建Store   <br />    var store=new Ext.data.Store(...{<br />      proxy:proxy,<br />      reader:reader<br />   });<br />//载入<br />store.load();<br /><br />示例2<br />//得到远程xml文件<br />//其中xml文件内容为<br />&lt;?xml version="1.0" encoding="utf-8" ?><br />&lt;dataset><br />  &lt;results>2&lt;/results><br />  &lt;row><br />    &lt;id>1&lt;/id><br />    &lt;name>Bill&lt;/name><br />    &lt;occupation>Gardener&lt;/occupation><br />  &lt;/row><br />  &lt;row><br />    &lt;id>2&lt;/id><br />    &lt;name>Ben&lt;/name><br />    &lt;occupation>Horticulturalist&lt;/occupation><br />  &lt;/row><br />&lt;/dataset><br /><br />var proxy=new Ext.data.HttpProxy(...{url:'datasource.xml'});<br />   <br />    var reader = new Ext.data.XmlReader(...{<br />       totalRecords: "results",<br />       record: "row",        <br />       id: "id"                <br />    }, [<br />       ...{name: 'name', mapping: 'name'},<br />       ...{name: 'occupation'}           <br />    ]);<br />   var store=new Ext.data.Store(...{<br />      proxy:proxy,<br />      reader:reader<br />   });<br />store.load();<br /><br />示例3<br />//从本地数组得到<br /> var arr=[ [1, 'Bill', 'Gardener'], [2, 'Ben', 'Horticulturalist'] ];<br />var reader = new Ext.data.ArrayReader(<br />   ...{id: 0},<br />   [<br />    ...{name: 'name', mapping: 1},        <br />    ...{name: 'occupation', mapping: 2}   <br />    ]);<br />   <br />    var store=new Ext.data.Store(...{<br />      reader:reader<br />   });<br />   store.loadData(arr);
          <br/>
          <span style="color:red;">
            <a href="http://kuru.javaeye.com/blog/192920#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 13:35:48 +0800</pubDate>
        <link>http://kuru.javaeye.com/blog/192920</link>
        <guid>http://kuru.javaeye.com/blog/192920</guid>
      </item>
      <item>
        <title>[转载]Ext.data-DataReader/ArrayReader/JsonReader/Xml</title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/192919" style="color:red;">http://kuru.javaeye.com/blog/192919</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [转载]Ext.data-DataReader/ArrayReader/JsonReader/XmlReader <br />Ext.data.DataReader<br />纯虚类,从数据源得到结构化数据转换为元数据对象,对象包含Record的集合,一般用做Store对象的元数据,<br />具有如下格式<br />{<br />totalRecord:int,<br />records:Array of Ext.data.Record<br />}<br />具体使用参见三个子类<br />Ext.data.ArrayReader/Ext.data.JsonReader/Ext.data.XmlReader<br /><br /><br />方法<br />DataReader( Object meta, Object recordType )<br />构造<br /><br />Ext.data.ArrayReader<br />用于读数组到一个元数据对象<br /><br />ArrayReader( Object meta, Object recordType )<br />构造,第一个参数是配置除了可以指示使用哪个字段做id外,不懂其它的用法,<br />第二个参数是recordType与record对象的create方法的参数一样,是一样config对象数组,具体参见<br />readRecords( Object o ) : Object<br />读取o,返回一个元数据对象<br /><br />用例示范:<br />//定义数组<br />var arr=[ [1, 'Bill', 'Gardener'], [2, 'Ben', 'Horticulturalist'] ]; <br />var reader = new Ext.data.ArrayReader(<br />//以第一个元素做为recordid<br />   {id: 0}, <br />//定义数组到record的映射关系<br />   [<br />    {name: 'name', mapping: 1},         <br />    {name: 'occupation', mapping: 2}    <br />   ]<br />);<br />//生成元数据<br />var data=reader.readRecords(arr);<br /><br />Ext.data.JsonReader<br />用于将一个json对象转换为元数据对象<br /><br />JsonReader( Object meta, Object recordType )<br />JsonReader的构造参数meta可以有更多选择,<br />{<br />  id : String,<br />  root : String,<br />  successProperty : String,<br />  totalProperty : String<br />}<br />都是对应json对象的属性名<br /><br />read( Object response ) : Object<br />从一个response对象返回,response.responseText属性应仅含有一个json格式数据块<br /><br />readRecords( Object o ) : Object<br />读取o,返回一个元数据对象<br /><br />使用示例:<br />     var json={ 'results': 2, 'rows': [<br />    { 'id': 1, 'name': 'Bill', occupation: 'Gardener' },<br />    { 'id': 2, 'name': 'Ben', occupation: 'Horticulturalist' } ]<br />};<br />    var reader=new Ext.data.JsonReader(<br />        {<br />        totalProperty: "results",//totalRecords属性由json.results得到<br />        root: "rows",            //构造元数据的数组由json.rows得到<br />        id: "id"                //id由json.id得到<br />        },[<br />        {name: 'name', mapping: 'name'}, <br />        {name: 'occupation'}            //如果name与mapping同名,可以省略mapping<br />        ]<br />    )<br />    var data=reader.readRecords(json);<br /><br /><br /><br />Ext.data.XmlReader<br />xmlreader对象当然是为xml而准备的<br /><br />构造:<br />XmlReader( Object meta, Mixed recordType )<br />meta与jsonreader类似, <br />meta是一个{ <br />    id : String,<br />    record : String,<br />    success : String,<br />    totalRecords : String<br />}对象,只是这些字符串都是相对于文档根目录的domquery路径<br />read( Object response ) : Object<br />readRecords( Object doc ) : Object<br />....<br /><br /><br />var str=["&lt;?xml version=\"1.0\" encoding=\"utf-8\" ?>",<br />    "&lt;dataset>",<br /> "&lt;results>2&lt;/results>",<br /> "&lt;row>",<br />   "&lt;id>1&lt;/id>",<br />   "&lt;name>Bill&lt;/name>",<br />   "&lt;occupation>Gardener&lt;/occupation>",<br /> "&lt;/row>",<br /> "&lt;row>",<br />   "&lt;id>2&lt;/id>",<br />   "&lt;name>Ben&lt;/name>",<br />   "&lt;occupation>Horticulturalist&lt;/occupation>",<br /> "&lt;/row>",<br />"&lt;/dataset>"].join("");<br /><br />//生成xmldocument对象<br />var xmlDocument;<br /> if(Ext.isIE){<br />    xmlDocument = new ActiveXObject("Msxml2.FreeThreadedDOMDocument")<br />    xmlDocument.async=false;<br />    xmlDocument.resolveExternals = false;<br />    xmlDocument.loadXML(str) <br />}<br />else{<br />   xmlDocument = (new DOMParser()).parseFromString(str, "text/xml");<br />}<br /><br />//然后开始...和其它两个reader一样的用法,只是这儿换了一种写法,recordtype也可以是一个record对象<br />var record = Ext.data.Record.create([<br />   {name: 'name', mapping: 'name'},     // "mapping" property not needed if it's the same as "name"<br />   {name: 'occupation'}                 // This field will use "occupation" as the mapping.<br />])<br />var reader = new Ext.data.XmlReader({<br />   totalRecords: "results", <br />   record: "row",           //row是节点选择器<br />   id: "id"                 <br />}, record);<br />var data=reader.readRecords(xmlDocument);
          <br/>
          <span style="color:red;">
            <a href="http://kuru.javaeye.com/blog/192919#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 13:35:03 +0800</pubDate>
        <link>http://kuru.javaeye.com/blog/192919</link>
        <guid>http://kuru.javaeye.com/blog/192919</guid>
      </item>
      <item>
        <title>[转载]Ext.data-DataProxy/HttpProxy/MemoryProxy/Scrip</title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/192918" style="color:red;">http://kuru.javaeye.com/blog/192918</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [转载]Ext.data-DataProxy/HttpProxy/MemoryProxy/ScriptTagProxy <br />Ext.data.DataProxy<br />数据代理类是一个纯虚类，主要用于生成Ext.data.Record对象，没有公开的属性和方法，只是归定子类需要处理三个事件<br />beforeload : ( Object This, Object params )<br />load : ( Object This, Object o, Object arg )<br />loadexception : ( Object This, Object o, Object arg, Object e )<br />事实上参数也是子类自定义的<br /><br />Ext.data.HttpProxy<br />api文档中说httpProxy是从object继承来的，事实上source中它和下面的Ext.data.MemoryProxy/Ext.data.ScriptTagProxy都继承于DataProxy<br />HttpProxy用于远程代理,而且服务端返回信息时必须指定Content-Type属性为"text/xml".<br /><br />HttpProxy( Object conn )<br />构造一个HttpProxy对象,参数可以是一个类似于{url: 'foo.php'}这样的json对象,也可以是一个Ext.data.Connection对象,如果参数没有指定，将使用Ext.Ajax对象将被用于发起请求<br /><br />getConnection() : Connection<br />得到当前连接对象<br /><br />load( Object params, Ext.data.DataReader reader, Function callback, Object scope, Object arg ) : void<br />从配置的connection对象得到record数据块，并激发callback<br />params:        发起http请求时所要传递到服务端的参数<br />DataReader:    见DataReader<br />callback:    回叫方法,第一个参数为接收到的信息,第二个参数为arg,第三个是成功标志<br />scope:        范围<br />arg:        这儿的参数将会传递给回叫函数callback<br /><br />使用示例:<br />var proxy=new Ext.data.HttpProxy({url:'datasource.xml'});<br />    //关于reader将会在Ext.data.DataReader中讲解<br />    var reader = new Ext.data.XmlReader({<br />       totalRecords: "results", <br />       record: "row",         <br />       id: "id"                 <br />    }, [<br />       {name: 'name', mapping: 'name'},<br />       {name: 'occupation'}            <br />    ]);<br />    <br />    //定义回叫方法<br />    var metadata;<br />    function callback(data,arg,success){<br />        if(success){<br />            metadata=data;<br />        }<br />    }<br />    //从connection配置的url中利用reader将返回的xml文件转为元数据,并传递给callback<br />    proxy.load( null,reader,callback,this);<br /><br />Ext.data.MemoryProxy<br />MemoryProxy( Object data )<br />构造<br />load( Object params, Ext.data.DataReader reader, Function callback, Object scope, Object arg ) : void<br />取数据，和HttpProxy类似,只是params参数没有被使用<br /><br />使用示例<br />var proxy=new Ext.data.MemoryProxy([ [1, 'Bill', 'Gardener'], [2, 'Ben', 'Horticulturalist'] ]); <br />var reader = new Ext.data.ArrayReader(<br />{id: 0}, <br />[<br />{name: 'name', mapping: 1},         <br />{name: 'occupation', mapping: 2}    <br />]);<br /><br />var metadata;<br />function callback(data,arg,success){<br />    metadata=data;<br />}<br />proxy.load( null,reader,callback,this);<br /><br /><br />Ext.data.ScriptTagProxy<br />这个类和HttpProxy类似，也是用于请求远程数据,但能用于跨主域调用,如果请求时使用了callback参数<br />则服务端应指定Content-Type属性为"text/javascript"<br />并返回callback(jsonobject)<br />反之则应置Content-Type属性为"application/x-json"<br />并直接返回json对象<br /><br />ScriptTagProxy( Object config )<br />构造,其中<br />config定义为{<br />callbackParam : String,    //回叫参数<br />nocache : Boolean,    //是否缓存<br />timeout : Number,    //超时<br />url : String        //请求数据的url<br />}<br /><br />abort() : void<br />放弃<br /><br />load( Object params, Ext.data.DataReader reader, Function callback, Object scope, Object arg ) : void<br />参见HttpProxy
          <br/>
          <span style="color:red;">
            <a href="http://kuru.javaeye.com/blog/192918#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 13:34:12 +0800</pubDate>
        <link>http://kuru.javaeye.com/blog/192918</link>
        <guid>http://kuru.javaeye.com/blog/192918</guid>
      </item>
      <item>
        <title>[转载]Ext.data - Connection/Ajax/Record</title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/192917" style="color:red;">http://kuru.javaeye.com/blog/192917</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [转载]Ext.data- Connection/Ajax/Record <br />Ext.data.Connection<br />访问指定的url,这是个异步调用类,如果想得到服务器信息,请在request参数中指定callback方法或指定侦听者(对文件上传无效)<br /><br />Connection( Object config )<br />构造,config定义为{<br /> autoAbort : Boolean,<br /> defaultHeaders : Object,<br /> disableCaching : Boolean,<br /> extraParams : Object,<br /> method : String,<br /> timeout : Number,<br /> url : String<br />}<br />对象<br /><br />方法:由    Observable继承过来的方法省略<br />abort( [Number transactionId] ) : void<br />放弃请求,如果同时有多个请求发生,参数指示请求进程序号,不指定则是放弃最后一个请求<br /><br />isLoading( [Number transactionId] ) : Boolean<br />第transactionId个请求是否完成载入,未批定指最后一个<br /><br />request( [Object options] ) : Number<br />最实用的当然是这个方法了,返回的正是前面的两个方法所需要的进程id<br />其中options定义为{<br />url:string,    //请求url<br />params:Object/String/Function, //以post方法请求时传递的参数<br />method:string ,        //Get/Post<br />callback:Function,    //回叫方法,不管是成功还是失败都会呼叫这个方法,有三个参数,由options传入的options参数,success:Boolean,成功? response:Object, 含有返回数据的XMLHttpRequest对象<br />success:Function,    //成功时回叫,第一个参数为XMLHttpRequest对象,第二个参数传入指定的options<br />failure:Function,    //失败时回叫,参数同success<br />scope:Object,        //范围<br />form:Object/String,    //一个form对象或它的id,可以由此自动生成参数params<br />isUpload:Boolean,    //文件上传?通常可以自动检测<br />headers:Object,        //要自定义的请求头信息<br />xmlData:Object        //一个xml文档对象,它将通过url附加参数的方式发起请求<br />disableCaching:Boolean    //是否禁用缓存?默认为真<br />}<br /><br />Ext.Ajax<br />由Ext.data.Connection 继承而来,方法和父类一模一样,但使用起来更简单一些,是一个全局惟一静态类<br />示例:<br />Ext.Ajax.request({<br />   url: 'foo.php',<br />   success: someFn,<br />   failure: otherFn,<br />   headers: {<br />       'my-header': 'foo'<br />   },<br />   params: { foo: 'bar' }<br />});<br /><br /><br />Ext.Ajax.request({<br />    form: 'some-form',<br />    params: 'foo=bar'<br />});<br /><br />//所有的Ext.Ajax请求都会加个这个默认的头<br />Ext.Ajax.defaultHeaders = {<br />    'Powered-By': 'Ext'<br />};<br /><br />//所有的Ext,Ajax在发起请求前都会调用showSpinner<br />Ext.Ajax.on('beforerequest', this.showSpinner, this);<br /><br /><br />Ext.data.Record<br />基本上可以理解为.net中的datarow或者sql server中的一行数据，它存放了数据的定义信息和他们的值<br />[公有属性]<br />data : Object        数据内容，一个json对象<br />dirty : Boolean        是否修改过<br />id : Object        惟一ID,默认从1000开始以1剃增<br />modified : Object    如果记录没有修改过，为null如果修改过则存放原始值信息<br />[公有方法]<br />Record( Array data, [Object id] )<br />这个构造方法并不用于创建记录对象，相反，应该使用create方法来创建record对象,参数data定义见create方法,id默认递增起始id<br /><br />beginEdit() : void<br />开始修改<br /><br />cancelEdit() : void <br />放弃所做的修改,参见commit<br /><br />copy( [String id] ) : Record<br />//创建当前record的一个克隆值,如果未指定id使用当前id+1<br /><br />commit( [Boolean silent] ) : void <br />commit方法一般会被Store对象调用而不是recorde本身,提交自创建或最后一次修改后的所有变更,如果silent为真将不会通知store对象<br /><br /><br />create( [Array o] ) : function<br />静态构造方法 o是config数组<br />其中config可以含有如下属性<br />{<br />name : String     //字段名<br />mapping : String //用于reader时的映射关系，如果是用于jsonreader，使用相对当前记录的javascript表达式<br />        //,如果是用于xmlreader,则是相对于记录的domquery表达式,对于ArrayReader,则是序号<br />type:String    //可选值 auto /string/int/float/boolean/date,其中auto是默认值，不进行转换<br />sortType : Mixed //排序类型,Ext.data.SortTypes成员之一,参见sortTypes<br />sortDir : String  //正序倒序 ASC/DESC值之一<br />convert : Function    //转换函数,这个功能很有用，可自定义，接收当前value返回处理后的value<br />dateFormat : String    //日期格式化字符串,convert:function的一个特例，使用Date.parseDate方法转换当前日期<br />}<br /><br /><br />endEdit() : void<br />结束修改<br /><br />get( name {String} ) : Object<br />指定命名字段string的值<br /><br />getChanges() : Object<br />返回修改记录的对象<br /><br />reject( [Boolean silent] ) : void<br />和commit相似，当然是拒绝所做的修改<br /><br />set( String name, Object value ) : void<br />为字段name设定新值value
          <br/>
          <span style="color:red;">
            <a href="http://kuru.javaeye.com/blog/192917#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 13:33:00 +0800</pubDate>
        <link>http://kuru.javaeye.com/blog/192917</link>
        <guid>http://kuru.javaeye.com/blog/192917</guid>
      </item>
      <item>
        <title>[转载]EXT核心API详解(七)</title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/192914" style="color:red;">http://kuru.javaeye.com/blog/192914</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [转载]EXT核心API详解(七)-Ext.KeyNav/KeyMap/JSON/Format/DelayedTask/TaskRunner/TextMetrics/XTemplate <br />Ext.KeyNav<br />Ext的keyNav类能为Ext.Element元素提供简单的按键处理方法<br />例:<br />var el=Ext.get("textarea");<br />new Ext.KeyNav(el, {<br />    "left" : function(e){<br />        alert("left key down");<br />        },<br />    scope : el<br />    }<br />);<br />它的行为与KeyMap类似，但功能比KeyMap要弱小的多，只能处理以下已定义键<br />enter/left/right/up/down/tab/esc/pageUp/pageDown/del/home/end<br />同情一下KeyNav<br /><br />方法只有三个,不用多解释<br />KeyNav( Mixed el, Object config )<br />disable() : void<br />enable() : void<br /><br />Ext.KeyMap类<br />则强悍的多,其中最重要的当然是对按键的定义更灵活<br />例:上例用KeyMap来写可能是<br />var el=Ext.get("textarea");<br />new Ext.KeyMap(el, {<br />        key:Ext.EventObject.LEFT,<br />        fn: function(e){<br />            alert("left key down");<br />        },<br />        scope : el<br />    }<br />);<br /><br />方法<br />KeyMap( Mixed el, Object config, [String eventName] )<br />构造,与KeyNav也相似，但更灵活<br />它是{<br />key:        String/Array,     //可以是数字，字符，也可以是Ext.EventObject.LEFT这样的助记符,还能是他们组成的数组<br />shift:       Boolean,          //ctrl键按下?<br />ctrl:        Boolean,<br />alt :        Boolean,<br />fn  :        Function,         //回叫方法<br />scope:       Object          //范围<br />}这样的对象或它们组成的数组<br />比如{key: 10},{key: [10,13]},{key:'\t'},{key:'abcd'},{key:Ext.EventObject.LEFT}都是合法的定义<br /><br />addBinding( Object/Array config ) : void<br />增加新的绑定动作 config参见构造<br /><br />disable() : void<br />enable() : void<br />isEnabled() : Boolean<br />允许，静止和状态查询<br /><br />on( Number/Array/Object key, Function fn, [Object scope] ) : void<br />只添加一个处理时addBinding的快捷方式,但个人感觉并没有简单到哪儿去。<br /><br /><br />Ext.util.JSON<br />轮到大名鼎鼎的JSON了，可惜Ext提供的JSON对象功能好弱小，只有encode主decode两个方法<br />而且只能编码String/Array/Date,至少也要搞个 xml2json/json2xml方法呀<br /><br />Ext.util.Format<br />主要提供了一些格式化方法<br /><br />capitalize( String value ) : String<br />首字母大写<br /><br />date( Mixed value, [String format] ) : String<br />格式化日期输出,还是Date.format方法好用<br /><br />dateRenderer( String format ) : Function<br />返回一个利用指定format格式化日期的方法<br /><br />defaultValue( Mixed value, String defaultValue ) : String<br />如果value未定义或为空字符串则返回defaultValue<br /><br />ellipsis( String value, Number length ) : String<br />如果value的长度超过length的,取前length-3个并用...替代，对中国人来说还是垃圾功能，用的字符串长度不是字节长度<br /><br />fileSize( Number/String size ) : String<br />简单的格式化文件长度为 xxxbytes xxxKB xxxMB,没有GB哟<br /><br />htmlEncode( String value ) : String<br />htmlDecode( String value ) : String<br />HTML编码解码,将& &lt;  >  “替换为&amp;&lt;&gt;&quot;<br /><br />lowercase( String value ) : String<br />将value转换为全小写<br /><br />stripScripts( Mixed value ) : String<br />去除脚本标签<br /><br />stripTags( Mixed value ) : String<br />去除HTML标签<br /><br />substr( String value, Number start, Number length ) : String<br />取子字符串<br /><br />trim( String value ) : String<br />去除开头和结尾的空格<br /><br />undef( Mixed value ) : Mixed<br />如果value未定义,返回空字符串，反之返回value本身<br /><br />uppercase( String value ) : String<br />转为全大写<br /><br />usMoney( Number/String value ) : String<br />转为美元表示<br /><br />Ext.util.DelayedTask<br />提供一个setTimeout的简单替代方法<br /><br />公开的方法也只有三个<br />DelayedTask( [Function fn], [Object scope], [Array args] )<br />delay( Number delay, [Function newFn], [Object newScope], [Array newArgs] ) :<br />cancel() : void<br />简单的示例用法如果<br />var task=new Ext.util.DelayedTask(Ext.emptuFn);<br />task.delay(1000);<br />task.cancel();<br /><br />Ext.util.TaskRunner<br />增强版的DelayedTask,能提供多线程的定时服务，<br />例:<br />var task = {<br />    run: function(){<br />        Ext.fly('clock').update(new Date().format('g:i:s A'));<br />    },<br />    interval: 1000 <br />}<br />var runner = new Ext.util.TaskRunner();<br />runner.start(task);<br /><br />四个方法都很简单<br />TaskRunner( [Number interval] )<br />start( [Object task] ) : Object<br />stop( Object task ) : Object<br />stopAll() : void<br /><br /><br />Ext.util.TextMetrics<br />这个类主要是为了准备的得到块状化文本正确的高度和宽度<br />例:<br />var metrics=Ext.util.TextMetrics.createInstance('div');<br />metrics.setFixedWidth(100);<br />var size=metrics.getSize("中华人民共和国中华人民共和国中华人民共和国中华人民共和国");<br />Ext.MessageBox.alert("getsize",String.format("width:{0}px\theight:{1}px",size.width,size.height))<br /><br />方法<br />bind( String/HTMLElement el ) : void<br />绑定到el<br /><br />createInstance( String/HTMLElement el, [Number fixedWidth] ) : Ext.util.TextMetrics.Instance<br />为el创建TextMetrics实例<br /><br />getHeight( String text ) : Number<br />getSize( String text ) : Object<br />getWidth( String text ) : Number<br />得到尺寸<br /><br />measure( String/HTMLElement el, String text, [Number fixedWidth] ) : Object<br />测算文本text在el中将要占用的尺寸<br /><br />setFixedWidth( Number width ) : void<br />设置指定的宽度<br /><br />Ext.XTemplate<br />增强型模板，支持更多功能了，虽然方法不多，但用起来来还真的很麻烦，但并不建议大家学习这样的自定义语法，不如用xslt<br />另外这个Xtemplate虽然命名空间在Ext之下，但源文件却是放在util目录中的<br />XTemplate( String/Array html )<br />XTemplate.from( String/HTMLElement el ) : Ext.XTemplate<br />apply() : void<br />applyTemplate( Object values ) : String<br />compile() : Function<br />这些方法Ext.Template中都有说明，
          <br/>
          <span style="color:red;">
            <a href="http://kuru.javaeye.com/blog/192914#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 13:28:10 +0800</pubDate>
        <link>http://kuru.javaeye.com/blog/192914</link>
        <guid>http://kuru.javaeye.com/blog/192914</guid>
      </item>
      <item>
        <title>[转载]EXT核心API详解(六)</title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/192912" style="color:red;">http://kuru.javaeye.com/blog/192912</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [转载]EXT核心API详解(六)-Ext.Fx <br />Ext.Fx类<br />对于我这样的懒鬼而言，Fx类是核心类库中最激动人心的一个类，它不是最重要的，却是最实用的一个类<br />定义了一些常用的特效方法,不妨自己多动手试试下面的方法，很有趣的<br /><br />fadeIn( [Object options] ) : Ext.Element<br />渐显 options参数有以下属性<br />callback:Function    完成后的回叫方法<br />scope:Object        目标<br />easing:String        行为方法 默认值是:easeOut,可选值在ext_base中找到,但没有说明,以下内容从yahoo ui中找到的<br />easeNone:匀速<br />easeIn:开始慢且加速<br />easeOut:开始快且减速<br />easeBoth:开始慢且减速<br />easeInStrong:开始慢且加速,t的四次方<br />easeOutStrong:开始快且减速,t的四次方<br />easeBothStrong:开始慢且减速,t的四次方<br />elasticIn:<br />elasticOut:<br />elasticBoth:<br />backIn:<br />backOut:<br />backBoth:<br />bounceIn:<br />bounceOut:<br />bounceBoth:<br />太多,慢慢体会吧<br />afterCls:String        事件完成后元素的样式<br />duration:Number        事件完成时间（以秒为单位）<br />remove:Boolean        事件完成后元素销毁?<br />useDisplay:Boolean    隐藏元素是否使用display或visibility属性?<br />afterStyle:String/Object/Function        事件完成后应用样式<br />block:Boolean        块状化?<br />concurrent:Boolean    顺序还是同时执行？<br />stopFx ：Boolean    当前效果完成后随合的效果是否将停止和移除<br /><br />fadeOut( [Object options] ) : Ext.Element<br />渐隐 fadeOut和fadeIn能使用一个特别的endOpacity属性以指示结束时的透明度<br />例:el.fadeIn({duration:5,endOpacity:0.7});<br /><br />frame( [String color], [Number count], [Object options] ) : Ext.Element<br />边框变亮扩展然后渐隐<br />例:el.frame("ff0000", 10, { duration: 3 })<br /><br />ghost( [String anchor], [Object options] ) : Ext.Element<br />渐渐滑出视图,anchor定义<br />tl     左上角(默认)<br />t      上居中 <br />tr     右上角<br />l      左边界的中央<br />c      居中<br />r      右边界的中央<br />bl     左下角<br />b      下居中<br />br     右下角<br />例:<br />el.ghost('b', {<br />    easing: 'easeOut',<br />    duration: .5<br />    remove: false,<br />    useDisplay: false<br />});<br /><br />hasActiveFx() : Boolean<br />指示元素是否当前有特效正在活动<br /><br />hasFxBlock() : Boolean<br />是否有特效阻塞了<br /><br />highlight( [String color], [Object options] ) : Ext.Element<br />高亮显示当前元素<br />例:el.highlight("ffff9c", {<br />    attr: "background-color", //can be any valid CSS property (attribute) that supports a color value<br />    endColor: (current color) or "ffffff",<br />    easing: 'easeIn',<br />    duration: 1<br />});<br /><br /><br />pause( Number seconds ) : Ext.Element<br />暂停<br /><br />puff( [Object options] ) : Ext.Element<br />吹，吹，吹个大气球，元素渐大并隐没<br />例:el.puff({<br />    easing: 'easeOut',<br />    duration: .5,<br />    remove: false,<br />    useDisplay: false<br />});<br /><br />scale( Number width, Number height, [Object options] ) : Ext.Element<br />缩放<br />例:el.scale(<br />    [element's width],<br />    [element's height], {<br />    easing: 'easeOut',<br />    duration: .35<br />});<br /><br />sequenceFx()<br />排队特效<br /><br />shift( Object options ) : Ext.Element<br />位移,并可重置大小,透明度等<br />例:<br />el.shift({<br />    width: [element's width],<br />    height: [element's height],<br />    x: [element's x position],<br />    y: [element's y position],<br />    opacity: [element's opacity],<br />    easing: 'easeOut',<br />    duration: .35<br />});<br /><br />slideIn( [String anchor], [Object options] ) : Ext.Element<br />slideOut( [String anchor], [Object options] ) : Ext.Element<br />滑入/滑出<br />例:el.slideIn('t', {<br />    easing: 'easeOut',<br />    duration: .5<br />});<br /><br /><br />stopFx() : Ext.Element<br />停止特效<br /><br />switchOff( [Object options] ) : Ext.Element<br />收起并隐没<br />例:<br />el.switchOff({<br />    easing: 'easeIn',<br />    duration: .3,<br />    remove: false,<br />    useDisplay: false<br />});<br /><br /><br />syncFx() : Ext.Element<br />异步特效
          <br/>
          <span style="color:red;">
            <a href="http://kuru.javaeye.com/blog/192912#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 13:27:33 +0800</pubDate>
        <link>http://kuru.javaeye.com/blog/192912</link>
        <guid>http://kuru.javaeye.com/blog/192912</guid>
      </item>
      <item>
        <title>[转载]EXT核心API详解(五)</title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/192911" style="color:red;">http://kuru.javaeye.com/blog/192911</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [转载]EXT核心API详解(五)-Ext.EventManager/EventObject/CompositeElement/CompositeElementLite <br />Ext.EventManager<br />事件管理者中的大部分方法都在Ext中有定义,主要用于事件管理<br /><br /><br />addListener( String/HTMLElement el, String eventName, Function handler,<br />on( String/HTMLElement el, String eventName, Function handler, [Object scope], [Object options] ) : void<br />onDocumentReady( Function fn, [Object scope], [boolean options] ) : void<br />removeListener( String/HTMLElement el, String eventName, Function fn ) :<br />un( String/HTMLElement el, String eventName, Function fn ) : Boolean<br />参见Ext<br /><br />onWindowResize( Function fn, Object scope, boolean options ) : void<br />窗口大小变更时触发<br /><br />onTextResize( Function fn, Object scope, boolean options ) : void<br />活动文本尺寸变更时触发<br /><br /><br /><br />Ext.EventObject<br />这两个类都定义在EventManager.js中，分开是为了逻辑上更清晰吧,这个类主要用于描述事件本身，一般用做事件处理方法的参数<br />另外这个害定义了一些键值常量，比ascii码好记<br />例<br />function handleClick(e){ // 这儿的e就是一个EventObject对象<br />    e.preventDefault();<br />    var target = e.getTarget();<br />    ...<br /> }<br /> var myDiv = Ext.get("myDiv");<br /> myDiv.on("click", handleClick);<br /> //or<br /> Ext.EventManager.on("myDiv", 'click', handleClick);<br /> Ext.EventManager.addListener("myDiv", 'click', handleClick);<br /><br />getCharCode() : Number<br />getKey() : Number<br />在非webkit|khtml类型网页中这两个方法是一样的，得到按键的值<br /><br />getPageX() : Number<br />getPageY() : Number<br />getXY() : Array<br />得到事件坐标<br /><br />getRelatedTarget() : HTMLElement<br />得到关联目标?我总是得到null<br /><br />getTarget( [String selector], [Number/Mixed maxDepth], [Boolean returnEl] ) :<br />如果没有定义selector则直接返回target属性,如果定义了selector，则利用selector寻找祖先节点<br /><br />getTime() : Number<br />得到事件发生的时间?<br /><br />getWheelDelta() : Number <br />应该是个过时的方法，反正在ie和火狐下都不知道做什么用的,原意应该是得到鼠标的按键信息？<br /><br />hasModifier() : Boolean<br />事件发生时是否同时按下了ctrl/alt/shift键之一？<br /><br />preventDefault() : void<br />阻止浏览器的默认事件？<br /><br />stopEvent() : void<br />preventDefault+stopPropagation<br /><br />stopPropagation() : void<br />阻止事件冒泡<br /><br />within( Mixed el, [Boolean related] ) : Boolean<br />如果事件的目标是el或者它的子节点将返回真<br /><br /><br />Ext.CompositeElement类<br />基础的复合元素类,为容器中每个元素创建一个Ext.Element对象<br />虽然不是继承自Ext.Element，但事实上它几乎支持Element类的所有方法<br />例:<br />var els = Ext.select("#some-el div.some-class", true);<br />els.setWidth(100);<br /><br /><br />add( String/Array els ) : CompositeElement<br />添加 css选择器els匹配的元素 或 元素组成的数组 到当前对象<br /><br />clear() : void<br />清除所有元素<br /><br />contains() : Boolean<br />应该是contains(Mixed el):Boolean,当前复合元素中是否含有el<br /><br />each( Function fn, [Object scope] ) : CompositeElement<br />通过el,this,index参数为每个元素调用fn<br /><br />fill( String/Array els ) : CompositeElement<br />clear()& add(els)<br /><br />filter( String selector ) : CompositeElement<br />过滤<br /><br />first() : Ext.Element<br />第一个元素<br /><br />getCount() : Number<br />//元素的数量<br /><br />indexOf() : Boolean<br />同contains一样应该有个Mixed参数<br /><br />item( Number index ) : Ext.Element<br />第index个元素<br /><br />last() : Ext.Element<br />最后一个元素<br /><br />removeElement( Mixed el, [Boolean removeDom] ) : CompositeElement<br />删除el元素<br /><br />replaceElement( Mixed el, Mixed replacement, [Boolean domReplace] ) : CompositeElement<br />替换<br /><br />Ext.CompositeElementLite<br />由Ext.CompositeElement继承而来，重写了一些方法，但没看出与父类有什么不同<br />addElements /invoke /item /addListener /each /indexOf /replaceElement
          <br/>
          <span style="color:red;">
            <a href="http://kuru.javaeye.com/blog/192911#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 13:26:58 +0800</pubDate>
        <link>http://kuru.javaeye.com/blog/192911</link>
        <guid>http://kuru.javaeye.com/blog/192911</guid>
      </item>
      <item>
        <title>[转载]EXT核心API详解(四)</title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/192910" style="color:red;">http://kuru.javaeye.com/blog/192910</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [转载]EXT核心API详解(四)-Ext.DomQuery/DomHelper/Template <br />Ext.DomQuery类<br />selector语法详见Ext类<br /><br />compile( String selector, [String type] ) : Function<br />编写一个选择器或xpath查询到一个方法以方便重用,type取select(默认)或simple值之一<br /><br />filter( Array el, String selector, Boolean nonMatches ) : Array<br />过滤el中的元素,保留符合selector的，如果nonMatches为真，结果相反<br /><br />is( String/HTMLElement/Array el, String selector ) : Boolean<br />验证el是否匹配selector<br /><br />select( String selector, [Node root] ) : Array<br />从root中选择匹配selector的对象数组<br /><br />selectNode( String selector, [Node root] ) : Element<br />返回root中第一个匹配selector的对象<br /><br />selectNumber( String selector, [Node root], Number defaultValue ) : Number<br />返回root中第一个匹配selector的对象的节点值，转换为整数或浮点数<br /><br />selectValue( String selector, [Node root], String defaultValue ) : void<br />返回root中第一个匹配selector的对象的节点值，如果为null,用默认值defaultValue代替<br /><br />Ext.DomHelper类<br />append( Mixed el, Object/String o, [Boolean returnElement] ) : HTMLElement/Ext.Element<br />创建一个新的DOM元素并添加到el<br />参数 o 是一个DOM对象或一个原始html块<br /><br /><br />applyStyles( String/HTMLElement el, String/Object/Function styles ) : void<br />应用样式styles到对象el， 样式的对象表示方法见Ext.Element<br /><br />createTemplate( Object o ) : Ext.Template<br />由o创建一个新的Ext.Template对象，详见 Ext.Template<br /><br />insertAfter( Mixed el, Object o, [Boolean returnElement] ) : HTMLElement/Ext.Element<br />insertBefore( Mixed el, Object/String o, [Boolean returnElement] ) : HTMLElement/Ext.Element<br />创建一个新的DOM对象o并将他们挺入在el之后/之前<br /><br />insertFirst( Mixed el, Object/String o, [Boolean returnElement] ) :<br />创建一个新的DOM元素并做为第一个子节点添加到el (看了这个insertFirst，建议将append取一个别名insertLast:))<br /><br />insertHtml( String where, HTMLElement el, String html ) : HTMLElement<br />where 可选值beforeBegin/afterBegin/beforeEnd/afterEnd<br />将html代码插入到el附近,<br /><br />markup( Object o ) : String<br />返回DOM对象o对应的html代码<br /><br />overwrite( Mixed el, Object/String o, [Boolean returnElement] ) :<br />创建一个新的DOM元素o并用它重写el的内容 <br /><br /><br />Ext.Template类<br />Template类主要是功能是生产html片断,例<br />var t = new Ext.Template(<br />    '&lt;div name="{id}">',<br />        '&lt;span class="{cls}">{name:trim} {value:ellipsis(10)}&lt;/span>',<br />    '&lt;/div>'<br />);<br />t.append('some-element', {id: 'myid', cls: 'myclass', name: 'foo', value: 'bar'});<br /><br />公用方法:<br />Template( String/Array html )<br />构造一个Ext.Template对象，参数可以是字符串形式的html代码或它们组成的数组，<br /><br />Template.from( String/HTMLElement el, Object config ) : Ext.Template<br />能过el的value(优先)或innerHTML来构造模板<br /><br />append( Mixed el, Object values, [Boolean returnElement] ) : HTMLElement/Ext.Element<br />insertAfter( Mixed el, Object values, [Boolean returnElement] ) : HTMLElement/Ext.Element<br />insertBefore( Mixed el, Object values, [Boolean returnElement] ) : HTMLElement/Ext.Element<br />insertFirst( Mixed el, Object values, [Boolean returnElement] ) : HTMLElement/Ext.Element<br />这组方法提供由 value产生的html 代码，并添加到dom 做为el的最后一个子节点/下一个兄弟节点/前一个兄弟节点/第一个子节点<br />values解释参见applyTemplate<br /><br />apply() : void<br />applyTemplate( Object values ) : String<br />apply是applyTemplate的简写，如果参数是数字values可以是一个数组，或者一个象 {id: 'myid', cls: 'myclass', name: 'foo', value: 'bar'}这样的json对象<br /><br /><br />compile() : Ext.Template<br />编译模板,替换掉模板中的\=>\\ ,\r\n|\n==>\\n, '=\',主要是为了js自己处理方便<br /><br />overwrite( Mixed el, Object values, [Boolean returnElement] ) :<br />利用values生成html替换el的内容<br /><br />set( String html, [Boolean compile] ) : Ext.Template<br />设置模板的html,如果compile为真将调用compile方法
          <br/>
          <span style="color:red;">
            <a href="http://kuru.javaeye.com/blog/192910#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 13:26:19 +0800</pubDate>
        <link>http://kuru.javaeye.com/blog/192910</link>
        <guid>http://kuru.javaeye.com/blog/192910</guid>
      </item>
      <item>
        <title>[转载]EXT核心API详解(三)</title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/192909" style="color:red;">http://kuru.javaeye.com/blog/192909</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [转载]EXT核心API详解(三)-Ext.Element <br />Ext.Element类<br /><br />Element( String/HTMLElement element, [Boolean forceNew] )<br />由id或DOM节点创建Element对象<br /><br />Element.fly( String/HTMLElement el, [String named] ) : Element<br />由id或DOM节点创建一个全局共享的活动元素,可由named命名以避免可能的冲突<br /><br />Element.get( Mixed el ) : Element<br />由id或DOM节点或已存在的Element得到一个Ext.Element对象<br /><br />addClass( String/Array className ) : Ext.Element<br />为元素添加一个或多个css类名<br /><br />addClassOnClick( String className ) : Ext.Element<br />为点击事件添加和移除css类<br /><br />addClassOnFocus( String className ) : Ext.Element<br />为得到和失去焦点添加和移除css类<br /><br />addClassOnOver( String className, [Boolean preventFlicker] ) : Ext.Element<br />为鼠标移入移出事件添加和移除css类(该方法未实际使用preventFlicker参数)<br /><br />addKeyListener( Number/Array/Object/String key, Function fn, [Object scope] ) : Ext.KeyMap<br />为对象添加按键侦听 key由数值或字符串或{key: (number or array), shift: (true/false), ctrl: (true/false), alt: (true/false)}这样的对象或他们的数组组成<br /><br />addKeyMap( Object config ) : Ext.KeyMap<br />功能同addKeyListener,只是传参方式不同<br />例:<br />el.addKeyMap({key : "ab",ctrl : true,fn: fn,scope:el });<br />和<br />el.addKeyListener({key:"ab",ctrl:true},fn,el);<br />是等价的,都是在 按下ctral+a或ctrl+b后呼叫fn<br /><br />addListener( String eventName, Function fn, [Object scope], [Object options] ) : void<br />定义事件侦听,eventName:事件名,fn:事件处理方法,scrope:范围,其中options的定义比较复杂,可以包含以下属性<br />scope {Object} : 处理fn的范围<br />delegate {String} : 一个简单选择器(过滤目标或寻找目标的子孙节点)<br />stopEvent {Boolean} : 阻止事件,等于preventDefault+stopPropagation<br />preventDefault {Boolean} : 阻止默认活动<br />stopPropagation {Boolean} : 阻止事件冒泡<br />normalized {Boolean} :设为flase将允许浏览器事件替代Ext.EventObject<br />delay {Number} : 延时多少毫秒后发生<br />single {Boolean} : 只运行一次<br />buffer {Number} : 在Ext.util.DelayedTask中预定事件<br />当然,还可能自定义参数以传入function<br /><br /><br />alignTo( Mixed element, String position, [Array offsets], [Boolean/Object animate] ) : Ext.Element<br />将el对齐到element,positon,指示对齐的位置,可选以下定义<br />tl     左上角(默认)<br />t      上居中 <br />tr     右上角<br />l      左边界的中央<br />c      居中<br />r      右边界的中央<br />bl     左下角<br />b      下居中<br />br     右下角<br />position还可以使用?约束移动不能超出窗口<br />offsets 偏移量,以象素为单位<br />animate 详见animate定义<br /><br />例:div1.alignTo('div2','c-bl?',[20,0],true);<br />采用默认动画将div1的最中央对齐到div2的左下角,并右移20个象素,且不能超出窗口<br /><br /><br />anchorTo( Mixed element, String position, [Array offsets], [Boolean/Object animate], [Boolean/Number monitorScroll], Function callback ) : Ext.Element<br />功能和alignTo类似,只是当窗口重定义大小的时候也会引发重对齐事件<br />monitorScroll参数说明是否需要监视滚动条行为,如果定义为数值则是定义的延时,单位为毫秒,默认是50ms,<br />callback定义了animate完成后的回叫方法<br /><br />animate( Object args, [Float duration], [Function onComplete], [String easing], [String animType] ) : Ext.Element<br />执行动画.<br />args:目标<br />duration:时间间隔.默认是0.35<br />Function:完成后的回叫方法<br />easing:行为方法 默认值是:easeOut,可选值在ext_base中找到,但没有说明,以下内容从yahoo ui中找到的<br />easeNone:匀速<br />easeIn:开始慢且加速<br />easeOut:开始快且减速<br />easeBoth:开始慢且减速<br />easeInStrong:开始慢且加速,t的四次方<br />easeOutStrong:开始快且减速,t的四次方<br />easeBothStrong:开始慢且减速,t的四次方<br />elasticIn:<br />elasticOut:<br />elasticBoth:<br />backIn:<br />backOut:<br />backBoth:<br />bounceIn:<br />bounceOut:<br />bounceBoth:<br />太多,慢慢体会吧<br />animType:定义动画类型,默认值run 可选值:color/motion/scroll<br /><br /><br />appendChild( String/HTMLElement/Array/Element/CompositeElement el ) : Ext.Element<br />添加子元素el(el须已存在)<br /><br />appendTo( Mixed el ) : Ext.Element<br />将当前元素添加到el<br /><br />applyStyles( String/Object/Function styles ) : Ext.Element<br />应用样式,styles是"width:100px"这样的字符串或{width:"100px"}这样的对象,function是指返回这样的字串和对象的函数,这是一个没有用的批示,因为任何传参的地方都可以是返回要求类型的function.另见setStyle<br /><br />autoHeight( [Boolean animate], [Float duration], [Function onComplete], [String easing] ) : Ext.Element<br />自适应高度,参数都是老相识了,惟一需要注意的是这个方法使用了setTimeout,高度不会马上变更<br /><br />blur() : Ext.Element<br />失去焦点,忽略所有的异常<br /><br />boxWrap( [String class] ) : Ext.Element<br />用一个指定样式class的div将当前元素包含起来,class默认值为x-box<br /><br />center( [Mixed centerIn] ) : void<br />alignTo的简华版.相当于alignTo(centerIn || document, 'c-c'),当前元素的中心对齐到centerIn元素的中心<br /><br />child( String selector, [Boolean returnDom] ) : HTMLElement/Ext.Element<br />依selector选择子孙节点,依returnDom不同批示返回html元素还是ext元素,未定义或false时返回Ext.Element<br /><br />clean( [Boolean forceReclean] ) : void<br />清除无用的空白文本节点(我喜欢这个想法)<br /><br />clearOpacity() : Ext.Element<br />清除当前元素样式中不通用元素,清除ie中的filter,清除FF中的opacity/-moz-opacity/-khtml-opacity<br /><br />clearPositioning( [String value] ) : Ext.Element<br /> 清除定位,恢复到默认值,相当于<br /> this.setStyle({"left": value,"right": value,"top": value,"bottom": value,"z-index": "","position" : "static"});<br /><br />clip() : Ext.Element<br />裁剪溢出部分,用unclip()恢复<br /><br />contains( HTMLElement/String el ) : Boolean<br />当前元素中是否存在el<br /><br />createChild( Object config, [HTMLElement insertBefore], [Boolean returnDom] ) : Ext.Element<br />创建一个新的子节点<br />config :DomHelper元素对象,如果没有特别指明tag,将使用div做默认tag,详情参见DomHelper,如果未定义insertBefore,则追加<br /><br />createProxy( String/Object config, [String/HTMLElement renderTo], [Boolean matchBox] ) : Ext.Element<br />创建一个代理元素<br />config:代理元素的类名或DomHelper config对象<br />renderTo:将要绘制代理元素的html element或id<br />matchBox:是否对齐<br /><br />createShim() : Ext.Element<br />在当前元素之前创建一个classname为ext-shim的iframe,有什么用?<br /><br />down( String selector, [Boolean returnDom] ) : HTMLElement/Ext.Element<br />通过样式选择器selector选择子孙节点<br /><br />enableDisplayMode( [String display] ) : Ext.Element<br />setVisibilityMode的简便方法<br /><br />findParent( String selector, [Number/Mixed maxDepth], [Boolean returnEl] ) : HTMLElement<br />通过简单选择器selector寻找祖先节点 ,直到maxDepth(元素maxDepth默认为10,也可以是指定的DOM 节点),找不到返回null<br /><br />findParentNode( String selector, [Number/Mixed maxDepth], [Boolean returnEl] ) : HTMLElement<br />从父元素开始使用简单选择器selector选择DOM节点<br /><br />first( [String selector], [Boolean returnDom] ) : Ext.Element/HTMLElement<br />得到第一个符合selector条件的子节点,跳过文本节点<br /><br />focus() : Ext.Element<br />得到焦点<br /><br />getAlignToXY( Mixed element, String position, [Array offsets] ) : Array<br />得到当前元素按position规则对齐到element时的XY坐标值 position/offsets参数参见alignTo方法<br /><br />getAnchorXY( [String anchor], [Object size], [Boolean local] ) : Array<br />得到当前元素锚点指定的坐标值 anchor定义参见alignTo方法,默认为c<br /><br />getAttributeNS( String namespace, String name ) : String<br />得到使用了命名空间namespace的属性name之值,<br /><br />getBorderWidth( String side ) : Number<br />得到side指定的边框之和,side可以是t, l, r, b或他们的任意组合,比如getBorderWidth("lr")就是得到左边框和右边框之和<br /><br />getBottom( Boolean local ) : Number<br />得到当前元素的底部纵坐标,元素纵坐标+元素高度<br /><br />getBox( [Boolean contentBox], [Boolean local] ) : Object<br />得到当前元素的box对象:{x,y,width,height}<br /><br />getCenterXY() : Array<br />如果当前元素要居中对齐时的横纵坐标值,等价getAlignToXY(document, 'c-c')<br /><br />getColor( String attr, String defaultValue, [String prefix] ) : void<br />得到当前元素指定attr的颜色值,如果没指定,返回defualtValue,比较郁闷的是明明不是void为什么api中批示是一个void?应该是个字符串<br /><br />getComputedHeight() : Number<br />得到计算过的高度,得到offsetHeight或css中定义的height值之一,如果使用了padding/borders,也会计算进去<br /><br />getComputedWidth() : Number<br />见getComputedHeight<br /><br />getFrameWidth( String sides ) : Number<br />得到sides定义的border宽度和padding定义的宽度之和,side定义见getBorderWidth<br /><br />getHeight( [Boolean contentHeight] ) : Number<br />返回元素的offsetHeight<br /><br />getLeft( Boolean local ) : Number<br />得到横坐标<br /><br />getMargins( [String sides] ) : Object/Number<br />如果没有定义sides,则返回一个含有{left,top,width,height}对象,反之返回side指定的宽度,side定义见getBorderWidth<br /><br />getOffsetsTo( Mixed element ) : Array<br />计算从element到当前元素的偏移量<br /><br />getPadding( String side ) : Number<br />得到由side指定的padding之和<br /><br />getPositioning() : Object<br />得到当前元素的位置信息 返回含以下属性的对象{position,left,right,top,bottom,z-index}<br /><br />getRegion() : Region<br />得到当前元素的区域信息 返回含有以下属性的Ext.lib.Region对象{top, left, bottom, right}<br /><br />getRight( Boolean local ) : Number<br />右边界值<br /><br />getScroll() : Object<br />得到一个批示滚动条位置的对象{left, top}<br /><br />getSize( [Boolean contentSize] ) : Object<br />得到宽度和高度组成的对象信息{width,height}<br /><br />getStyle( String property ) : String<br />得到指定的样式值 getStyles简化版<br /><br />getStyles( String style1, String style2, String etc. ) : Object<br />得到由参数组成的对象<br /> 例:el.getStyles('color', 'font-size', 'width') <br /> 可能返回 {'color': '#FFFFFF', 'font-size': '13px', 'width': '100px'}<br /><br />getTop( Boolean local ) : Number<br />得到顶点纵坐 标<br /><br />getUpdater() : Ext.Updater<br />得到当前元素的Updater对象,参见Ext.Updater类<br /><br />getValue( Boolean asNumber ) : String/Number<br />得到value属性的值<br /><br />getViewSize() : Object<br />得到clientHeight和clientWidth信息给成的对象{width,height}<br /><br />getWidth( [Boolean contentWidth] ) : Number<br />..这样的方法真多<br /><br />getX() : Number<br />getXY() : Array<br />getY() : Array<br />得到页面偏移量,也就是绝对坐标<br /><br />hasClass( String className ) : Boolean<br />样式类className 存在于当前元素的dom 节点中<br /><br />hide( [Boolean/Object animate] ) : Ext.Element<br />隐藏当前元素<br /><br />hover( Function overFn, Function outFn, [Object scope] ) : Ext.Element<br />设置鼠标移入移出事件<br /><br />initDD( String group, Object config, Object overrides ) : Ext.dd.DD<br />initDDProxy( String group, Object config, Object overrides ) : Ext.dd.DDProxy<br />initDDTarget( String group, Object config, Object overrides ) : Ext.dd.DDTarget<br />这个要放到 Ext.dd去专门搞了,用于拖曳<br /><br />insertAfter( Mixed el ) : Ext.Element<br />insertBefore( Mixed el ) : Ext.Element<br />insertFirst( Mixed/Object el ) : Ext.Element<br />在DOM中el元素之前之后...插入当前元素<br /><br />insertHtml( String where, String html, Boolean returnEl )<br />插入html内容 where 可选beforeBegin, afterBegin, beforeEnd, afterEnd<br /><br />insertSibling( Mixed/Object/Array el, [String where], [Boolean returnDom] ) :<br />插入或创建el做为当前元素的兄弟节点,where可选before/after,默认为before<br /><br />is( String selector ) : Boolean<br />验证当前节点是否匹配简单选择器selector<br /><br />isBorderBox()<br />测试不同的样式规则以决定当前元素是否使用一个有边框的盒子<br /><br />isDisplayed() : Boolean<br />只要不是指定display属性none都会返回真<br /><br />isMasked() : Boolean<br />仅有当前元素有mask并且可见时为真,mask译为蒙片?就是有些输入框没得到值之前会有一行模糊的提示的那种东西<br /><br />isScrollable() : Boolean<br />可以滚动?<br /><br />isVisible( [Boolean deep] ) : Boolean<br />可见?<br /><br />last( [String selector], [Boolean returnDom] ) : Ext.Element/HTMLElement<br />见first<br /><br />load( String/Function url, [String/Object params], [Function callback], [Boolean discardUrl] ) : Ext.Element<br />直接应用当前updater的update方法<br /><br />mask( [String msg], [String msgCls] ) : Element<br />为当前对象创建蒙片<br /><br />move( String direction, Number distance, [Boolean/Object animate] ) : Ext.Element<br />相前元素相对于当前位置移动,<br />direction批示方向可能的值是"l","left" - "r","right" - "t","top","up" - "b","bottom","down".<br />distance,指示要移动的距离,以像素为单位<br /><br />moveTo( Number x, Number y, [Boolean/Object animate] ) : Ext.Element<br />称动到指定的位置<br /><br />next( [String selector], [Boolean returnDom] ) : Ext.Element/HTMLElement<br />下一个符合selector的兄弟节点,<br /><br />on( String eventName, Function fn, [Object scope], [Object options] ) : void<br />详见addListener<br /><br />position( [String pos], [Number zIndex], [Number x], [Number y] ) : void<br />初始化当前元素的位置 pos可选择relative/absolute/fixed<br /><br />prev( [String selector], [Boolean returnDom] ) : Ext.Element/HTMLElement<br />前一个符合selector的兄弟节点<br /><br />query( String selector ) : Array<br />通过样式选择器选择子节点<br /><br />radioClass( String/Array className ) : Ext.Element<br />添加样式或样式数组到当前元素，并移除兄弟节点中的指定样式<br /><br />relayEvent( String eventName, Object object ) : void<br />将当前元素的eventName事件同时转发给object对象<br /><br />remove() : void<br />从当前DOM中删除元素,并从缓存中移除<br /><br />removeAllListeners() : Ext.Element<br />移除所有的侦听者 <br /><br />removeClass( String/Array className ) : Ext.Element<br />移除样式类<br /><br />removeListener( String eventName, Function fn ) : Ext.Element<br />移除事件eventName的fn侦听器<br /><br />repaint() : Ext.Element<br />强制浏览器重绘当前元素<br /><br />replace( Mixed el ) : Ext.Element<br />用当前元素替换el<br /><br />replaceClass( String oldClassName, String newClassName ) : Ext.Element<br />替换样式类<br /><br />replaceWith( Mixed/Object el ) : Ext.Element<br />用el替换当前元素<br /><br />scroll( String direction, Number distance, [Boolean/Object animate] ) : Boolean<br />滚动,scroll会保证元素不会越界,direction和distance参数见move<br /><br />scrollIntoView( [Mixed container], [Boolean hscroll] ) : Ext.Element<br />滚动到container内的视图<br /><br />scrollTo( String side, Number value, [Boolean/Object animate] ) : Element<br />基本与scroll方法相同,但不保证元素不越界<br /><br />select( String selector, [Boolean unique] ) :<br />与query不同的是,通过样式选择器selector,select方法会返回一个复合元素对象(CompositeElement)或CompositeElementLite,<br /><br />set( Object o, [Boolean useSet] ) : Ext.Element<br />设置属性，例<br />el.set({width:'200px',height:'200px'});<br /><br />setBottom( String bottom ) : Ext.Element<br />setLeft( String left ) : Ext.Element<br />setRight( String right ) : Ext.Element<br />setTop( String top ) : Ext.Element<br />setLeftTop( String left, String top ) : Ext.Element<br />设置css 对象的属性值<br /><br />setBounds( Number x, Number y, Number width, Number height, [Boolean/Object animate] ) : Ext.Element<br />马上改变当前元素的位置和尺寸<br /><br />setBox( Object box, [Boolean adjust], [Boolean/Object animate] ) : Ext.Element<br />为当前元素设置一个盒子box:{x, y, width, height},adjust指示是否马上调整尺寸<br /><br />setDisplayed( Boolean value ) : Ext.Element<br />设置可见性<br /><br />setHeight( Number height, [Boolean/Object animate] ) : Ext.Element<br />setWidth( Number width, [Boolean/Object animate] ) : Ext.Element<br />setSize( Number width, Number height, [Boolean/Object animate] ) : Ext.Element<br />设置高度和宽度<br /><br />setLocation( Number x, Number y, [Boolean/Object animate] ) : Ext.Element<br />设置当前元素相对于页面的横纵坐标<br /><br />setOpacity( Float opacity, [Boolean/Object animate] ) : Ext.Element<br />设置透明度，opacity为1完全不透明,0完全透明<br /><br />setPositioning( Object posCfg ) : Ext.Element<br />为当前元素指定位置信息,参数posCfg参见getPositioning说明<br /><br />setRegion( Ext.lib.Region region, [Boolean/Object animate] ) : Ext.Element<br />为当前元素指定区域信息 region定义 见getRegion<br /><br />setStyle( String/Object property, [String value] ) : Ext.Element<br />设置样式<br /><br />setVisibilityMode( visMode Element.VISIBILITY ) : Ext.Element<br />指示是使用Element.VISIBILITY还是Element.DISPLAY属性来定义可见性<br /><br />setVisible( Boolean visible, [Boolean/Object animate] ) : Ext.Element<br />设置可见性<br /><br /><br />setX( Number The, [Boolean/Object animate] ) : Ext.Element<br />setXY( Array pos, [Boolean/Object animate] ) : Ext.Element<br />setY( Number The, [Boolean/Object animate] ) : Ext.Element<br />设置当前元素相对于page的位置<br /><br />show( [Boolean/Object animate] ) : Ext.Element<br />显示当前元素<br /><br />swallowEvent( String eventName, [Boolean preventDefault] ) : Ext.Element<br />阻止eventName事件冒泡，并视preventDefault阻断默认行为<br /><br />toggle( [Boolean/Object animate] ) : Ext.Element<br />切换元素的visibility 或display属性,依赖于setVisibilityMode设定的<br /><br />toggleClass( String className ) : Ext.Element<br />如果样式名存在于当前元素对应的dom 节点，移除，反之应用<br /><br />translatePoints( Number/Array x, Number y ) : Object<br />返回一个{left,top}结构<br /><br />un( String eventName, Function fn ) : Ext.Element<br />解除事件侦听，参见   removeListener<br /><br />unclip() : Ext.Element<br />见clip;<br /><br />unmask() : void<br />见mask;<br /><br />unselectable(): Ext.Element<br />禁止文本选择<br /><br />up( String selector, [Number/Mixed maxDepth] ) : Ext.Element<br />通过样式选择器selector选择祖先节点<br /><br />update( String html, [Boolean loadScripts], Function callback ) : Ext.Element<br />利用html更新当前节点内容，loadScripts指示html中如果有script，是否需要运行,这是一个innerHTML的一个老老老问题了<br /><br />wrap( [Object config], [Boolean returnDom] ) : HTMLElement/Element<br />用另一个元素config包含自己
          <br/>
          <span style="color:red;">
            <a href="http://kuru.javaeye.com/blog/192909#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 13:25:22 +0800</pubDate>
        <link>http://kuru.javaeye.com/blog/192909</link>
        <guid>http://kuru.javaeye.com/blog/192909</guid>
      </item>
      <item>
        <title>[转载]EXT核心API详解(二)</title>
        <author>kuru</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kuru.javaeye.com">kuru</a>&nbsp;
          链接：<a href="http://kuru.javaeye.com/blog/192908" style="color:red;">http://kuru.javaeye.com/blog/192908</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [转载]EXT核心API详解(二)-Array/Date/Function/Number/String <br />Array类<br />indexOf( Object o ) : Number<br />object是否在数组中,找不到返回-1;找到返回位置<br />remove( Object o ) : Array<br />从数组中删除指定的对象object,如果找不到object则数组无变化<br /><br />Number类<br />constrain( Number min, Number max ) : Number<br />检查数值是否介于min与max之间, 如果大于max 返回max,如果小于min返回min, 否则返回当前值<br /><br />String类<br />escape( String string ) : String<br />将string中的'和\替换为\' \\<br /><br />format( String string, String value1, String value2 ) : String<br />格式化字符串,例:<br />var cls = 'my-class', text = 'Some text';<br />var s = String.format('&lt;div class="{0}">{1}&lt;/div>', cls, text);// 结果 &lt;div class="my-class">Some text&lt;/div><br /><br />leftPad( String string, Number size, [String char] ) : String<br />以char将string补齐为size长度,char默认定义空格<br /><br />toggle( String value, String other ) : String<br />交换值,如果当前值等于value,则被赋值other,反之等于value,例:<br />sort = sort.toggle('ASC', 'DESC');<br /><br />trim() : String<br />去除开头或结尾多余的空格<br /><br /><br />Date类<br />Date.parseDate( String input, String format ) : Date<br />将字符串string依指定的格式format转换为时间,其中格式定义详见format方法<br />例:dt = Date.parseDate("2006-01-15 3:20:01 PM", "Y-m-d h:i:s A" ); <br /><br /><br />add( String interval, Number value ) : Date<br />增加时间段,String interval在Data类中已定义<br />Date.MILLI = "ms";<br />Date.SECOND = "s";<br />Date.MINUTE = "mi";<br />Date.HOUR = "h";<br />Date.DAY = "d";<br />Date.MONTH = "mo";<br />Date.YEAR = "y";<br />例var dt2 = new Date('10/1/2006').add(Date.DAY, -5); <br /><br />between( Date start, Date end ) : Boolean<br />是否在两个指定的时间之间<br /><br />clearTime( Boolean clone ) : Date<br />清除时间信息,如果clone为真,则克隆自已并返回新Date,本身的值并不改变,反之则修改自身的值<br /><br />clone() : Date<br />克隆<br /><br />format( String format ) : String<br />格式化时间<br />d     两位数的日期                01 至 31<br />D     三字母的星期名                Mon 至 Sun<br />j     一位数的日期                1 至 31<br />l     完整的星期名                Sunday 至 Saturday<br />S     日期的英文顺序刻词尾,两个字符        st, nd, rd or th.<br />w     一周中的第几天                0 (星期