<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>langkins</title>
    <description></description>
    <link>http://langkins.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>Java 理论与实践: 使用通配符简化泛型使用</title>
        <author>langkins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://langkins.javaeye.com">langkins</a>&nbsp;
          链接：<a href="http://langkins.javaeye.com/blog/203786" style="color:red;">http://langkins.javaeye.com/blog/203786</a>&nbsp;
          发表时间: 2008年06月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Brian Goetz (brian.goetz@sun.com), 高级工程师, Sun Microsystems<br /><br />2008 年 5 月 26 日<br /><br />    通配符是 Java™ 语言中最复杂的泛型之一，特别是围绕捕获通配符 的处理和令人困惑的错误消息。在这一期的 Java 理论与实践 中，资深 Java 开发人员 Brian Goetz 解释了一些由 javac 生成的怪异错误消息并提供了一些简化泛型使用的技巧和解决方法。<br /><br />自从泛型被添加到 JDK 5 语言以来，它一直都是一个颇具争议的话题。一部分人认为泛型简化了编程，扩展了类型系统从而使编译器能够检验类型安全；另外一些人认为泛型添加了很多不必要的复杂性。对于泛型我们都经历过一些痛苦的回忆，但毫无疑问通配符是最棘手的部分。<br /><br />通配符基本介绍<br /><br />泛型是一种表示类或方法行为对于未知类型的类型约束的方法，比如 “不管这个方法的参数 x 和 y 是哪种类型，它们必须是相同的类型”，“必须为这些方法提供同一类型的参数” 或者 “foo() 的返回值和 bar() 的参数是同一类型的”。<br /><br />通配符 — 使用一个奇怪的问号表示类型参数 — 是一种表示未知类型的类型约束的方法。通配符并不包含在最初的泛型设计中（起源于 Generic Java（GJ）项目），从形成 JSR 14 到发布其最终版本之间的五年多时间内完成设计过程并被添加到了泛型中。<br /><br />通配符在类型系统中具有重要的意义，它们为一个泛型类所指定的类型集合提供了一个有用的类型范围。对泛型类 ArrayList 而言，对于任意（引用）类型 T，ArrayList&lt;?> 类型是 ArrayList&lt;T> 的超类型（类似原始类型 ArrayList 和根类型 Object，但是这些超类型在执行类型推断方面不是很有用）。<br /><br />通配符类型 List&lt;?> 与原始类型 List 和具体类型 List&lt;Object> 都不相同。如果说变量 x 具有 List&lt;?> 类型，这表示存在一些 T 类型，其中 x 是 List&lt;T>类型，x 具有相同的结构，尽管我们不知道其元素的具体类型。这并不表示它可以具有任意内容，而是指我们并不了解内容的类型限制是什么 — 但我们知道存在 某种限制。另一方面，原始类型 List 是异构的，我们不能对其元素有任何类型限制，具体类型 List&lt;Object> 表示我们明确地知道它能包含任何对象（当然，泛型的类型系统没有 “列表内容” 的概念，但可以从 List 之类的集合类型轻松地理解泛型）。<br /><br />通配符在类型系统中的作用部分来自其不会发生协变（covariant）这一特性。数组是协变的，因为 Integer 是 Number 的子类型，数组类型 Integer[] 是 Number[] 的子类型，因此在任何需要 Number[] 值的地方都可以提供一个 Integer[] 值。另一方面，泛型不是协变的， List&lt;Integer> 不是 List&lt;Number> 的子类型，试图在要求 List&lt;Number> 的位置提供 List&lt;Integer> 是一个类型错误。这不算很严重的问题 — 也不是所有人都认为的错误 — 但泛型和数组的不同行为的确引起了许多混乱。<br /><br />我已使用了一个通配符 — 接下来呢？<br /><br />清单 1 展示了一个简单的容器（container）类型 Box，它支持 put 和 get 操作。 Box 由类型参数 T 参数化，该参数表示 Box 内容的类型， Box&lt;String> 只能包含 String 类型的元素。<br /><br />清单 1. 简单的泛型 Box 类型<br /><br />                <br />public interface Box&lt;T> {<br />    public T get();<br />    public void put(T element);<br />}<br /><br /><br />通配符的一个好处是允许编写可以操作泛型类型变量的代码，并且不需要了解其具体类型。例如，假设有一个 Box&lt;?> 类型的变量，比如清单 2 unbox() 方法中的 box 参数。unbox() 如何处理已传递的 box？<br /><br />清单 2. 带有通配符参数的 Unbox 方法<br /><br />                <br />public void unbox(Box&lt;?> box) {<br />    System.out.println(box.get());<br />}<br /><br /><br />事实证明 Unbox 方法能做许多工作：它能调用 get() 方法，并且能调用任何从 Object 继承而来的方法（比如 hashCode()）。它惟一不能做的事是调用 put() 方法，这是因为在不知道该 Box 实例的类型参数 T 的情况下它不能检验这个操作的安全性。由于 box 是一个 Box&lt;?> 而不是一个原始的 Box，编译器知道存在一些 T 充当 box 的类型参数，但由于不知道 T 具体是什么，您不能调用 put() 因为不能检验这么做不会违反 Box 的类型安全限制（实际上，您可以在一个特殊的情况下调用 put()：当您传递 null 字母时。我们可能不知道 T 类型代表什么，但我们知道 null 字母对任何引用类型而言是一个空值）。<br /><br />关于 box.get() 的返回类型，unbox() 了解哪些内容呢？它知道 box.get() 是某些未知 T 的 T，因此它可以推断出 get() 的返回类型是 T 的擦除（erasure），对于一个无上限的通配符就是 Object。因此清单 2 中的表达式 box.get() 具有 Object 类型。<br /><br />通配符捕获<br /><br />清单 3 展示了一些似乎应该 可以工作的代码，但实际上不能。它包含一个泛型 Box、提取它的值并试图将值放回同一个 Box。<br /><br />清单 3. 一旦将值从 box 中取出，则不能将其放回<br /><br />                <br />public void rebox(Box&lt;?> box) {<br />    box.put(box.get());<br />}<br /><br />Rebox.java:8: put(capture#337 of ?) in Box&lt;capture#337 of ?> cannot be applied<br />   to (java.lang.Object)<br />    box.put(box.get());<br />       ^<br />1 error<br /><br /><br />这个代码看起来应该可以工作，因为取出值的类型符合放回值的类型，然而，编译器生成（令人困惑的）关于 “capture#337 of ?” 与 Object 不兼容的错误消息。<br /><br />“capture#337 of ?” 表示什么？当编译器遇到一个在其类型中带有通配符的变量，比如 rebox() 的 box 参数，它认识到必然有一些 T ，对这些 T 而言 box 是 Box&lt;T>。它不知道 T 代表什么类型，但它可以为该类型创建一个占位符来指代 T 的类型。占位符被称为这个特殊通配符的捕获（capture）。这种情况下，编译器将名称 “capture#337 of ?” 以 box 类型分配给通配符。每个变量声明中每出现一个通配符都将获得一个不同的捕获，因此在泛型声明 foo(Pair&lt;?,?> x, Pair&lt;?,?> y) 中，编译器将给每四个通配符的捕获分配一个不同的名称，因为任意未知的类型参数之间没有关系。<br /><br />错误消息告诉我们不能调用 put()，因为它不能检验 put() 的实参类型与其形参类型是否兼容 — 因为形参的类型是未知的。在这种情况下，由于 ? 实际表示 “？extends Object” ，编译器已经推断出 box.get() 的类型是 Object，而不是 “capture#337 of ?”。它不能静态地检验对由占位符 “capture#337 of ?” 所识别的类型而言 Object 是否是一个可接受的值。<br /><br />捕获助手<br /><br />虽然编译器似乎丢弃了一些有用的信息，我们可以使用一个技巧来使编译器重构这些信息，即对未知的通配符类型命名。清单 4 展示了 rebox() 的实现和一个实现这种技巧的泛型助手方法（helper）：<br /><br />清单 4. “捕获助手” 方法<br /><br />                <br />public void rebox(Box&lt;?> box) {<br />    reboxHelper(box);<br />}<br /><br />private&lt;V> void reboxHelper(Box&lt;V> box) {<br />    box.put(box.get());<br />}<br /><br /><br />助手方法 reboxHelper() 是一个泛型方法，泛型方法引入了额外的类型参数（位于返回类型之前的尖括号中），这些参数用于表示参数和/或方法的返回值之间的类型约束。然而就 reboxHelper() 来说，泛型方法并不使用类型参数指定类型约束，它允许编译器（通过类型接口）对 box 类型的类型参数命名。<br /><br />捕获助手技巧允许我们在处理通配符时绕开编译器的限制。当 rebox() 调用 reboxHelper() 时，它知道这么做是安全的，因为它自身的 box 参数对一些未知的 T 而言一定是 Box&lt;T>。因为类型参数 V 被引入到方法签名中并且没有绑定到其他任何类型参数，它也可以表示任何未知类型，因此，某些未知 T 的 Box&lt;T> 也可能是某些未知 V 的 Box&lt;V>（这和 lambda 积分中的 α 减法原则相似，允许重命名边界变量）。现在 reboxHelper() 中的表达式 box.get() 不再具有 Object 类型，它具有 V 类型 — 并允许将 V 传递给 Box&lt;V>.put()。<br /><br />我们本来可以将 rebox() 声明为一个泛型方法，类似 reboxHelper()，但这被认为是一种糟糕的 API 设计样式。此处的主要设计原则是 “如果以后绝不会按名称引用，则不要进行命名”。就泛型方法来说，如果一个类型参数在方法签名中只出现一次，它很有可能是一个通配符而不是一个命名的类型参数。一般来说，带有通配符的 API 比带有泛型方法的 API 更简单，在更复杂的方法声明中类型名称的增多会降低声明的可读性。因为在需要时始终可以通过专有的捕获助手恢复名称，这个方法让您能够保持 API 整洁，同时不会删除有用的信息。<br /><br />类型推断<br /><br />捕获助手技巧涉及多个因素：类型推断和捕获转换。Java 编译器在很多情况下都不能执行类型推断，但是可以为泛型方法推断类型参数（其他语言更加依赖类型推断，将来我们可以看到 Java 语言中会添加更多的类型推断特性）。如果愿意，您可以指定类型参数的值，但只有当您能够命名该类型时才可以这样做 — 并且不能够表示捕获类型。因此要使用这种技巧，要求编译器能够为您推断类型。捕获转换允许编译器为已捕获的通配符产生一个占位符类型名，以便对它进行类型推断。<br /><br />当解析一个泛型方法的调用时，编译器将设法推断类型参数它能达到的最具体类型。 例如，对于下面这个泛型方法：<br /><br />public static&lt;T> T identity(T arg) { return arg }; <br /><br /><br />和它的调用：<br /><br />Integer i = 3;<br />System.out.println(identity(i));<br /><br /><br />编译器能够推断 T 是 Integer、Number、 Serializable 或 Object，但它选择 Integer 作为满足约束的最具体类型。<br /><br />当构造泛型实例时，可以使用类型推断减少冗余。例如，使用 Box 类创建 Box&lt;String> 要求您指定两次类型参数 String：<br /><br />Box&lt;String> box = new BoxImpl&lt;String>();<br /><br /><br />即使可以使用 IDE 执行一些工作，也不要违背 DRY（Don't Repeat Yourself）原则。然而，如果实现类 BoxImpl 提供一个类似清单 5 的泛型工厂方法（这始终是个好主意），则可以减少客户机代码的冗余：<br /><br />清单 5. 一个泛型工厂方法，可以避免不必要地指定类型参数<br /><br />                <br />public class BoxImpl&lt;T> implements Box&lt;T> {<br /><br />    public static&lt;V> Box&lt;V> make() {<br />        return new BoxImpl&lt;V>();<br />    }<br /><br />    ...<br />}<br /><br /><br />如果使用 BoxImpl.make() 工厂实例化一个 Box，您只需要指定一次类型参数：<br /><br />Box&lt;String> myBox = BoxImpl.make();<br /><br /><br />泛型 make() 方法为一些类型 V 返回一个 Box&lt;V>，返回值被用于需要 Box&lt;String> 的上下文中。编译器确定 String 是 V 能接受的满足类型约束的最具体类型，因此此处将 V 推断为 String。您还可以手动地指定 V 的值：<br /><br />Box&lt;String> myBox = BoxImpl.&lt;String>make();<br /><br /><br />除了减少一些键盘操作以外，此处演示的工厂方法技巧还提供了优于构造函数的其他优势：您能够为它们提高更具描述性的名称，它们能够返回命名返回类型的子类型，它们不需要为每次调用创建新的实例，从而能够共享不可变的实例（参见 参考资料 中的 Effective Java, Item #1，了解有关静态工厂的更多优点）。<br /><br />结束语<br /><br />通配符无疑非常复杂：由 Java 编译器产生的一些令人困惑的错误消息都与通配符有关，Java 语言规范中最复杂的部分也与通配符有关。然而如果使用适当，通配符可以提供强大的功能。此处列举的两个技巧 — 捕获助手技巧和泛型工厂技巧 — 都利用了泛型方法和类型推断，如果使用恰当，它们能显著降低复杂性。<br /><br /><br />参考资料<br />学习<br /><br />    * 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。<br /><br />    * Java 理论与实践 （Brian Goetz，developerWorks）：参阅该系列的所有文章。<br /><br />    * “了解泛型”（Brian Goetz，developerWorks，2005 年 1 月）：了解如何在学习使用泛型时识别和避免一些陷阱。<br /><br />    * JDK 5.0 中的泛型介绍（Brian Goetz，developerWorks，2004 年 12 月）：developerWorks 投稿人和 Java 编程专家 Brian Goetz 解释了将泛型添加到 Java 语言的动机、语法细节和泛型类型的语义，并介绍了如何在自己的类中使用泛型。<br /><br />    * JSR 14：将泛型添加到 Java 编程语言中。早期的规范来源于 GJ。通配符 是后来添加的。<br /><br />    * Java Generics and Collections ：提供了一个全面的泛型处理。<br /><br />    * Effective Java : Item 1 进一步探讨了静态工厂方法的优点。<br /><br />    * Generics FAQ: Angelika Langer 创建了关于泛型的完整 FAQ。<br /><br />    * Java Concurrency in Practice ：使用 Java 代码开发并发程序的 how-to 手册，包括构造和组成线程安全的类和程序、避免风险、管理性能和测试并发应用程序。<br /><br />    * 技术书店：浏览有关各种技术主题的书籍。<br /><br />    * Java 技术专区：数百篇关于 Java 编程各个方面的文章。<br /><br /><strong><br />关于作者</strong>[i][/i]<br />		<br /><br />Brian Goetz 作为一名专业软件开发人员已经 20 年了。他是 Sun Microsystems 的高级工程师，并且效力于多个 JCP 专家组。Brian 的著作 Java Concurrency In Practice 在 2006 年 5 月由 Addison-Wesley 出版。请参阅 Brian 在流行的业界出版物上 已发表和即将发表的文章。
          <br/>
          <span style="color:red;">
            <a href="http://langkins.javaeye.com/blog/203786#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>Sun, 15 Jun 2008 20:35:01 +0800</pubDate>
        <link>http://langkins.javaeye.com/blog/203786</link>
        <guid>http://langkins.javaeye.com/blog/203786</guid>
      </item>
      <item>
        <title>IE6下边div隐藏和显示时页面重画的问题</title>
        <author>langkins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://langkins.javaeye.com">langkins</a>&nbsp;
          链接：<a href="http://langkins.javaeye.com/blog/198653" style="color:red;">http://langkins.javaeye.com/blog/198653</a>&nbsp;
          发表时间: 2008年05月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我遇到了div显示和隐藏的问题，在ff,ie7,myie,safari下都能正常工作，唯独ie6不正常。<br />
问题描述：<br />
    用div定义了一个导航树，需要显示或者隐藏这个树，具体做法就是设置div的css。<br />
jsp(html)：abc.jsp</p>
<p style="background-color: #ffcc99;">......</p>
<p style="background-color: #ffcc99;">&lt;span widget=&quot;StateView&quot;&gt;<br />
     &lt;<span style="color: #ff0000;">div id=&quot;sidebar-pane&quot;</span>
&gt;<br />
                    &lt;div class=&quot;header-text&quot;&gt;Project files&lt;/div&gt;<br />
                    &lt;span id=&quot;project-tree-view&quot; widget=&quot;ProjectTreeView&quot;&gt;&lt;/span&gt;<br />
                &lt;/div&gt;<br />
                &lt;<span style="color: #ff0000;">div id=&quot;sidebar-hider&quot;  onclick-class=&quot;sb-hidden&quot;</span>
&gt;&lt;img src=&quot;../images/white-left-triangle.gif&quot; style=&quot;position: absolute; left: 2px; bottom: 50%;&quot;&gt;<br />
&lt;/div&gt;<br />
                &lt;<span style="color: #ff0000;">div id=&quot;sidebar-shower&quot; onclick-class=&quot;&quot;&gt;</span>
&lt;img src=&quot;../images/white-right-triangle.gif&quot; style=&quot;position: absolute; left: 2px; bottom: 50%;&quot;&gt;<br />
&lt;/div&gt;<br />
                &lt;<span style="color: #ff0000;">span id=&quot;main-pane&quot; widget=&quot;StateView&quot;</span>
&gt;&lt;/span&gt;</p>
<p style="background-color: #ffcc99;">......</p>
<p><span style="background-color: #ffcc99;">&lt;/span&gt;</span>
</p>
<p>&nbsp;</p>
<p>js:StateView.js</p>
<p style="background-color: #ffcc99;">_package_('StateView', [['class','../js/class.js'],['Widget','../js/Widget.js']], function () {<br />
&nbsp;&nbsp;&nbsp; StateView = _class_(Widget, {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _new_: function (element) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Widget.call(this, element);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setupHandlers.call(this, element);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },</p>
<p style="background-color: #ffcc99;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ......</p>
<p style="background-color: #ffcc99;">&nbsp;&nbsp; setStateClass: function (className) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (className.charAt(0) == '~') {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; className = className.substr(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; className = ' ' + className;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var childNodes = this.element.childNodes; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // &nbsp; var ie6 = getIEVersion() == 6 ? true:false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; childNodes.length; i++) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000;">&nbsp;&nbsp; if(childNodes[i].tagName){//could be a blank, IE6 can't handle it&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; childNodes[i].className = childNodes[i].defaultClassName + className;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; });<br />
<br />
&nbsp;&nbsp;&nbsp; function setupHandlers(element) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; element.childNodes.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var childNode = element.childNodes[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!childNode.tagName)&nbsp; continue;//could be a blank, IE6 can't handle it<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; childNode.defaultClassName = childNode.className;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (childNode.nodeType == 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var att = childNode.attributes[&quot;onclick-class&quot;];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (att) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var className = att.nodeValue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // &lt;div onclick-class=&quot;~something&quot;&gt; means that &quot;something&quot; should be directly<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // appended to class names when the mode is entered, rather than adding an<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // additional class name to the list of classes held by elements.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; childNode.onclick = lazyApply(bind(this, this.setStateClass), [className]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (childNode.getAttribute('widget')==null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setupHandlers.call(this, childNode);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch(e) { }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p style="background-color: #ffcc99;">......</p>
<p style="background-color: #ffcc99;">css:</p>
<p style="background-color: #ffcc99;">......</p>
<p style="background-color: #ffcc99;"><br />
/* sidebar-hider */<br />
#sidebar-hider, #sidebar-shower {<br />
&nbsp;&nbsp;&nbsp; position: absolute;<br />
&nbsp;&nbsp;&nbsp; top: 0px;<br />
&nbsp;&nbsp;&nbsp; bottom: 0;<br />
&nbsp;&nbsp;&nbsp; width: 10px;<br />
&nbsp;&nbsp;&nbsp; background: #bccade;<br />
&nbsp;&nbsp;&nbsp; cursor: pointer;<br />
&nbsp;&nbsp;&nbsp; height:100%;<br />
}<br />
#sidebar-hider:hover, #sidebar-shower:hover {<br />
&nbsp;&nbsp;&nbsp; background: #ccdaee;<br />
}<br />
#sidebar-hider {<br />
&nbsp;&nbsp;&nbsp; left: 200px;<br />
}<br />
#sidebar-hider.sb-hidden {<br />
&nbsp;&nbsp;&nbsp; display: none;<br />
}<br />
#sidebar-shower {<br />
&nbsp;&nbsp;&nbsp; display: none;<br />
&nbsp;&nbsp;&nbsp; left: 0;<br />
}<br />
#sidebar-shower.sb-hidden {<br />
&nbsp;&nbsp;&nbsp; display: block;<br />
}<br />
#sidebar-pane.sb-hidden {<br />
&nbsp;&nbsp;&nbsp; display: none;<br />
}<br />
#main-pane.sb-hidden {<br />
&nbsp;&nbsp;&nbsp; left: 10px;<br />
}</p>
<p>只贴了核心的js代码，将widget标签对应有一个同名的js文件，定义了一个这样的class，如StateView，对应的StateView.js，在abc.jsp中会自动的去new StateView 对象，主要是通过setupHandlers(element)方法去改变对应html tag的css来达到效果，但是红色标记的那段代码，在ie6下某些效果就不是理想的情况。<br />
比如abd.jsp中红色标记的部分即为显示和隐藏导航树的tags，但是ie6下上述js无法有效的change some of the styles，只有第一个div能凑效（<span style="color: #ff0000;">id=sidebar-pane</span>
）</p>
<p>
请大家发表意见。</p>
<p>thank u.</p>
<p>(不知道这些信息是否够,如还需补充，请跟帖，谢谢)</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://langkins.javaeye.com/blog/198653#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>Fri, 30 May 2008 13:39:53 +0800</pubDate>
        <link>http://langkins.javaeye.com/blog/198653</link>
        <guid>http://langkins.javaeye.com/blog/198653</guid>
      </item>
      <item>
        <title>清明节快到了，正好刚离职，回家看看（过年雪灾，没回成）</title>
        <author>langkins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://langkins.javaeye.com">langkins</a>&nbsp;
          链接：<a href="http://langkins.javaeye.com/blog/178754" style="color:red;">http://langkins.javaeye.com/blog/178754</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原来的公司，我之前的文章也抱怨过，没想到，现在的境况比之前还要更无法接受了。<br />索性，离职了。<br />   提交辞呈之前的晚上给主管打电话聊了这个决定，主管人也挺好，她也知道我做的工作在项目组中比较重要，也没有直接挽留我。<br />第二天上午，其实没有直接给部门领导发辞职信，考虑了一上午，中午，还是很绝然的拟好信了，检查了一遍，果断的发出去了，给项目组的领导和事业部的老大都发了，呵呵，这个架势，看来后悔都不行了。<br />   下午，事业部运营总监给我打电话，希望跟我聊聊，呵呵，昨天他还打电话让我在事业部启动大会上发言，结果今天就给他发了封辞职信，可能让他觉得有点突然吧。<br />第二天一大早他就找我了，希望我能继续留下来，也许想继续问问我是不是对薪资待遇上有什么要求，因为实在不想继续下去了，所以直接给他讲了，自己遇到一个感觉很不错的机会，公司的成长性比较看好，很想过去......,他也没办法，没聊到十分钟，就完了。后来项目经理和主管也找我聊，多是让我提些意见之类的。<br />   都说三四月份是跳槽的高峰期，这个时候找工作机会比较多，我也尝试了一下，没有发觉特别的不一样，投出去八九份简历，也有四五家给我联系的，感觉效率才百分之五十左右，有点失败。其中两家印度公司，都是先电话面试，一个说感觉不错，让我按他们公司的模板填了份e文简历后，就没下文了，还有家说要偏重oracle方面，再加上聊english的时候，有些听不懂，不报啥希望了，也不再感兴趣印度人的公司了。就是搞不懂有些公司，明明觉得符合他们的要求，为啥不和俺联系呢，让我有些怀疑简历了，不过我用的是Robin老大提供的模板耶，做的也蛮精致啊，中英文都整齐了，没道理被鄙视呀。还真是，有些事情真是想不通，不想也罢。<br />   正好，春光明媚，想家乡的花儿开的很鲜艳了，家乡的草草木木都是很葱郁了，还想家门口那条小溪，小时候顽皮的我们就在她的怀抱中成长，游泳，钓鱼，抓螃蟹，去年国庆，一个人在那钓鱼，收获不少乐趣；再加上过年也没回成家，索性回家看看，也好！
          <br/>
          <span style="color:red;">
            <a href="http://langkins.javaeye.com/blog/178754#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, 02 Apr 2008 11:48:15 +0800</pubDate>
        <link>http://langkins.javaeye.com/blog/178754</link>
        <guid>http://langkins.javaeye.com/blog/178754</guid>
      </item>
      <item>
        <title>HP面试经历</title>
        <author>langkins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://langkins.javaeye.com">langkins</a>&nbsp;
          链接：<a href="http://langkins.javaeye.com/blog/170281" style="color:red;">http://langkins.javaeye.com/blog/170281</a>&nbsp;
          发表时间: 2008年03月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          上周收到HP的面试电话<br />但是当时在地铁没有记着面试地点<br /><br />昨天才打电话确认了面试时间地点<br />晚上稍微准备了一下<br /><br />要求上强调j2ee patterns uml  oracle<br />我还到网上到处搜了些资料<br />最后都没时间准备english introduction了<br /><br />下午从公司出来直奔张江<br />因为不熟悉路，所以出发的比较早<br />提前将近四十分钟到的<br /><br />在hp大楼外休息休息<br />天气也不错，还有点热<br /><br />也没心思去想会面些什么东西<br />恰巧看到有个hp的员工出来散心<br />上去交谈得知他是中科大的master<br />刚到公司不久，碰巧俺也master<br /><br />聊得还可以，打听了一下面试的情况、<br />hp找人的计划等等<br />得知hp一直在招人，欧美项目对english要求较高<br />其他则差不多就行了<br />技术上要求也不是很高，过得去就好了。<br /><br />这样就打消了之前的顾虑，觉得也没什么了<br />照常去发挥就好<br /><br />到时间面试了，先是一年轻handsome man<br />他主要问技术，java 基础偏多，内容网上基本上都有<br />还问了项目的情况，换工作的原因之类的<br />最后english introduction，<br />因为之前也introduce 自己好几次过，所以也比较顺利<br />最后人家还问我是不是有过专门的准备<br /><br />接下来另一位面试我<br />重点还是按着简历走<br />首先要求我自己介绍<br />他问我每个项目的“亮点”<br />我就编呗，每个项目亮那么两三个点，ok<br /><br />感觉他可能有段时间不搞技术了<br />因为没怎么为难我<br /><br />最后就是english interview，纯英语交流，不过焦点还是在项目经验上<br />他讲的语速也不快，都能听懂<br />......<br />最后我还问了一下他们招人的计划<br />得知这次是一个欧美项目，英语要求较高，技术一般就行<br />然后是告诉我等消息，说如果有意向的话一到两周hr会有回复<br />否则就挂挂了。<br /><br />刚面完嘛，自己感觉也还好，结果就不那么重要了<br />等吧<br />继续努力吧
          <br/>
          <span style="color:red;">
            <a href="http://langkins.javaeye.com/blog/170281#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>Tue, 11 Mar 2008 19:40:22 +0800</pubDate>
        <link>http://langkins.javaeye.com/blog/170281</link>
        <guid>http://langkins.javaeye.com/blog/170281</guid>
      </item>
      <item>
        <title>关于工作，你倾向与优秀的人一起，还是喜欢俯视的感觉？</title>
        <author>langkins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://langkins.javaeye.com">langkins</a>&nbsp;
          链接：<a href="http://langkins.javaeye.com/blog/169454" style="color:red;">http://langkins.javaeye.com/blog/169454</a>&nbsp;
          发表时间: 2008年03月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对于刚刚步入职场的人来说<br />甚至三五年 experience的同行来说<br />你更喜欢与优秀的人一起共事<br />还是<br />喜欢一种俯视的感觉？<br /><br />我的观点：<br />     自打读书起，我很不幸，基本上没遇上很好的老师，唯一一位讲课很不错，但是也仅仅喜欢他讲课，把那科课程学的很不错而已，更深的东西，没有交流的机会；<br />     工作实习的时候，也没有遇到"robbin liked people”，倒是有几位同学可以经常相互学习讨论，那段时间进步不错；<br />     现在工作了，还是没有碰到"称得上优秀"的人；<br /><br />其实内心很期待与优秀的人一起进步，因为现在太需要进步了。
          <br/>
          <span style="color:red;">
            <a href="http://langkins.javaeye.com/blog/169454#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>Sun, 09 Mar 2008 10:11:17 +0800</pubDate>
        <link>http://langkins.javaeye.com/blog/169454</link>
        <guid>http://langkins.javaeye.com/blog/169454</guid>
      </item>
      <item>
        <title>这样的情况，我这样选择</title>
        <author>langkins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://langkins.javaeye.com">langkins</a>&nbsp;
          链接：<a href="http://langkins.javaeye.com/blog/169452" style="color:red;">http://langkins.javaeye.com/blog/169452</a>&nbsp;
          发表时间: 2008年03月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这里的朋友都是很热心的，所以我也把近况说说：<br /><br />从校园出来就到了A公司，刚开始是跟着别人一起做项目，后来首先因为技术底子还可以，上手比较快；其次沟通能力还算比较强，至少在我所在的项目组应该是top three；再次是项目组新人太多，真正很有经验的人缺乏；所以没几个月我就开始独立负责子项目的开发和交付，甚至客户培训和与外部沟通（与另外一个组的同事沟通实现一个client tool），功能点和表结构都由我设计和提供，他是具体实现。<br />再慢慢的，有个同事要离职，他也是个小组长，主管甚至把他的活和他的小组也交给我带了；<br />最近有个新的子系统的开发，也交给我了，需求设计，界面开发，工程架构的搭建（用框架，也不考虑其他细节，基本很简单）<br />。。。。<br />在A单位以后的事情不好说了，也不去考虑；<br />目前感觉在这里工作倒是很自在了，与同事领导的人际关系，以至客户关系都很不错；<br />上叙这些是利好的方面；<br /><br /><br />下边是我的困惑了：<br />1、项目本身，属于电子政务方面的，打交道的客户是“大老爷们”；<br />闲扯两句，以前也接触过其他地方的政府机关，觉得上海这边还是要好的多，没有人要回扣，呵呵；而且，上海的“老爷”还是蛮务实，很认真的考虑他们的业务，虽然很不专业，只从自身的角度（没有专门的资讯顾问）；回到正题，行业的特点，决定了需求的不确定，导致反复严重，拖延严重，无法忍受；<br />2、项目管理，我们的项目管理，我认为主管和技术总体架构方面严重不合格；<br />这样导致了，开发和交付完全被动，完全由用户在驱动，使我们的工作很大程度上是在应付客户；今天这个科室要看，明天那个科室要用，后天那个领导要检查，感觉就在这样糊弄；开发很累，心累；软件实现上，测试（就找几个实习生点一点完事），验证等很多环节基本上缺失，导致软件质量问题严重；<br />3、公司情况，行业定位就是做这个（e-government）,所以效率和前景不容乐观，公司大环境（技术和管理）也不是我喜欢的那种；<br />4、技术上<br />项目开发技术基本上是：SSH + Ext JS + Oracle  +  OAS，<br />做到三四个月的时候，基本上觉得没什么新鲜玩意，都是这些东西翻过来覆过去的，虽然本身上述技术我还不是那么熟练，但这种环境，我觉得没法进步了，尤其年后负责的子系统多的时候，事情就很杂；<br /><br />去年进公司前不是太了解，还有一个原因公司承诺解决上海户口，不过要满一年。<br /><br />我的现在选择是：走！（正在行动，量变阶段，尚未质变）；<br />                户口，是鸡肋，虽然很难搞，也很想要，但是，真不想以个人提升的迟滞为代价！<br /><br />如果是你，你会如何选择？
          <br/>
          <span style="color:red;">
            <a href="http://langkins.javaeye.com/blog/169452#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>Sun, 09 Mar 2008 10:00:27 +0800</pubDate>
        <link>http://langkins.javaeye.com/blog/169452</link>
        <guid>http://langkins.javaeye.com/blog/169452</guid>
      </item>
      <item>
        <title>使用ROR处理电子支付和视频等方面怎么样？</title>
        <author>langkins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://langkins.javaeye.com">langkins</a>&nbsp;
          链接：<a href="http://langkins.javaeye.com/blog/165707" style="color:red;">http://langkins.javaeye.com/blog/165707</a>&nbsp;
          发表时间: 2008年02月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small; font-family: 楷体">在计划做一个自己的东西，涉及到电子支付、图片显示（比如较高分辨率的大图片的缩略显示，完全显示等）、视频（上传和播放甚至编辑等）等</span></p><p><span style="font-size: small; font-family: 楷体">因为很喜欢ROR实现系统给人带来的那种愉悦感，所以很想尝试一下新的实现方式，但是毕竟ROR的应用还不是那么全面和成熟，不知道它在这些方面的解决方案和性能怎么样？恳请了解的朋友给些指导，谢谢先。</span></p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://langkins.javaeye.com/blog/165707#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>Thu, 28 Feb 2008 13:03:27 +0800</pubDate>
        <link>http://langkins.javaeye.com/blog/165707</link>
        <guid>http://langkins.javaeye.com/blog/165707</guid>
      </item>
      <item>
        <title>基于泛型实现的Spring注入问题？</title>
        <author>langkins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://langkins.javaeye.com">langkins</a>&nbsp;
          链接：<a href="http://langkins.javaeye.com/blog/156089" style="color:red;">http://langkins.javaeye.com/blog/156089</a>&nbsp;
          发表时间: 2008年01月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>为了更加明确，可能贴的代码有点长，请见谅。</p><p>这里主要是打算应用泛型来做一些通常基本的CRUD操作，但是注入的时候出了点点问题。</p><p>我把基类部分注释掉以后可以正常工作，但是有一个问题，我每个具体的action类又必须重写BaseAction中的方法，因为manager没有得到注入，这样失去了使用泛型的意义。我把注释去掉以后在BaseAction中的&ldquo;manager&rdquo;无法按期望的方式的初始化。因为manager中的属性&ldquo;persistentClass&rdquo;永远都是在manager bean配置时设置的值，而不能变化，泛型就是需要变，我期望的是manager中该属性根据BusinessFlowDAO的构造注入时的参数而改变，该怎么做呢？</p><p>&nbsp;</p><p>附：我参考的一篇文章 http://blog.csdn.net/brodie/archive/2007/08/14/1743275.aspx</p><p>&nbsp;</p><p>下边是我的代码：</p><p>1、接口genericDao.java</p>&nbsp;&nbsp;&nbsp; <br /><pre name="code" class="java">public interface GenericDAO&lt;T, ID extends Serializable&gt; {

	T findById(ID id, boolean lock);

	List&lt;T&gt; findAll();
}</pre>&nbsp;<p>2、实现GenericHibernateDAO.java</p><p>&nbsp; </p><pre name="code" class="java">public class GenericHibernateDAO&lt;T, ID extends Serializable&gt; extends
		HibernateDaoSupport implements GenericDAO&lt;T, ID&gt; {

	private Class persistentClass;

	public GenericHibernateDAO() {

	}
	public GenericHibernateDAO(Class persistentClass) {
		logger.debug(&quot;base class constructor &quot; + persistentClass);
		this.persistentClass = persistentClass;
	}


	public Class getPersistentClass() {
		return persistentClass;
	}

	public void setPersistentClass(Class persistentClass) {
		this.persistentClass = persistentClass;
		logger.debug(&quot;persistentClass &quot; + this.persistentClass);
	}

	@SuppressWarnings(&quot;unchecked&quot;)
	public T findById(ID id, boolean lock) {
		T entity;
		if (lock)
			// this.getHibernateTemplate().load(this.getPersistentClass(), id);
			entity = (T) getSession().get(getPersistentClass(), id,
					LockMode.UPGRADE);
		else
			entity = (T) getSession().get(getPersistentClass(), id);
		return entity;
	}

	@SuppressWarnings(&quot;unchecked&quot;)
	public List&lt;T&gt; findAll() {
		return findByCriteria();
	}</pre><p>3、service接口Manager.java</p><div class="quote_title"><pre name="code" class="java">public interface Manager&lt;T, ID extends Serializable&gt; {

public T findById(ID id, boolean lock);

public List&lt;T&gt; findAll();
}</pre>&nbsp;</div><p>4、service实现ManagerImpl.java</p><pre name="code" class="java">public class ManagerImpl&lt;T, ID extends Serializable&gt; implements Manager&lt;T, ID&gt; {
	protected final Logger logger = Logger.getLogger(ManagerImpl.class);

	private GenericDAO genericDAO;

	@SuppressWarnings(&quot;unchecked&quot;)
	public T findById(ID id, boolean lock) {
		return (T) this.genericDAO.findById(id, lock);
	}

	@SuppressWarnings(&quot;unchecked&quot;)
	public List&lt;T&gt; findAll() {
		return (List&lt;T&gt;) this.genericDAO.findAll();
	}
}</pre><p>5、扩展的业务Dao、service</p><p>&nbsp;</p><p>&nbsp;</p><pre name="code" class="java">public interface BusinessFlowDAO extends GenericDAO&lt;BusinessFlow, Long&gt;{

	//TODO: add other method for business logic related to BusinessFlow
}
</pre><br /><pre name="code" class="java">public class BusinessFlowDAOHibernate extends
		GenericHibernateDAO&lt;BusinessFlow, Long&gt; implements BusinessFlowDAO {
	public BusinessFlowDAOHibernate(Class persistentClass) {		
		super(persistentClass);
		logger.debug(&quot;child class constructor &quot; + persistentClass);
	}
}</pre>&nbsp;<pre name="code" class="java">public interface BusinessFlowManager  extends Manager&lt;BusinessFlow, Long&gt;{	
}</pre>&nbsp;<pre name="code" class="java">public class BusinessFlowManagerImpl extends ManagerImpl&lt;BusinessFlow, Long&gt;
		implements BusinessFlowManager {
	private BusinessFlowDAO businessFlowDAO;

	public BusinessFlowDAO getBusinessFlowDAO() {
		return businessFlowDAO;
	}

	public void setBusinessFlowDAO(BusinessFlowDAO businessFlowDAO) {
		this.businessFlowDAO = businessFlowDAO;
		super.setGenericDAO(businessFlowDAO);
	}

}</pre>&nbsp;<p>baseAction如下：</p><pre name="code" class="java">public class BaseAction&lt;T extends Identifiable&lt;ID&gt;, TForm, ID extends Serializable&gt;
		extends DispatchAction {
	protected org.apache.log4j.Logger logger = org.apache.log4j.Logger
			.getLogger(&quot;action&quot;);

	public T instance;

	public TForm tForm;

	protected Manager&lt;T, ID&gt; manager;

	@SuppressWarnings(&quot;unchecked&quot;)
	public ActionForward create(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		TForm tf = (TForm) form;
		try {
			instance = (T) ConvertUtil.convert(tf);
			this.manager.makePersistent(instance);
		} catch (Exception e) {
			e.printStackTrace();
			logger.debug(&quot;create object exception &quot; + e.toString());
		}
		return null;
	}
......
}</pre>6、配置注入的代码 applicationContext.xml<p>&nbsp;</p><pre name="code" class="java">&lt;!--&lt;bean id=&quot;genericDAO&quot;
		class=&quot;com.wonders.persistence.GenericHibernateDAO&quot;&gt;
		&lt;property name=&quot;persistentClass&quot; value=&quot;java.lang.Object&quot;&gt;&lt;/property&gt;
		&lt;property name=&quot;sessionFactory&quot;&gt;
		&lt;ref bean=&quot;sessionFactory&quot; /&gt;
		&lt;/property&gt;
		&lt;/bean&gt;
		&lt;bean id=&quot;manager&quot; class=&quot;com.wonders.service.impl.ManagerImpl&quot;&gt;
		&lt;property name=&quot;genericDAO&quot;&gt;
		&lt;ref bean=&quot;genericDAO&quot; /&gt;
		&lt;/property&gt;
		&lt;/bean&gt;
		&lt;property name=&quot;persistentClass&quot;
		value=&quot;com.wonders.persistence.config.BusinessFlow&quot;&gt;
		&lt;/property&gt;	
	--&gt;
	&lt;bean id=&quot;businessFlowDAO&quot;
		class=&quot;com.wonders.persistence.config.dao.hibernate.BusinessFlowDAOHibernate&quot;&gt;
		&lt;constructor-arg&gt;
			&lt;value&gt;com.wonders.persistence.config.BusinessFlow&lt;/value&gt;
		&lt;/constructor-arg&gt;
		&lt;property name=&quot;sessionFactory&quot;&gt;
			&lt;ref bean=&quot;sessionFactory&quot; /&gt;
		&lt;/property&gt;
	&lt;/bean&gt;
	&lt;bean id=&quot;businessFlowManager&quot; parent=&quot;txProxyTemplate&quot;&gt;
		&lt;property name=&quot;target&quot;&gt;
			&lt;bean
				class=&quot;com.wonders.service.impl.config.BusinessFlowManagerImpl&quot;
				autowire=&quot;byName&quot; /&gt;
		&lt;/property&gt;
	&lt;/bean&gt;
。。。。。。</pre>&nbsp;<p>&nbsp;</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://langkins.javaeye.com/blog/156089#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, 15 Jan 2008 15:23:38 +0800</pubDate>
        <link>http://langkins.javaeye.com/blog/156089</link>
        <guid>http://langkins.javaeye.com/blog/156089</guid>
      </item>
      <item>
        <title>请各位发表意见：今天突然有一个“很酷”的想法</title>
        <author>langkins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://langkins.javaeye.com">langkins</a>&nbsp;
          链接：<a href="http://langkins.javaeye.com/blog/151737" style="color:red;">http://langkins.javaeye.com/blog/151737</a>&nbsp;
          发表时间: 2007年12月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天学习flex，其中用到了另一种“新”的脚本语言"actionscript"，“新”是因为名字是新的，其实遵循的标准语法和其他脚本语言还是很类似，由此又想起了，java和c#，这也是一对具有很多相似性的语言，甚至还有很多这样的孪生姊妹....<br />   那为什么不可以统一语言呢，从语法到变量的定义.....,使用同样的语言，通过不同的编译器就可以有不同的效果，比如遵循java语言的规范，通过jvm编译器就可以具备良好的跨平台性，安全性...,通过C#的编译器，可以具备C#的编译器，就能表现出它的相应特性...<br />   当然结构化编程语言和OO编程语言本身是有差别的，不是那么好统一，但是至少可以分类开来，这样的好处是开发人员不需要接触无止境的各式各样的编程语言，那么他们对语言的掌握将更加透彻，带来更加高效的开发和应用......<br />   当然这其中牵扯到很多独立的公司，独立的利益集团，真正实现远没有说说那么简单........
          <br/>
          <span style="color:red;">
            <a href="http://langkins.javaeye.com/blog/151737#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, 29 Dec 2007 11:31:54 +0800</pubDate>
        <link>http://langkins.javaeye.com/blog/151737</link>
        <guid>http://langkins.javaeye.com/blog/151737</guid>
      </item>
      <item>
        <title>关于程序员的职业生涯，技术&amp;行业背景孰轻孰重呢？</title>
        <author>langkins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://langkins.javaeye.com">langkins</a>&nbsp;
          链接：<a href="http://langkins.javaeye.com/blog/134984" style="color:red;">http://langkins.javaeye.com/blog/134984</a>&nbsp;
          发表时间: 2007年10月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          RT。<br />当然大家会说两个都很重要。<br />如果要综合衡量，选出更重要的呢，欢迎过来讨论一下？
          <br/>
          <span style="color:red;">
            <a href="http://langkins.javaeye.com/blog/134984#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, 24 Oct 2007 08:40:16 +0800</pubDate>
        <link>http://langkins.javaeye.com/blog/134984</link>
        <guid>http://langkins.javaeye.com/blog/134984</guid>
      </item>
      <item>
        <title>有点困惑</title>
        <author>langkins</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://langkins.javaeye.com">langkins</a>&nbsp;
          链接：<a href="http://langkins.javaeye.com/blog/134720" style="color:red;">http://langkins.javaeye.com/blog/134720</a>&nbsp;
          发表时间: 2007年10月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这段时间都在思考一个问题<br />那就是我该如何走<br />我是说刚刚步入社会，职业生涯的路该如何走<br />怎样才能找到最适合自己的发展道路。<br /><br />我刚刚从一所还不错的工科学校毕业，硕士学历，现在已经工作了三个多月，<br />现在的公司属于那种靠政府行业养着的类型<br />业务和生存都不存在问题，<br />但是她的这种背景早就了她的一些先天不足<br />所以在这里工作给人的感觉，可以用用一个比方形象的说明<br />那就是性欲旺盛的少妇面对着一位那方面有点欠缺的男人<br />男人点起了她的欲望，但却没法满足她，徒有郁闷无处发泄。开发项目<br />的时候看所谓资深人士做的需求和数据库设计，简直要命，明明用<br />Hibernate开发，却体现不出一点OO思想；明明是需求文档，却是一堆<br />从客户现有的系统上Copy过来的图片，有的地方还偷工简料省掉了，即<br />使偶尔找到一个word文档，兴奋完了认真看时，却看不出它具体需要什<br />么；设计文档压根儿没有。<br /><br /><br />在学校的时候也经历很多中小型项目的开发实习，都是java方面的，积累了一些<br />开发上的经验，能做一些不是很复杂的项目的需求分析和数据库设计（<br />OOA/AAD）。流行的开源框架：比如struts/webwork2,Hibernate, Spring<br />等都用过，虽不是多里手，项目框架开发环境的搭建和配置以及相关的<br />开发都不成问题。流行的View层技术也熟悉一些，比如jsp，<br />freemarker，JS功底也还马马虎虎，熟悉Ajax技术，能熟练使用Ext JS<br />进页面开发。我对技术挺感兴趣，但是我也知道，我这样的技术的同行<br />，肯定是大把大把的，所以根本谈不上什么竞争力。所以我想刚毕业我<br />的首要任务还是提高自己，多学习，多积累，薪资待遇都不是重点。现<br />在的境况，想提高技术也没多好的环境，想提升待遇就更别想了，真的<br />有点困惑了。跳槽吗？还是怎么办呢？路过的人们，给点建议吧，谢谢！
          <br/>
          <span style="color:red;">
            <a href="http://langkins.javaeye.com/blog/134720#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, 23 Oct 2007 12:22:48 +0800</pubDate>
        <link>http://langkins.javaeye.com/blog/134720</link>
        <guid>http://langkins.javaeye.com/blog/134720</guid>
      </item>
  </channel>
</rss>