<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>博一博</title>
    <description></description>
    <link>http://superbo8888.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>Spring之概念入门</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/87068" style="color:red;">http://superbo8888.javaeye.com/blog/87068</a>&nbsp;
          发表时间: 2007年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="3" face="Arial">Spring是什么<br />
spring是一个开源的java框架，集成了各种主流的技术包括web mvc，orm，ejb，rmi，javamail等<br />
他就象一个粘合济，在实际项目中，将前后台程序粘合在一起，构建出一个完整的系统。</font></p>
<p><font size="3" face="Arial">spring中的各个组件也可独立使用，你可以在你的项目中选择性的使用spring提供的某一部分功能</font></p>
<p><font size="3" face="Arial">Spring的核心是ioc和aop</font></p>
<p><font size="3" face="Arial">什么是IOC</font></p>
<p><font size="3" face="Arial">Inversion of Control，控制反转或反转控制，其和另外一个概念DI－Dependency Injection依赖注入<br />
等价。</font></p>
<p><font size="3" face="Arial">到底如何来理解IOC？</font></p>
<p><font size="3" face="Arial">IOC确切的说，他是一种思想、概念，跟OOP是一种编程思想一样，他是在大量的项目实践中总结出来了<br />
的一种精妙地程序设计思想。在原先的程序设计中，我们通常是通过new XXX(),其中，XXX就是某个类<br />
的名称，在没有ioc思想引入时，我们程序中大量充斥着new XXX()这样的代码。这些代码都需要我们程<br />
序员手工编写。而引入了ioc思想之后，对象的管理全部交给Spring这个容器来管理，当我们程序需要<br />
对应类的对象时，我们直接从Spring容器里面获取，换句话说，就是Spring容器把产生好的对象交给了<br />
我们的程序，这种方式就叫做注入（就跟医生拿着可怕的针管将液体注入到我们的屁股上一样，为什么<br />
要注入，还不是你的屁股需要嘛！因为你需要，所以我给你，这就是DI）</font></p>
<p><font size="3" face="Arial">而IOC的深层含义就是，将原先对象产生的主动权交给了Spring容器，由Spring容器来为我们完成对象的<br />
new的过程，并将对象在我们需要时交给我们。</font></p>
<p><font size="3" face="Arial">Spring正是IOC思想的一个完美产物和实践者！</font></p>
<p><font size="3" face="Arial">什么是aop</font></p>
<p><font size="3" face="Arial">Aspect Oriented Programming，面向方面编程，它也是一种编程思想，它是对OOP编程思想的一种升华<br />
OOP强调的是对象，而aop强调的是面（不是饺子）</font></p>
<p><font size="3" face="Arial">那么，什么是面？</font></p>
<p><font size="3" face="Arial">如果拿我们的教室做比方，那么教室的前门和后窗就是一个面，一个截面，通过这样的截面，将我们这块<br />
空间分成了室内、窗外和门外三部分。</font></p>
<p><font size="3" face="Arial">如果拿我们吃的汉堡做比方，那么汉堡的夹心的前后就是一个面，一个截面，通过这样的截面，将我们的<br />
普通面包分成了面包上层、夹心、面包下层。</font></p>
<p><font size="3" face="Arial">如果。。。</font></p>
<p><font size="3" face="Arial">还是拿我们的程序代码来说，<br />
如果我们的dao用jdbc实现，那么在dao的每一个方法里都充斥着这样的代码，<br />
&nbsp;打开连接<br />
&nbsp;执行sql语句<br />
&nbsp;关闭连接<br />
那么，这时，我们就可以在执行sql前后做出一个截面，通过这样的截面，将我们的程序代码分开，将打开<br />
连接和关闭连接交给AOP去做，我们程序员只关注执行不同sql语句部分，避免了在dao的每个方法中都要编<br />
写重复的打开连接和关闭连接代码。</font></p>
<p><font size="3" face="Arial">如果我们的dao用hibernate实现，那么在dao的每一个方法里都充斥着这样的代码<br />
&nbsp;打开session<br />
&nbsp;执行session动作<br />
&nbsp;关闭session</font></p>
<p><font size="3" face="Arial">同理，我们就可以在执行session动作前后做出一个截面，通过这样的截面，将我们的程序代码分开，将打开<br />
session和关闭session交给AOP去做，我们程序员只关注执行session动作，避免了代码的重复岂不更好</font></p>
<p><font size="3" face="Arial">这就是AOP，好好理解吧，那可是个漫长的思想体验过程！祝君好运！</font></p>
<p><font face="Arial"></font><font size="3">&nbsp;</font></p>
<p><font face="Arial"></font><font size="3">&nbsp;</font></p>
<p><font face="Arial"></font><font size="3">&nbsp;</font></p>
<p><font face="Arial"></font><font size="3">&nbsp;</font></p>
<p><font face="Arial"></font><font size="3">&nbsp;</font></p>
<p><font face="Arial"></font><font size="3">&nbsp;</font></p>
<p><font face="Arial"></font><font size="3">&nbsp;</font></p>
<p><font face="Arial"></font><font size="3">&nbsp;</font></p>
<p><font face="Arial"></font><font size="3">&nbsp;</font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/87068#comments" style="color:red;">已有 <strong>15</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 05 Jun 2007 17:46:32 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/87068</link>
        <guid>http://superbo8888.javaeye.com/blog/87068</guid>
      </item>
      <item>
        <title>今日新概念</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/84545" style="color:red;">http://superbo8888.javaeye.com/blog/84545</a>&nbsp;
          发表时间: 2007年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>JPA-Java Persistence API即Java持久化API</p>
<p>Guice－一个据说比Spring快100倍的IOC容器</p>
<p>EasyJWeb－国产的一个Web框架（目前看来，发展比较困难，因为web层的框架太多而且竞争是相当的激烈）</p>
<p>范型DAO－一个个人关注很久的技术，希望空闲下来的时候编写一个结合范型Dao＋Spring＋Hibernate＋AOP的一个持久层综合框架出来。</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/84545#comments" style="color:red;">已有 <strong>4</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 29 May 2007 21:02:12 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/84545</link>
        <guid>http://superbo8888.javaeye.com/blog/84545</guid>
      </item>
      <item>
        <title>范型Dao</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/84543" style="color:red;">http://superbo8888.javaeye.com/blog/84543</a>&nbsp;
          发表时间: 2007年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>为了自己更好的借鉴范型dao的理念，我这里决定将网上的一篇个人觉得非常优秀的介绍范型DAO设计方面的文章引入（我先声明，我引入纯粹是为了借鉴）。</p>
<p>译者：Nicholas @ Nirvana Studio<br />
原文地址：<a href="http://www-128.ibm.com/developerworks/java/library/j-genericdao.html">http://www-128.ibm.com/developerworks/java/library/j-genericdao.html</a> </p>
<p>使用Hibernate和Spring AOP购建一个范型类型安全的DAO<br />
2006年五月12日<br />
</p>
<blockquote>在采用了Java 5的范型之后，要实现一个基于范型类型安全的数据访问对象（DAO）就变得切实可行了。在这篇文章里，系统架构师Per Mellqvist展示了一个基于Hibernate的范型DAO实现。然后将介绍如何使用Spring AOP的introduction为一个类增加一个类型安全的接口以便于执行查询。</blockquote>
<p>对于大多数开发者来说，在系统中为每一个DAO编写几乎一样的代码已经成为了一种习惯。同时大家也都认可这种重复就是&ldquo;代码的味道&rdquo;，我们中的大多数已经习惯如此。当然也有另外的办法。你可以使用很多ORM工具来避免代码的重复编写。举个例子，用Hibernate，你可以简单的使用session操作直接控制你的持久化领域对象。这种方式的负面影响就是丢失了类型安全。 </p>
<p>为什么你的数据访问代码需要一个类型安全的接口？我认为它减少了编程错误，提高了生产率，尤其是在使用现代高级IDE的时候。首先，一个类型安全的接口清晰的制定了哪些领域对象具有持久化功能。其次，它消除了类型转换带来的潜在问题。最后，它平衡了IDE的自动完成功能。使用自动完成功能是最快的方式来记住对于适当的领域类哪些查询是可用的。 </p>
<p>在这篇文章里，我将展示给大家如何避免一次次地重复编写DAO代码，但同时还收益于类型安全的接口。事实上，所有内需要编写的是为新的DAO编写一个Hibernate映射文件，一个POJO的Java接口，并且10行Spring配置文件。 </p>
<h2>DAO实现</h2>
<p>DAO模式对于任何Java开发人员来说都是耳熟能详的。这个模式的实现相当多，所以让我们仔细推敲一下我这篇文章里面对于DAO实现的一些假设： </p>
<ul>
    <li>所有系统中的数据库访问都是通过DAO来完成封装 </li>
    <li>每一个DAO实例对一个主要的领域对象或者实体负责。如果一个领域对象具有独立的生命周期，那么它需要具有自己的DAO。 </li>
    <li>DAO具有CRUD操作 </li>
    <li>DAO可以允许基于criteria方式的查询而不仅仅是通过主键查询。我将这些成为finder方法或者finders。这个finder的返回值通常是DAO所负责的领域对象的集合。 </li>
</ul>
<h2>范型DAO接口</h2>
<p>范型DAO的基础就是CRUD操作。下面的接口定义了范型DAO的方法： </p>
<blockquote>
<pre class="java5"><span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">interface</span> GenericDao &lt;T, PK <span style="FONT-WEIGHT: bold; COLOR: #000000">extends</span> Serializable&gt; <span style="COLOR: #66cc66">{</span>
&nbsp;
    <span style="COLOR: #808080; FONT-STYLE: italic">/** Persist the newInstance object into database */</span>
    PK create<span style="COLOR: #66cc66">(</span>T newInstance<span style="COLOR: #66cc66">)</span>;
&nbsp;
    <span style="COLOR: #808080; FONT-STYLE: italic">/** Retrieve an object that was previously persisted to the database using
     *   the indicated id as primary key
     */</span>
    T read<span style="COLOR: #66cc66">(</span>PK id<span style="COLOR: #66cc66">)</span>;
&nbsp;
    <span style="COLOR: #808080; FONT-STYLE: italic">/** Save changes made to a persistent object.  */</span>
    <span style="COLOR: #993333">void</span> update<span style="COLOR: #66cc66">(</span>T transientObject<span style="COLOR: #66cc66">)</span>;
&nbsp;
    <span style="COLOR: #808080; FONT-STYLE: italic">/** Remove an object from persistent storage in the database */</span>
    <span style="COLOR: #993333">void</span> delete<span style="COLOR: #66cc66">(</span>T persistentObject<span style="COLOR: #66cc66">)</span>;
<span style="COLOR: #66cc66">}</span></pre>
</blockquote>
<h3>实现这个接口</h3>
<p>使用Hibernate实现上面的接口是非常简单的。也就是调用一下Hibernate的方法和增加一些类型转换。Spring负责session和transaction管理。 </p>
<blockquote>
<pre class="java5"><span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">class</span> GenericDaoHibernateImpl &lt;T, PK <span style="FONT-WEIGHT: bold; COLOR: #000000">extends</span> Serializable&gt;
    <span style="FONT-WEIGHT: bold; COLOR: #000000">implements</span> GenericDao&lt;T, PK&gt;, FinderExecutor <span style="COLOR: #66cc66">{</span>
    <span style="FONT-WEIGHT: bold; COLOR: #000000">private</span> Class&lt;T&gt; type;
&nbsp;
    <span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> GenericDaoHibernateImpl<span style="COLOR: #66cc66">(</span>Class&lt;T&gt; type<span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
        <span style="FONT-WEIGHT: bold; COLOR: #000000">this</span>.<span style="COLOR: #006600">type</span> = type;
    <span style="COLOR: #66cc66">}</span>
&nbsp;
    <span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> PK create<span style="COLOR: #66cc66">(</span>T o<span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
        <span style="FONT-WEIGHT: bold; COLOR: #000000">return</span> <span style="COLOR: #66cc66">(</span>PK<span style="COLOR: #66cc66">)</span> getSession<span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>.<span style="COLOR: #006600">save</span><span style="COLOR: #66cc66">(</span>o<span style="COLOR: #66cc66">)</span>;
    <span style="COLOR: #66cc66">}</span>
&nbsp;
    <span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> T read<span style="COLOR: #66cc66">(</span>PK id<span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
        <span style="FONT-WEIGHT: bold; COLOR: #000000">return</span> <span style="COLOR: #66cc66">(</span>T<span style="COLOR: #66cc66">)</span> getSession<span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>.<span style="COLOR: #006600">get</span><span style="COLOR: #66cc66">(</span>type, id<span style="COLOR: #66cc66">)</span>;
    <span style="COLOR: #66cc66">}</span>
&nbsp;
    <span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> <span style="COLOR: #993333">void</span> update<span style="COLOR: #66cc66">(</span>T o<span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
        getSession<span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>.<span style="COLOR: #006600">update</span><span style="COLOR: #66cc66">(</span>o<span style="COLOR: #66cc66">)</span>;
    <span style="COLOR: #66cc66">}</span>
&nbsp;
    <span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> <span style="COLOR: #993333">void</span> delete<span style="COLOR: #66cc66">(</span>T o<span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
        getSession<span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>.<span style="COLOR: #006600">delete</span><span style="COLOR: #66cc66">(</span>o<span style="COLOR: #66cc66">)</span>;
    <span style="COLOR: #66cc66">}</span>
&nbsp;
    <span style="COLOR: #808080; FONT-STYLE: italic">// Not showing implementations of getSession() and setSessionFactory()</span>
<span style="COLOR: #66cc66">}</span></pre>
</blockquote>
<h3>Spring 配置</h3>
<p>最后，Spring配置，我创建了一个GenericDaoHibernateImpl的实例。GenericDaoHibernateImpl的构造器必须被告知领域对象的类型，这样DAO实例才能为之负责。这个同样需要Hibernate运行时知道这个对象的类型。下面的代码中，我将领域类Person传递给构造器并且将Hibernate的session工厂作为一个参数用来实例化DAO： </p>
<blockquote>
<pre class="xml"><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;bean</span> <span style="COLOR: #000066">id</span>=<span style="COLOR: #ff0000">&quot;personDao&quot;</span> <span style="COLOR: #000066">class</span>=<span style="COLOR: #ff0000">&quot;genericdao.impl.GenericDaoHibernateImpl&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span>
        <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;constructor-arg<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
            <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;value<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>genericdaotest.domain.Person<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/value<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
        <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/constructor-arg<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
        <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;property</span> <span style="COLOR: #000066">name</span>=<span style="COLOR: #ff0000">&quot;sessionFactory&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span>
            <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;ref</span> <span style="COLOR: #000066">bean</span>=<span style="COLOR: #ff0000">&quot;sessionFactory&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">/&gt;</span></span>
        <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/property<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/bean<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span></pre>
</blockquote>
<h2>可用的范型DAO</h2>
<p>我还没有全部完成，但我现在已经有了一个可供作的代码。下面的代码展示了范型DAO如何使用： </p>
<blockquote>
<pre class="java5"><span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> <span style="COLOR: #993333">void</span> someMethodCreatingAPerson<span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
    ...
    <span style="COLOR: #006600">GenericDao</span> dao = <span style="COLOR: #66cc66">(</span>GenericDao<span style="COLOR: #66cc66">)</span>
     beanFactory.<span style="COLOR: #006600">getBean</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">&quot;personDao&quot;</span><span style="COLOR: #66cc66">)</span>; <span style="COLOR: #808080; FONT-STYLE: italic">// This should normally be injected</span>
&nbsp;
    Person p = <span style="FONT-WEIGHT: bold; COLOR: #000000">new</span> Person<span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">&quot;Per&quot;</span>, <span style="COLOR: #cc66cc">90</span><span style="COLOR: #66cc66">)</span>;
    dao.<span style="COLOR: #006600">create</span><span style="COLOR: #66cc66">(</span>p<span style="COLOR: #66cc66">)</span>;
<span style="COLOR: #66cc66">}</span></pre>
</blockquote>
<p>这时候，我有一个范型DAO有能力进行类型安全的CRUD操作。同时也有理由编写GenericDaoHibernateImpl的子类来为每个领域对象增加查询功能。但是这篇文章的主旨在于展示如何完成这项功能而不是为每个查询编写明确的代码，然而，我将会使用多个工具来介绍DAO的查询，这就是Spring AOP和Hibernate命名查询。 </p>
<h2>Spring AOP介绍</h2>
<p>你可以使用Spring AOP提供的introduction功能将一个现存的对象包装到一个代理里面来增加新的功能，定义它需要实现的新接口，并且将之前所有不支持的方法委派到一个处理机。在我的DAO实现里面，我用introduction将一定数量的finder方法增加到现存的范型DAO类里面。因为finder方法针对特定的领域对象，所以它们被应用到表明接口的范型DAO中。 </p>
<blockquote>
<pre class="xml"><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;bean</span> <span style="COLOR: #000066">id</span>=<span style="COLOR: #ff0000">&quot;finderIntroductionAdvisor&quot;</span> <span style="COLOR: #000066">class</span>=<span style="COLOR: #ff0000">&quot;genericdao.impl.FinderIntroductionAdvisor&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">/&gt;</span></span>
&nbsp;
<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;bean</span> <span style="COLOR: #000066">id</span>=<span style="COLOR: #ff0000">&quot;abstractDaoTarget&quot;</span>
        <span style="COLOR: #000066">class</span>=<span style="COLOR: #ff0000">&quot;genericdao.impl.GenericDaoHibernateImpl&quot;</span> <span style="COLOR: #000066">abstract</span>=<span style="COLOR: #ff0000">&quot;true&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span>
        <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;property</span> <span style="COLOR: #000066">name</span>=<span style="COLOR: #ff0000">&quot;sessionFactory&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span>
            <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;ref</span> <span style="COLOR: #000066">bean</span>=<span style="COLOR: #ff0000">&quot;sessionFactory&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">/&gt;</span></span>
        <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/property<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/bean<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
&nbsp;
<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;bean</span> <span style="COLOR: #000066">id</span>=<span style="COLOR: #ff0000">&quot;abstractDao&quot;</span>
        <span style="COLOR: #000066">class</span>=<span style="COLOR: #ff0000">&quot;org.springframework.aop.framework.ProxyFactoryBean&quot;</span> <span style="COLOR: #000066">abstract</span>=<span style="COLOR: #ff0000">&quot;true&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span>
        <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;property</span> <span style="COLOR: #000066">name</span>=<span style="COLOR: #ff0000">&quot;interceptorNames&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span>
            <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;list<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
                <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;value<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>finderIntroductionAdvisor<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/value<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
            <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/list<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
        <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/property<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/bean<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span></pre>
</blockquote>
<p>在上面的配置中，我定义了三个Spring bean，第一个bean，FinderIntroductionAdvisor，处理那些introduce到DAO中但是不属于GenericDaoHibernateImpl类的方法。一会我再介绍Advisor bean的详细情况。 </p>
<p>第二个bean定义为&ldquo;abstract&rdquo;。在Spring中，这个bean可以被其他bean重用但是它自己不会被实例化。不同于抽象属性，bean的定义简单的指出了我需要一个GenericDaoHibernateImpl的实例同时需要一个SessionFactory的引用。注意GenericDaoHibernateImpl类只定义了一个构造器接受领域类作为参数。因为这个bean是抽象的，我可以无限次的重用并且设定合适的领域类。 </p>
<p>最后，第三个，也是最有意思的是bean将GenericDaoHibernateImpl的实例包装进了一个代理，给予了它执行finder方法的能力。这个bean定义同样是抽象的并且没有指定任何接口。这个接口不同于任何具体的实例。 </p>
<h3>扩展通用DAO</h3>
<p>每个DAO的接口，都是基于GenericDAO接口的。我需要将为特定的领域类适配接口并且将其扩展包含我的finder方法。 </p>
<blockquote>
<pre class="java5"><span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">interface</span> PersonDao <span style="FONT-WEIGHT: bold; COLOR: #000000">extends</span> GenericDao&lt;Person, Long&gt; <span style="COLOR: #66cc66">{</span>
    List&lt;Person&gt; findByName<span style="COLOR: #66cc66">(</span><a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">String</span></a> name<span style="COLOR: #66cc66">)</span>;
<span style="COLOR: #66cc66">}</span></pre>
</blockquote>
<p>上面的代码清晰的展示了通过用户名查找Person对象列表。所需的Java实现类不需要包含任何的更新操作，因为这些已经包含在了通用DAO里。 </p>
<h3>配置PersonDao</h3>
<p>因为Spring配置依赖之前的那些抽象bean，所以它变得很紧凑。我需要指定DAO负责的领域类，并且我需要告诉Spring我这个DAO需要实现的接口。 </p>
<blockquote>
<pre class="xml"><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;bean</span> <span style="COLOR: #000066">id</span>=<span style="COLOR: #ff0000">&quot;personDao&quot;</span> <span style="COLOR: #000066">parent</span>=<span style="COLOR: #ff0000">&quot;abstractDao&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span>
    <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;property</span> <span style="COLOR: #000066">name</span>=<span style="COLOR: #ff0000">&quot;proxyInterfaces&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span>
        <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;value<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>genericdaotest.dao.PersonDao<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/value<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
    <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/property<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
    <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;property</span> <span style="COLOR: #000066">name</span>=<span style="COLOR: #ff0000">&quot;target&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span>
        <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;bean</span> <span style="COLOR: #000066">parent</span>=<span style="COLOR: #ff0000">&quot;abstractDaoTarget&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span>
            <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;constructor-arg<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
                <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;value<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>genericdaotest.domain.Person<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/value<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
            <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/constructor-arg<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
        <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/bean<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
    <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/property<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/bean<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span></pre>
</blockquote>
<p>你可以这样使用： </p>
<blockquote>
<pre class="java5"><span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> <span style="COLOR: #993333">void</span> someMethodCreatingAPerson<span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
    ...
    <span style="COLOR: #006600">PersonDao</span> dao = <span style="COLOR: #66cc66">(</span>PersonDao<span style="COLOR: #66cc66">)</span>
     beanFactory.<span style="COLOR: #006600">getBean</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">&quot;personDao&quot;</span><span style="COLOR: #66cc66">)</span>; <span style="COLOR: #808080; FONT-STYLE: italic">// This should normally be injected</span>
&nbsp;
    Person p = <span style="FONT-WEIGHT: bold; COLOR: #000000">new</span> Person<span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">&quot;Per&quot;</span>, <span style="COLOR: #cc66cc">90</span><span style="COLOR: #66cc66">)</span>;
    dao.<span style="COLOR: #006600">create</span><span style="COLOR: #66cc66">(</span>p<span style="COLOR: #66cc66">)</span>;
&nbsp;
    List&lt;Person&gt; result = dao.<span style="COLOR: #006600">findByName</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">&quot;Per&quot;</span><span style="COLOR: #66cc66">)</span>; <span style="COLOR: #808080; FONT-STYLE: italic">// Runtime exception</span>
<span style="COLOR: #66cc66">}</span></pre>
</blockquote>
<p>上面的代码是使用类型安全接口PersonDao的一种正确途径，但是DAO的实现并没有完成。当调用findByName()的时候导致了一个运行时异常。这个问题是我还没有findByName()。剩下的工作就是指定查询语句。要完成这个，我使用Hibernate命名查询。 </p>
<h3>Hibernate命名查询</h3>
<p>使用Hibernate，你可以定义任何HQL查询在映射文件里，并且给它一个名字。你可以在之后的代码里面方便的通过名字引用这个查询。这么做的一个优点就是能够在部署的时候调节查询而不需要改变代码。正如你一会将看到的，另一个好处就是实现一个&ldquo;完整&rdquo;的DAO而不需要编写任何Java实现代码。 </p>
<blockquote>
<pre class="xml"><span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;hibernate-mapping</span> <span style="COLOR: #000066">package</span>=<span style="COLOR: #ff0000">&quot;genericdaotest.domain&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span>
     <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;class</span> <span style="COLOR: #000066">name</span>=<span style="COLOR: #ff0000">&quot;Person&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span>
         <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;id</span> <span style="COLOR: #000066">name</span>=<span style="COLOR: #ff0000">&quot;id&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span>
             <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;generator</span> <span style="COLOR: #000066">class</span>=<span style="COLOR: #ff0000">&quot;native&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">/&gt;</span></span>
         <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/id<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
         <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;property</span> <span style="COLOR: #000066">name</span>=<span style="COLOR: #ff0000">&quot;name&quot;</span> <span style="FONT-WEIGHT: bold; COLOR: black">/&gt;</span></span>
         <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;property</span> <span style="COLOR: #000066">name</span>=<span style="COLOR: #ff0000">&quot;weight&quot;</span> <span style="FONT-WEIGHT: bold; COLOR: black">/&gt;</span></span>
     <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/class<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
&nbsp;
     <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;query</span> <span style="COLOR: #000066">name</span>=<span style="COLOR: #ff0000">&quot;Person.findByName&quot;</span><span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span>
         <span style="COLOR: #339933">&lt;![CDATA[select p from Person p where p.name = ? ]]&gt;</span>
     <span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/query<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span>
<span style="COLOR: #009900"><span style="FONT-WEIGHT: bold; COLOR: black">&lt;/hibernate-mapping<span style="FONT-WEIGHT: bold; COLOR: black">&gt;</span></span></span></pre>
</blockquote>
<p>上面的代码定义了领域类Person的Hibernate映射文件，有两个属性：name和weight。Person是一个具有上面属性的简单的POJO。这个文件同时包含了一个查询，通过提供的name属性从数据库查找Person实例。Hibernate为命名查询提供了不真实的命名空间功能。为了便于讨论，我将所有的查询名字的前缀变成领域类的的名称。在现实场景中，使用完整的类名，包含包名，是一个更好的主意。 </p>
<h2>总览</h2>
<p>你已经看到了为任何领域对象创建并配置DAO的所需步骤了。这三个简单的步骤就是： </p>
<ol>
    <li>定义一个接口继承GenericDao并且包含任何所需的finder方法 </li>
    <li>在映射文件中为每个领域类的finder方法增加一个命名查询。 </li>
    <li>为DAO增加10行Spring配置 </li>
</ol>
<h2>可重用的DAO类</h2>
<p>Spring advisor和interceptor的功能比较琐碎，事实上他们的工作都引用回了GenericDaoHibernateImpl类。所有带有&ldquo;find&rdquo;开头的方法都被传递给DAO的单一方法executeFinder()。 </p>
<blockquote>
<pre class="java5"><span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">class</span> FinderIntroductionAdvisor <span style="FONT-WEIGHT: bold; COLOR: #000000">extends</span> DefaultIntroductionAdvisor <span style="COLOR: #66cc66">{</span>
    <span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> FinderIntroductionAdvisor<span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
        <span style="FONT-WEIGHT: bold; COLOR: #000000">super</span><span style="COLOR: #66cc66">(</span><span style="FONT-WEIGHT: bold; COLOR: #000000">new</span> FinderIntroductionInterceptor<span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span>;
    <span style="COLOR: #66cc66">}</span>
<span style="COLOR: #66cc66">}</span>
&nbsp;
<span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">class</span> FinderIntroductionInterceptor <span style="FONT-WEIGHT: bold; COLOR: #000000">implements</span> IntroductionInterceptor <span style="COLOR: #66cc66">{</span>
&nbsp;
    <span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> <a href="http://www.google.com/search?sitesearch=java.sun.com&amp;q=allinurl%3Aj2se%2F1+5+0%2Fdocs%2Fapi+Object"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">Object</span></a> invoke<span style="COLOR: #66cc66">(</span>MethodInvocation methodInvocation<span style="COLOR: #66cc66">)</span> <span style="FONT-WEIGHT: bold; COLOR: #000000">throws</span> <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Throwable.html"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">Throwable</span></a> <span style="COLOR: #66cc66">{</span>
&nbsp;
        FinderExecutor genericDao = <span style="COLOR: #66cc66">(</span>FinderExecutor<span style="COLOR: #66cc66">)</span> methodInvocation.<span style="COLOR: #006600">getThis</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>;
&nbsp;
        <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">String</span></a> methodName = methodInvocation.<span style="COLOR: #006600">getMethod</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>.<span style="COLOR: #006600">getName</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>;
        <span style="COLOR: #b1b100">if</span> <span style="COLOR: #66cc66">(</span>methodName.<span style="COLOR: #006600">startsWith</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #ff0000">&quot;find&quot;</span><span style="COLOR: #66cc66">)</span><span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
            <a href="http://www.google.com/search?sitesearch=java.sun.com&amp;q=allinurl%3Aj2se%2F1+5+0%2Fdocs%2Fapi+Object"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">Object</span></a><span style="COLOR: #66cc66">[</span><span style="COLOR: #66cc66">]</span> arguments = methodInvocation.<span style="COLOR: #006600">getArguments</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>;
            <span style="FONT-WEIGHT: bold; COLOR: #000000">return</span> genericDao.<span style="COLOR: #006600">executeFinder</span><span style="COLOR: #66cc66">(</span>methodInvocation.<span style="COLOR: #006600">getMethod</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>, arguments<span style="COLOR: #66cc66">)</span>;
        <span style="COLOR: #66cc66">}</span> <span style="COLOR: #b1b100">else</span> <span style="COLOR: #66cc66">{</span>
            <span style="FONT-WEIGHT: bold; COLOR: #000000">return</span> methodInvocation.<span style="COLOR: #006600">proceed</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>;
        <span style="COLOR: #66cc66">}</span>
    <span style="COLOR: #66cc66">}</span>
&nbsp;
    <span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> <span style="COLOR: #993333">boolean</span> implementsInterface<span style="COLOR: #66cc66">(</span><a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">Class</span></a> intf<span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
        <span style="FONT-WEIGHT: bold; COLOR: #000000">return</span> intf.<span style="COLOR: #006600">isInterface</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span> &amp;&amp; FinderExecutor.<span style="FONT-WEIGHT: bold; COLOR: #000000">class</span>.<span style="COLOR: #006600">isAssignableFrom</span><span style="COLOR: #66cc66">(</span>intf<span style="COLOR: #66cc66">)</span>;
    <span style="COLOR: #66cc66">}</span>
<span style="COLOR: #66cc66">}</span></pre>
</blockquote>
<h3>executeFinder() 方法</h3>
<p>上面的代码唯一缺的就是executeFinder的实现。这个代码观察被调用的类的名字和方法，并且将他们与Hibernate的查询名相匹配。你可以使用一个FinderNamingStrategy来激活其他方式的命名查询。默认的实现查找一个名为&ldquo;ClassName.methodName&rdquo;的查询，ClassName是除包名之外的类名。 </p>
<blockquote>
<pre class="java5"><span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> List&lt;T&gt; executeFinder<span style="COLOR: #66cc66">(</span><a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Method.html"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">Method</span></a> method, <span style="FONT-WEIGHT: bold; COLOR: #000000">final</span> <a href="http://www.google.com/search?sitesearch=java.sun.com&amp;q=allinurl%3Aj2se%2F1+5+0%2Fdocs%2Fapi+Object"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">Object</span></a><span style="COLOR: #66cc66">[</span><span style="COLOR: #66cc66">]</span> queryArgs<span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
     <span style="FONT-WEIGHT: bold; COLOR: #000000">final</span> <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">String</span></a> queryName = queryNameFromMethod<span style="COLOR: #66cc66">(</span>method<span style="COLOR: #66cc66">)</span>;
     <span style="FONT-WEIGHT: bold; COLOR: #000000">final</span> <a href="http://java.sun.com/j2se/1.5.0/docs/api/javax/management/Query.html"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">Query</span></a> namedQuery = getSession<span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>.<span style="COLOR: #006600">getNamedQuery</span><span style="COLOR: #66cc66">(</span>queryName<span style="COLOR: #66cc66">)</span>;
     <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">String</span></a><span style="COLOR: #66cc66">[</span><span style="COLOR: #66cc66">]</span> namedParameters = namedQuery.<span style="COLOR: #006600">getNamedParameters</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>;
     <span style="COLOR: #b1b100">for</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #993333">int</span> i = <span style="COLOR: #cc66cc">0</span>; i &lt; queryArgs.<span style="COLOR: #006600">length</span>; i++<span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
             <a href="http://www.google.com/search?sitesearch=java.sun.com&amp;q=allinurl%3Aj2se%2F1+5+0%2Fdocs%2Fapi+Object"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">Object</span></a> arg = queryArgs<span style="COLOR: #66cc66">[</span>i<span style="COLOR: #66cc66">]</span>;
             <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Type.html"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">Type</span></a> argType =  namedQuery.<span style="COLOR: #006600">setParameter</span><span style="COLOR: #66cc66">(</span>i, arg<span style="COLOR: #66cc66">)</span>;
      <span style="COLOR: #66cc66">}</span>
      <span style="FONT-WEIGHT: bold; COLOR: #000000">return</span> <span style="COLOR: #66cc66">(</span>List&lt;T&gt;<span style="COLOR: #66cc66">)</span> namedQuery.<span style="COLOR: #006600">list</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>;
<span style="COLOR: #66cc66">}</span>
&nbsp;
<span style="FONT-WEIGHT: bold; COLOR: #000000">public</span> <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">String</span></a> queryNameFromMethod<span style="COLOR: #66cc66">(</span><a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Method.html"><span style="FONT-WEIGHT: bold; COLOR: #aaaadd">Method</span></a> finderMethod<span style="COLOR: #66cc66">)</span> <span style="COLOR: #66cc66">{</span>
     <span style="FONT-WEIGHT: bold; COLOR: #000000">return</span> type.<span style="COLOR: #006600">getSimpleName</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span> + <span style="COLOR: #ff0000">&quot;.&quot;</span> + finderMethod.<span style="COLOR: #006600">getName</span><span style="COLOR: #66cc66">(</span><span style="COLOR: #66cc66">)</span>;
<span style="COLOR: #66cc66">}</span></pre>
</blockquote>
<h2>总结</h2>
<p>在Java 5之前，Java语言并不支持代码同时具有类型安全和范性的特性；你不得不二者选一。在这篇文章里，你可以看到使用Java 5范型支持并且结合Spring和Hibernate（和AOP）一起来提高生产力。一个范型类型安全的DAO类非常容易编写，所有你需要做的就是一个接口，一些命名查询，并且10行Spring配置，并且可以极大的减少错误，同时节省时间。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/84543#comments" style="color:red;">已有 <strong>7</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 29 May 2007 20:54:38 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/84543</link>
        <guid>http://superbo8888.javaeye.com/blog/84543</guid>
      </item>
      <item>
        <title>装修，想说爱你不容易！</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/83909" style="color:red;">http://superbo8888.javaeye.com/blog/83909</a>&nbsp;
          发表时间: 2007年05月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="4">一间草窝，没想到装修它会是如此的累人！！！截至到26号，当装修工人拿着榔头敲了两下表示开工后，我跟lp才总算歇了口气，不容易啊！回头想想，从去年7月定下房子，今年二月开始月供，三月开始物色装修公司，五月拿到房子钥匙，六月购买厨房家具，洁具，地板\地砖。其中的过程，可能只有象我们这样有过经历的人才能体会。这其中，最让我感到心力交瘁的就是装修了，为了装修，为了能省点银子，我们不知跑了多少家装修公司！为了定购便宜点的家具，我们是到处托人托关系，可还是大大超出了我们的预算。另外，还有一件比较好玩的事情，在装修公司进场之前不是要通知洁具代理商来定水位嘛，由于我们定了三家不同代理商的产品，导致那天三家公司的师傅全部一起挤在我那微小的卫生间内在商讨方案，那个场面还是相当选择的壮观哦！后来人家给我们说，你们怎么不定一家的产品呢，那样还好服务些（天哪！我们还不是为了省点银子哦，因为我们全部是选择三家中最便宜的哦）。</font></p>
<p><font size="4">等一切定下来了，接下来就是当监工了（由于工作原因，也只能每周回去看一次！真的怕那帮奸商会作出什么龌龊的事情来）。在此，也给即将准备装修的同仁提个醒，装修不是一件轻松的事情，比写程序复杂多了，毕竟你的对手是人而不是跟机器！祝君好运...！</font></p>
<p><font size="4"></font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/83909#comments" style="color:red;">已有 <strong>23</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Mon, 28 May 2007 15:38:55 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/83909</link>
        <guid>http://superbo8888.javaeye.com/blog/83909</guid>
      </item>
      <item>
        <title>新名词REST</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/82922" style="color:red;">http://superbo8888.javaeye.com/blog/82922</a>&nbsp;
          发表时间: 2007年05月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="4">在robbin的博客上看到了这样一个字眼REST,甚感好奇,于是呼,网上google了一把,终于搞清楚它的名词解释Representational State Transfer,但网上没有几个地方给出中文意思的.个人将其字面直译过来是&quot;表现状态转换&quot;.<a href="http://www.javaeye.com/topic/70113">这里有介绍什么是REST</a></font></p>
<p><font size="4">根据在网上的资料介绍,REST是一种新的软件开发方法,就象以前的RUP/XP/TDD之类,用于指导我们的软件开发以快速,高效地进行.个人的理解,它更像是&quot;页面驱动开发&quot;的一个变种(目前也仅停留在这样的理解上).为了不误导各位,这里我引入一位大牛的博客文章以示人.<font face="Arial"><a href="http://www.javaeye.com/blog/72604">点击这里进入</a></font></font></p>
<p><font size="4"></font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/82922#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 25 May 2007 10:41:03 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/82922</link>
        <guid>http://superbo8888.javaeye.com/blog/82922</guid>
      </item>
      <item>
        <title>(转贴)JS之OOP(一)</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/82613" style="color:red;">http://superbo8888.javaeye.com/blog/82613</a>&nbsp;
          发表时间: 2007年05月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="4" face="Arial">
<p><font face="Arial">考虑刚开始写,没有多少感觉的,就将网上的一篇文章转载(我也是受它的启发才想到JS的OOP的).原文如下:</font></p>
<p><font face="Arial">在写面向对象的WEB应用程序方面JavaSciprt是一种很好的选择.它能支持OOP.因为它通过原型支持继承的方式和通过属性和方法的方式一样好.很多开发者试图抛弃JS,试着用C#或JAVA仅是因为JS不是他认为合适的面向对象的语言.许多人还没有认识到javascript支持继承.当你写面向对象的代码时.它能给你很强大的能量.你也可以使用它写出可复用,可封装的代码.</font></p>
<p><font face="Arial">对象为何如此伟大?<br />
&nbsp;&nbsp;&nbsp; 面向对象思想的成功是由于它仿照了现实中的事物和事物的联系.事物有属性和方法.如果我们描述一个台灯.我们会说它的高度和宽度,比如12CM.&quot;开灯&quot;这个动作是它的方法.当它是处于开着的状态时.它可以被调亮一点或暗一点(也就是亮度这个属性值变大或变小).<br />
&nbsp;&nbsp;&nbsp; <br />
javascript 给予了为WEB应用程序创建对象的能力.对象在需要的时候相应的事件会被触发,代码封装后,它能被实例化很多次.在javascript里有几种创建对象的方法,在不同的场合可用不同的方法</font></p>
<p><font face="Arial">1.1JS创建对象方式之一用 new Object() 来创建对象</font></p>
<p><font face="Arial">.最简单的就是用new 操作符,例如:<br />
<script language="javascript" type="text/javascript"><br />
person = new Object()<br />
person.name = "Tim Scarfe"<br />
person.height = "6Ft"<br />
person.run = function() {<br />
       this.state = "running"<br />
       this.speed = "4ms^-1"<br />
}<br />
</script><br />
我们在这个例子里定义了person这个对象,然后加入了它的属性和方法.在这个例子里,自定义的方法里有两个属性.</font></p>
<p><font face="Arial">1.2.用文字记号Literal Notation创建对象<br />
用文字记号也可以创建对象,但要javascript 1.2以上版本.它的创建形式是多样的.<br />
<script language="javascript" type="text/javascript"><br />
// Object Literals<br />
timObject = {<br />
      property1 : "Hello",<br />
      property2 : "MmmMMm",<br />
      property3 : ["mmm", 2, 3, 6, "kkk"],<br />
      method1 : function(){<br />
         alert("Method had been called" + this.property1)<br />
       }<br />
};<br />
timObject.method1();<br />
alert(timObject.property3[2]) // 结果为3</font></p>
<p><font face="Arial">var circle = { x : 0, y : 0, radius: 2 } // another example<br />
// 嵌套也是允许的哦.<br />
var rectangle = { <br />
          upperLeft : { x : 2, y : 2 },<br />
         lowerRight : { x : 4, y : 4}<br />
}<br />
alert(rectangle.upperLeft.x) // 结果为2<br />
</script><br />
文字记号可是是数组,也可以是任意的javascript表达式或值.<br />
用 new 操作符或文字记号创建一个自定义对象都是简单的,也是符合逻辑的.但它最大的缺点就是结果不可复用.也不能很容易的用不同的版本初始化创建对象.例如上面的第一个例子,如果 person 的 name 不是 &quot;Tim Scarfe&quot;,那样我们不得不重新定义整个对象,仅仅为了适应它的一点点改变.</font></p>
<p><font face="Arial">1.3.对象的构造和原型<br />
&nbsp;&nbsp; 在OOP的世界里,用先前的方法定义对象在许多场合都有限制.我们需要一种创建对象的方法,类型可以被多次使用而不用重新定义.对象在实例化时每次都可以按需分配不同的值.实现这个目标的标准方法是用对象构造器函数.</font></p>
<p><font face="Arial">&nbsp;&nbsp; 一个对象构造器只不过是个有规则的javascript函数,它就象一个容器(定义参数,调用其他函数等等).它们两者所不同的是构造器函数是由 new 操作符调用的.(你将在下面的例子中看到).基于函数语法形式的对象定义,我们可以使它工作得最好.</font></p>
<p><font face="Arial">让我们用现实世界中的猫来举个例子.猫的 name 和 color 是猫的属性.meeyow(猫叫)是它的一个方法.重要的是任何不同的猫都可能有不同的 name 和 meeyow 的叫声.为了建立适应这些特征的对象类,我们将使用对象构造器.<br />
<script language="javascript" type="text/javascript"><br />
function cat(name) {<br />
       this.name = name;  <br />
       this.talk = function() {<br />
              alert( this.name + " say meeow!" )<br />
       }<br />
} <br />
cat1 = new cat("felix")<br />
cat1.talk() //alerts "felix says meeow!"<br />
cat2 = new cat("ginger")<br />
cat2.talk() //alerts "ginger says meeow!"<br />
</script><br />
在这里,函数 cat() 是一个对象构造器,它的属性和方法在函数体里用this来定义,用对象构造器定义的对象用 new 来实例化.主意我们如何非常容易的定义多个cat 的实例.每一个都有自己的名字,这就是对象构造器带给我们的灵活性.<br />
构造器建立了对象的蓝图.并不是对象本身.</font></p>
<p><font face="Arial">在原型里增加方法.<br />
在上面我们看到的例子里,对象的方法是在构造器里定义好的了.另外一种实现的途径是通过原型(prototype).xxx<br />
原型是javascript继承的一种形式.我们可以为对象定义好后,再创造一个方法.原来所有对象的实例都将共享.<br />
让我们来扩展最初的 cat 对象.增加一个改名的方法.用 prototype 的方式.<br />
<script language="javascript" type="text/javascript"></font></p>
<p><font face="Arial">cat.prototype.changeName = function(name) {<br />
          this.name = name;<br />
}<br />
firstCat = new cat("pursur")<br />
firstCat.changeName("Bill")<br />
firstCat.talk() //alerts "Bill says meeow!"<br />
</script><br />
就象你所看到的.我们仅只用了 关键字 prototype 实现了在对象定义后马上增加了changeName方法.这个方法被所有的实例共享.</font></p>
<p><font face="Arial">用原型(prototype) 重载 javascript 对象<br />
原型 在自定义对象和有选择性的重载对象上都可以工作.比如 Date() 或 String .这可能是无止境的.</font></p>
<p><font face="Arial">1.4.子类和超类<br />
下面一个例子演示了如何继承<br />
<script language="javascript" type="text/javascript"><br />
function superClass() {<br />
         this.supertest = superTestMethod; //attach method superTest<br />
}</font></p>
<p><font face="Arial">function superTestMethod() {<br />
         return "superTest";<br />
}</font></p>
<p><font face="Arial">function subClass() {<br />
         this.inheritFrom = superClass;<br />
         this.inheritFrom();<br />
         this.subtest = subTestMethod; //attach method subTest<br />
}</font></p>
<p><font face="Arial">function subTestMethod() {<br />
        return "subTest";<br />
}</font></p>
<p><font face="Arial">var newClass = new subClass();<br />
alert(newClass.subtest()); // 弹出"subTest"<br />
alert(newClass.supertest()); // 弹出 "superTest"<br />
</script><br />
1.5.访问对象属性<br />
正如你所知, (.)操作符能够用来操作对象属性和方法,而([]) 操作符用来操作数组.<br />
<script language="javascript" type="text/javascript"><br />
// 这两种用法是相同的<br />
object.property<br />
object["property"]<br />
</script><br />
<script language="javascript"><br />
function Circle (xPoint, yPoint, radius) {<br />
       this.x = xPoint; <br />
       this.y = yPoint; <br />
       this.r = radius; <br />
}<br />
var aCircle = new Circle(5, 11, 99);<br />
alert(aCircle.x);<br />
alert(aCircle["x"]);<br />
</script><br />
我们可以通过for in循环来遍历对象的属性。<br />
<script language="javascript" type="text/javascript"><br />
var testObj = {<br />
      prop1 : "hello",<br />
      prop2 : "hello2",<br />
      prop3 : new Array("hello",1,2)<br />
}<br />
for(x in testObj) {<br />
     alert( x + "-" + testObj[ x ] )<br />
}<br />
</script><br />
<script language="javascript"><br />
var Circle = { // another example<br />
       x : 0, <br />
       y : 1, <br />
      radius: 2 <br />
} </font></p>
<p><font face="Arial">for(p in Circle) {<br />
       alert( p + "-" + Circle[ p ] )<br />
}<br />
</script><br />
</font></p>
</font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/82613#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 24 May 2007 16:45:00 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/82613</link>
        <guid>http://superbo8888.javaeye.com/blog/82613</guid>
      </item>
      <item>
        <title>用面向对象的思维来写JS</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/82297" style="color:red;">http://superbo8888.javaeye.com/blog/82297</a>&nbsp;
          发表时间: 2007年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="4">最近为了学习ext1.0.1这个ajax框架,再次重温了一回JS,终于发现JS的面向对象思想原来跟java是如此的相似,也感慨自己做了这么多年的web开发竟然对js了解的如此之少,同时再次的对自己在面向对象思想的领悟层次上打了一个大大的问号.<img src="/javascripts/fckeditor/editor/images/smiley/msn/embaressed_smile.gif" alt="" /></font></p>
<p><font size="4">静下心来,重新用面向对象的思想来审视JS,用OOP的思想来开发JS程序,力争在j2ee web开发当中用全新的OOP思想构建系统(以前js部分都是面向过程的开发,java部分则是OOP的开发方式).我会将自己的一点学习心得书写下来作为一个见证!</font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/82297#comments" style="color:red;">已有 <strong>7</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 23 May 2007 21:56:00 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/82297</link>
        <guid>http://superbo8888.javaeye.com/blog/82297</guid>
      </item>
      <item>
        <title>深入挖掘AJAX</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/82270" style="color:red;">http://superbo8888.javaeye.com/blog/82270</a>&nbsp;
          发表时间: 2007年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="4" face="Arial">有一半清醒,有一半醉!这可能是众位看客看过之前两篇博客后的感觉.没关系,继续闷头看起!!!</font></p>
<p><font size="4" face="Arial">你的脑壳一定要建立这样一种信念,ajax不是新的技术,而是对客户端技术js/dom/css的综合运用而已.所以掌握ajax,最重要是在锤炼你的js/dom/css功底.从web应用角度来看,无非就是处理两种事情</font></p>
<p><font size="4" face="Arial">1.request-请求即浏览器向服务器请求数据</font></p>
<p><font size="4">我们来看看在request方都需要做哪些事情呢?</font></p>
<p><font size="4" face="Arial">1.1XMLHttpRequest对象的构建</font></p>
<p><font size="4" face="Arial">ajax方式的请求是借助浏览器的一个对象XMLHttpRequest来实现.而获取XMLHttpRequest对象在不同类型的浏览器中的方式不同,火狐浏览器直接通过new XMLHttpRequest()来完成,而对于IE浏览器来说,则需要根据IE的不同版本来实现XMLHttpRequest对象的构建.当获得XMLHttpRequest对象后保存在一个变量中,命名成http_request.</font></p>
<p><font size="4" face="Arial">1.2设置响应处理函数</font></p>
<p><font size="4" face="Arial">在发送请求数据的时候,就需要提前设置谁来处理服务器返回的数据,对客户端来讲,当然就是某个js函数了.这里设置响应处理函数用这样一句代码来实现:</font></p>
<p><font size="4" face="Arial">http_request.onreadystatechange=doHandler;</font></p>
<p><font size="4" face="Arial">其中,onreadystatechange是XMLHttpRequest对象上的一个属性,整句代码的意思是&quot;当服务器将数据返回后,将数据交给函数名为doHandler的函数负责处理&quot;.函数doHandler需要你单独编写.</font></p>
<p><font size="4" face="Arial">1.3构建请求服务器地址和发送数据</font></p>
<p><font size="4" face="Arial">服务器地址的构建是根据客户端的请求方式的不同而不同,如果客户端请求方式为post时,这时,地址和请求数据的构建是分离的.在前文的实例当中,我们是将数据发送到服务器端的一个叫做CheckAccountServlet来处理,那么请求地址和数据的构建如下:</font></p>
<p><font size="4" face="Arial">var url = CheckAccountServlet;</font></p>
<p><font size="4" face="Arial">var data = &quot;name=zhangsan&amp;password=123&quot;</font></p>
<p><font size="4" face="Arial">如果服务器端地址为/abc/cfg/CheckAccountServlet,那么这里就应该变成var url = abc/cfg/CheckAccountServlet,总之这里的地址是跟你所请求的服务器地址始终保持一致.</font></p>
<p><font size="4" face="Arial">而对于请求方式为get时,这时,地址和请求数据一起来构建成一个完成的url.示例代码如下:</font></p>
<p><font size="4" face="Arial">var url = &quot;CheckAccountServlet?name=zhangsan&amp;password=123&quot;</font></p>
<p><font size="4" face="Arial">在发送时,就将url直接以get方式发送到服务器上.</font></p>
<p><font size="4" face="Arial">1.4连接服务器</font></p>
<p><font size="4" face="Arial">就跟你操作db一样,在真正执行sql语句之前,你必须先跟db连接上.同样的,ajax要想发送数据则也需先跟服务器建立连接,建立连接代码如下</font></p>
<p><font size="4" face="Arial">http_request.open(method,url,flag);</font></p>
<p><font size="4" face="Arial">其中,method代表客户端请求方式,取值为post或者get</font></p>
<p><font size="4" face="Arial">url代表服务器地址(具体构建方式见1.3)</font></p>
<p><font size="4" face="Arial">flag取值为true或者false,如果为true表示只有和服务器建立连接成功后才执行发送数据,否则,相反(建议设置为true)</font></p>
<p><font size="4" face="Arial">1.5.发送请求数据</font></p>
<p><font size="4" face="Arial">如果请求方式为get,由于数据已经一并附加到url后面,所以,发送时直接调用http_request.send(null)即可.</font></p>
<p><font size="4" face="Arial">如果请求方式为post,则需要将按照格式构建好的数据传递给send函数,并且在调用send函数前还需加上另外一个行代码,整个代码如下:</font></p>
<p><font size="4" face="Arial">http_request.setRequestHeader(&quot;Content-Type&quot;,&quot;application/x-www-form-urlencoded&quot;);</font></p>
<p><font size="4" face="Arial">http_request.send(data);</font></p>
<font face="Arial">
<p><br />
<font size="4">至此,客户端的处理已经宣告结束.剩下的就是服务器端的处理了</font></p>
<p><font size="4">2.response-响应即服务器将响应数据发送回浏览器</font></p>
<p><font size="4">我们再来看看在response方都需要做哪些事情呢?</font></p>
<p><font size="4">2.1获取请求数据</font></p>
<p><font size="4">跟你获取表单数据一样,获取ajax提交上来的数据也是采用request.getParameter()来实现</font></p>
<p><font size="4">2.2处理请求数据</font></p>
<p><font size="4">具体的数据处理就是你的事情了(做你想做的一切事情!)</font></p>
<p><font size="4">2.3输出响应数据</font></p>
<p><font size="4">要想把响应数据输出给客户端,只能通过输出流的方式来实现.</font></p>
<p><font size="4">PrintWriter out = response.getWriter();//获取输出流</font></p>
<p><font size="4">out.println(&quot;Some message&quot;);//开始输出响应数据</font></p>
<p><font size="4">.......</font></p>
<p><font size="4">out.close();//关闭输出流</font></p>
<p><font size="4">这里,需要重点强调几点:</font></p>
<p><font size="4">2.3.1.如果输出信息中包含中文,则需要在获取输出流之前添加response.setContentType(&quot;text/html;charset=gb2312&quot;);</font></p>
<p><font size="4">2.3.2.设置让浏览器无缓存,添加response.setHeader(&quot;Cache-Control&quot;,&quot;no-cache&quot;);</font></p>
<p><font size="4">2.3.3.输出信息只允许两种形式,分别是文本信息和xml格式的字符串信息.如果是文本信息,则按照前面的方式直接输出即可.如果是xml格式的字符串信息,则需要更改2.3.1.提到的代码response.setContentType(&quot;text/html;charset=gb2312&quot;)为response.setContentType(&quot;text/xml;charset=gb2312&quot;)</font></p>
<p><font size="4">至此,服务器端的响应信息已经输出完成(但我们的路还差最后一步哦,加点油,我们马上成功啦!!!)</font></p>
<p><font size="4">2.4.客户端处理服务器返回的数据</font></p>
<p><font size="4">那么,在哪来处理服务器返回的数据呢?还记得1.2提到的doHandler函数吗?</font></p>
<p><font size="4">对了,doHandler函数就负责处理返回的数据的.来看看,它都做了哪些事情</font></p>
<p><font size="4">/*具体负责处理服务器返回数据的函数*/<br />
&nbsp;function doResponse(){<br />
&nbsp; //当服务器将数据返回给客户端时,readyState状态值为4<br />
&nbsp; <br />
&nbsp; if(http_request.readyState==4){&nbsp; <br />
&nbsp;&nbsp; //当服务器返回的数据是正常的数据时,status状态值为200<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; if(http_request.status==200){<br />
&nbsp;&nbsp;&nbsp; //通过XMLHttpRequest对象的responseText属性获取<br />
&nbsp;&nbsp;&nbsp; //服务器返回的文本信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var returnMsg = http_request.responseText;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将响应信息显示到页面上<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; showMessage(returnMsg);<br />
&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp; }<br />
&nbsp;}</font></p>
<p><font size="4">这里的函数doResponse函数就是起到doHandler的作用(说过了嘛,doHandler函数名称可以任意取的嘛,别纠着函数名不放好不好).</font></p>
<p><font size="4">关键的地方在于通过什么来获取服务器给我们返回的数据.XMLHttpRequest对象上提供两个属性供我们抉择.</font></p>
<p><font size="4">2.4.1.responseText-如果服务器端返回的是普通的文本信息的话,用它就够了.</font></p>
<p><font size="4">2.4.2.responseXML-如果服务器端返回的是xml格式的数据,则需要用它.而如果用它的话,那么就需要dom技术来解析其中的数据喽!(见下回分解)</font></p>
<p><font size="4">大功告成,一切的一切都已经OK,请问,您酒醒了吗?</font></p>
<p>&nbsp;</p>
</font><font size="4">&nbsp;</font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/82270#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 23 May 2007 18:21:00 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/82270</link>
        <guid>http://superbo8888.javaeye.com/blog/82270</guid>
      </item>
      <item>
        <title>告诉你AJAX怎么玩</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/80870" style="color:red;">http://superbo8888.javaeye.com/blog/80870</a>&nbsp;
          发表时间: 2007年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="3" face="Arial">
<p><font face="Arial">千言万语也无法详尽的描述ajax的魅力，那就先下水试试吧（临渊羡鱼，不如退而结网）</font></p>
<p><font face="Arial">下面就结合这样一个案例来体验一下，需求是：用ajax实现网站用户唯一性校验。描述如下：</font></p>
<p><font face="Arial">1.打开一个网站页面，输入用户名，点击校验按钮。</font></p>
<p><font face="Arial">2.系统收到信息后进行比较判断，如果存在，则在当前页面提示&ldquo;用户帐户信息已存在&rdquo;，否则，提示&ldquo;用户帐户可用&rdquo;。</font></p>
<p><font face="Arial">这里，客户端就要用到ajax，服务器我们用Servlet来实现。</font></p>
<p><font face="Arial">首先，设计一个html页面,命名为accountCheck.html,具体代码见附件</font><font face="Arial"><br />
其中,页面上有一个输入框,名称叫做accountNo,在输入框的旁边有一个div标签,它是做什么的呢?对了,它就是用于动态的显示我们的提示信息用的.按照web开发的原理,要想触发实践,在我们的实例中必须在按钮上加上onclick事件触发动作,而当单击事件发生后,则去执行我们的js函数checkAccount()(是不是弱智了点啊,觉得土的话,接着往下看,下面就是传说中的javascript<img src="/javascripts/fckeditor/editor/images/smiley/msn/wink_smile.gif" alt="" />)</font></p>
<p>&nbsp;</p>
<p><font face="Arial">&nbsp;<script><br />
 var http_request;<br />
 <br />
 /*按钮点击时触发checkAccount函数*/<br />
 function checkAccount(){<br />
  var account = document.getElementById("accountNo");<br />
  var serverUrl = "CheckAccountServlet";<br />
  var requestMethod = "post";<br />
  var requestData = "account="+account.value;<br />
  sendRequestByAjax(requestMethod,serverUrl,requestData,doResponse);<br />
 }<br />
 <br />
 /*具体负责处理服务器返回数据的函数*/<br />
 function doResponse(){<br />
  //当服务器将数据返回给客户端时,readyState状态值为4<br />
  <br />
  if(http_request.readyState==4){  <br />
   //当服务器返回的数据是正常的数据时,status状态值为200<br />
   <br />
   if(http_request.status==200){<br />
    //通过XMLHttpRequest对象的responseText属性获取<br />
    //服务器返回的文本信息<br />
       var returnMsg = http_request.responseText;<br />
       showMessage(returnMsg);<br />
   }<br />
   <br />
  }<br />
 }<br />
 <br />
 /*用ajax方式发送数据到url指定的服务器地址上*/<br />
 function sendRequestByAjax(method,url,data,dataHandler){<br />
  <br />
  //获取XMLHttpRequest对象<br />
  <br />
  http_request = getAjaxObject();<br />
  <br />
  //设置当服务器数据返回后,处理服务器返回数据的js函数<br />
  //这里处理函数名称是以参数形式给出<br />
  <br />
  http_request.onreadystatechange = dataHandler;<br />
  <br />
  //与指定的url地址建立连接<br />
  //第一个参数可以选择传递为Post或者Get,表示请求方式<br />
  //第二个参数表示请求的服务器地址<br />
  //第三个参数如果为true,表示只有建立连接成功后才执行后面的js代码<br />
  //如果为false,则相反<br />
  <br />
  http_request.open(method,url,true);<br />
  <br />
  //如果是以post方式发送数据,则必须加上如下代码,否则服务器将会收不到数据<br />
  //setRequestHeader("Content-Type","application/x-www-form-urlencoded");  <br />
  <br />
  if("post"==method.toLowerCase()){<br />
   http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");<br />
  }<br />
  //真正发送数据<br />
  //如果method指定是Get方式发送数据,则这里send函数参数data=null<br />
  //如果method指定是Post方式发送数据,则这里send函数参数<br />
  //具体的数据data(参数data的数据格式为:name=zhang&money=10000)<br />
  <br />
  http_request.send(data);<br />
 }<br />
 <br />
 /*<br />
 *最终目的只有一个,就是获得XMLHttpRequest对象(只有有了它以后,<br />
 *才能以ajax方式发送请求数据)<br />
 *函数内部的实现代码是为了兼容不同浏览器类型<br />
 */<br />
 function getAjaxObject(){<br />
   var xmlHttpRequest;<br />
   if(window.XMLHttpRequest){//Mozilla,IE7.0<br />
  xmlHttpRequest = new XMLHttpRequest();<br />
  if(xmlHttpRequest.overrideMimeType){<br />
   xmlHttpRequest.overrideMimeType("text/xml");<br />
  }<br />
   }else if(window.ActiveXObject){//IE<br />
  try{<br />
    xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");<br />
  }catch(e){<br />
    try{<br />
   xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");<br />
     }catch(e){}<br />
  }<br />
   }<br />
   return xmlHttpRequest;<br />
 }<br />
 <br />
 /*显示服务器返回的信息到div标记中*/<br />
 function showMessage(message){<br />
  //根据id获取div元素对象<br />
  var msgDiv = document.getElementById("msg");<br />
  //通过设置div元素的innerHTML属性来完成信息的显示<br />
  msgDiv.innerHTML = message;<br />
 }<br />
 </script></font></p>
<p><font face="Arial">够你看的了吧,慢慢看,每一个函数都有详细的注释,希望你能成为ajax高手.</font></p>
<p><font face="Arial">哦,你已经看懂了吗?如果看懂了,把如上代码copy到accountCheck.html的标签之内,至此客户端的代码已经ok.</font></p>
<p><font face="Arial">接下来,我们再来看看服务器端代码如何编写,前文已经说过,服务器端我们用Servlet来实现.具体代码如下:</font></p>
<p><font face="Arial">public void doGet(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp; throws ServletException, IOException {<br />
&nbsp; doPost(request,response);<br />
&nbsp;}</font></p>
<p><font face="Arial">&nbsp;/**<br />
&nbsp; * The doPost method of the servlet. <br />
<br />
&nbsp; *<br />
&nbsp; * This method is called when a form has its tag value method equals to post.<br />
&nbsp; * <br />
&nbsp; * @param request the request send by the client to the server<br />
&nbsp; * @param response the response send by the server to the client<br />
&nbsp; * @throws ServletException if an error occurred<br />
&nbsp; * @throws IOException if an error occurred<br />
&nbsp; */<br />
&nbsp;public void doPost(HttpServletRequest request, HttpServletResponse response)<br />
&nbsp;&nbsp; throws ServletException, IOException {<br />
&nbsp; //获取客户端请求帐户数据<br />
&nbsp; String accountNo = request.getParameter(&quot;account&quot;);<br />
&nbsp; //如果输出信息中包含中文信息,则需要设置字符集编码为gb2312<br />
&nbsp; //否则,客户端收到的信息将会是乱码<br />
&nbsp; response.setContentType(&quot;text/html;charset=gb2312&quot;);<br />
&nbsp; //设置响应报文头,使浏览器不做数据缓存<br />
&nbsp; response.setHeader(&quot;Cache-Control&quot;,&quot;no-cache&quot;);<br />
&nbsp; PrintWriter out = response.getWriter();<br />
&nbsp; if(&quot;zhangsan&quot;.equalsIgnoreCase(accountNo)){<br />
&nbsp;&nbsp; out.println(&quot;用户帐户信息已存在&quot;);<br />
&nbsp; }else{<br />
&nbsp;&nbsp; out.println(&quot;用户帐户可用&quot;);<br />
&nbsp; }<br />
&nbsp; //信息输出完成后,关闭输出流<br />
&nbsp; out.close();<br />
&nbsp;}</font></p>
<p><font face="Arial">OK,现在我们终于可以歇口气来看看我们的成果啦.我将本文的全部代码以附件的形式附上,望大家测试评判!</font></p>
<p><font face="Arial"></font>&nbsp;</p>
</font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/80870#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 23 May 2007 00:10:00 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/80870</link>
        <guid>http://superbo8888.javaeye.com/blog/80870</guid>
      </item>
      <item>
        <title>时髦的技术组合(Spring+Hibernate+Struts)</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/80543" style="color:red;">http://superbo8888.javaeye.com/blog/80543</a>&nbsp;
          发表时间: 2007年05月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="5" face="Arial">对于入门的人来说，最好的方式就是实战。</font></p>
<p><font size="5" face="Arial">废话少说，给出一个案例先</font></p>
<p><font size="5" face="Arial">需求如下：</font></p>
<p><font size="5" face="Arial">用Spring+Hibernate+Struts做一个用户登陆模块。考虑一下实现方案</font></p>
<p><font size="5" face="Arial">首先，你总得有一个供人家输入用户名/密码的页面吧，这里约束为login.jsp，登陆成功后转向一个成功页面success.jsp，登陆失败，重新转向login.jsp进行重新登陆。</font></p>
<p><font size="5" face="Arial">下一步，当用户信息提交后在哪进行收集处理呢，对于struts来说，肯定是Action莫属了，约束数据处理器LoginHandler。要严格按照分层模式来开发的话，这时，LoginHandler只需做两件事情1.数据收集并组装成数据对象User，并交给受Spring容器托管的Dao是进行数据查询比较；2.根据Dao的查询返回结果决定页面跳转</font></p>
<p><font size="5" face="Arial">接着，编写一个命名为UserDao的类（这里为什么不先定义一个接口，然后再写一个该接口的实现类？想想看，有必要那么做吗，你不就是想用这几个框架小试一把嘛，何必那么累呢）。由这样一个Dao类来实现数据库的查询验证，在这个dao里就引入了Hibernate，利用Spring提供的HibernateTemplate来实现，如果存在，则返回为true，否则，false。</font></p>
<p><font size="5" face="Arial">最后，需要做的就是配置（IOC的精神所在，一切皆配置)</font></p>
<p><font size="5" face="Arial">1.配置Spring配置文件，姑且取名叫做springConfig.xml吧</font></p>
<p><font size="5" face="Arial">2.配置Struts配置文件，默认struts-config.xml即可</font></p>
<p><font face="Arial"></font><font size="5">&nbsp;现附上代码，以供参考！</font></p>
<p><font size="5">另外，想问下视频50多M，如何放上来，好像javaeye只允许放5M的文件哦，知道的人请告知一声，本文的视频一并附上！</font></p>
<p><font size="5">想要的视频的人也可以直接留联系方式！</font></p>
<p><font face="Arial"></font><font size="5">&nbsp;</font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/80543#comments" style="color:red;">已有 <strong>6</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Fri, 18 May 2007 13:14:00 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/80543</link>
        <guid>http://superbo8888.javaeye.com/blog/80543</guid>
      </item>
      <item>
        <title>AJAX入门</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/80178" style="color:red;">http://superbo8888.javaeye.com/blog/80178</a>&nbsp;
          发表时间: 2007年05月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="5">
<p><font face="Arial">自从AJAX这个新名词诞生以来，不知有多少人为之倾倒，为之喝彩，因为它确实改变了我们传统的思维，让我们做出许许多多意想不到的效果来！如果你想作出这样的效果，Just follow me，that&rsquo; so great！</font></p>
<p><font face="Arial">何谓AJAX</font></p>
<p><font face="Arial">AJAX－Asynchronous JavaScript&nbsp; And XML即异步JavaScript和Xml，太拗口了哦！真不知道发明它的作者为何以此命名（我猜想可能ajax作者是荷兰阿贾克斯足球队的忠实球迷，因为阿贾克斯足球队的英文名正好是Ajax）。这里，我们把它简单理解成就是Javascript+xml。其核心也无非是这么两样东西罢了！他的根本作用是用于跟服务器进行异步通信（绕进去了吧，没关系，继续往下看。。。）</font></p>
<p><font face="Arial">谁在用AJAX</font></p>
<p><font face="Arial">著名的google maps（google地图），mircosoft msn spaces，bbs论坛无刷新回帖（我发现Javaeye的回帖好像也是用到了ajax）。可以说，ajax在目前的网站结构中发挥者它举足轻重的作用。那么传统的B/S结构系统和加入了Ajax以后的B/S结构系统到底有何区别，有何优势？</font></p>
<p><font face="Arial">这里，我举两个例子来说明一下他们不同：</font></p>
<p><font face="Arial">对于传统的B/S结构系统来说，客户端就象一个痴情男子，当他鼓起勇气向他心仪以久的梦中女孩发出一封热情洋溢的情书后，他开始茶不思，饭不香，觉不眠地在焦虑中等待对方的回音，直到对方给他一个明确的回复，他才继续自己该做的事情。</font></p>
<p><font face="Arial">而对于加入Ajax以后的B/S系统来说，客户端就象一个花花公子，当他向某一个Girl发出求爱信息后，他没有在傻等对方的回复，而是做他想做其他事情（悠闲的抽支雪茄，或是再向其他Girl发送求爱信息等等）</font></p>
<p><font face="Arial">对于第一种情况来说，痴情男子发出情书之后一直在等待对方的响应，表示他跟对方始终保持一种同步状态；而对于第二种情况来说，花花公子在发出求爱信息之后，他并没有处于傻等状态，而是接着做他想做的事情，表示他跟对方处于一种异步状态。这也就是ajax为什么叫做异步的缘由！！！</font></p>
<p><font face="Arial">那么ajax到底能为我们带来什么好处呢？</font></p>
<p><font face="Arial">1.动态改变页面而无刷新</font></p>
<p><font face="Arial">2.取客户端所需而不是从服务器一股脑的把全部信息接收</font></p>
<p><font face="Arial">3.节约网络带宽，由于每次只取需要的数据而不是全部</font></p>
<p><font face="Arial">4.提高响应速度（看看javaeye的回帖就知道了）</font></p>
<p><font face="Arial">5.页面效果更佳</font></p>
<p><font face="Arial">由于ajax带来的这些便利，它正在逐步改变着我们传统的观点，也正是因为它，让我们可以更好的体验网络的魅力！</font></p>
<p><font face="Arial">心急的你也许会马上想try一下ajax，别急，期待下文吧！（我不会让大家等很久的哦）<br />
</font></p>
</font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/80178#comments" style="color:red;">已有 <strong>26</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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 May 2007 23:16:00 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/80178</link>
        <guid>http://superbo8888.javaeye.com/blog/80178</guid>
      </item>
      <item>
        <title>Java程序员的365（第三天)</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/80176" style="color:red;">http://superbo8888.javaeye.com/blog/80176</a>&nbsp;
          发表时间: 2007年05月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="5">非常感谢大家的捧场，我会不断更新内容的哈<img src="/javascripts/fckeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" />！另外，我想声明一下，我的&ldquo;<font face="Arial">Java程序员的365&rdquo;是不以自然天数为限的哦，因为本人的时间有限，希望大家体谅一下哦！</font></font></p>
<p><font size="5">Java第三天</font></p>
<p><font size="5">在计算机的语言世界里，最最经典的可能就是&ldquo;Hello World－世界你好！&rdquo;喽，它的意思是让计算机向全世界人民打声招呼，以示它的降临！</font></p>
<p><font size="5">那么，如何用java语言来实现这一看似伟大的梦想呢？Just follow me，that&lsquo;s right！</font></p>
<p><font size="5">第一道工序－编辑</font></p>
<p><font size="5">要想写一个java程序来，你需要知道你怎么来写，可以肯定的告诉你，用任意一个文本编辑工具都可以做到，牛X吧！！</font></p>
<p><font size="5">ok，那我们就用最最简单记事本来完成。打开记事本，将如下代码粘贴</font></p>
<p><font size="5">class SayHello{</font></p>
<p><font size="5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args){</font></p>
<p><font size="5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;Hello World&quot;);</font></p>
<p><font size="5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="5">}</font></p>
<p><font size="5">保存在任何你想保存的地方，文件名命名成SayHello.java(记住，确保文件的后缀名为.java)，这里，我假设你保存在d:\code文件夹下。现在，我告诉你一个专业术语，文件SayHello.java就是我们的&ldquo;源代码&rdquo;简称&ldquo;源码&rdquo;！</font></p>
<p><font size="5">第二道工序－编译</font></p>
<p><font size="5">要想看到效果，想看到计算机向你说出的&ldquo;Hello World &rdquo;，对于java程序员来讲，你还需要进行编译（什么是编译，通俗一点来讲，源代码是给我们程序员看的，计算机要看的是另外一个东西，这个东西叫做字节码，怎么来呢，这就需要编译了）</font></p>
<p><font size="5">编译程序用jdk为我们提供的javac.exe文件来实现，具体编译过程如下：</font></p>
<p><font size="5">打开dos窗口，进入你的源文件所在的目录，这里就是d:\code</font></p>
<p><font size="5">输入javac SayHello.java</font></p>
<p><font size="5">如果不出意外的话，你的d:\code目录下会多出一个叫做SayHello.class的文件，这就是编译后产生的结果。</font></p>
<p><font size="5">第三道工序－运行</font></p>
<p><font size="5">激动人心的时刻即将来临，你还等什么呢，快就一个字</font></p>
<font size="5">
<p><font size="5">打开dos窗口，进入d:\code目录</font></p>
<p><font size="5">输入java SayHello</font></p>
<p>如果一切正常的话，你将看到可爱的&ldquo;Hello World&rdquo;</p>
<p>恭喜你，你已经是一个Java程序员了！</p>
<p>如果遇到问题，别沮丧，迎难而上，胜利在向你招手！</p>
<p>如果有了想撞墙的感觉，悄悄的在这里给我留个信，我们来共同解决！</p>
<p>&nbsp;</p>
</font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/80176#comments" style="color:red;">已有 <strong>10</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 15 May 2007 22:20:24 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/80176</link>
        <guid>http://superbo8888.javaeye.com/blog/80176</guid>
      </item>
      <item>
        <title>发现一个不错的ajax开发框架ext-1.0.1</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/80111" style="color:red;">http://superbo8888.javaeye.com/blog/80111</a>&nbsp;
          发表时间: 2007年05月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="4">一直想找一个比较适合的ajax框架，网上搜了n多遍，突然发现有这样一个非常不错的咚咚，现隆重推荐一下！</font><font size="4">至于它的用法和好处，我将会在后续的文章中给出，下载见附件！</font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/80111#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 15 May 2007 21:09:00 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/80111</link>
        <guid>http://superbo8888.javaeye.com/blog/80111</guid>
      </item>
      <item>
        <title>透过NBA季候赛看项目管理</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/78642" style="color:red;">http://superbo8888.javaeye.com/blog/78642</a>&nbsp;
          发表时间: 2007年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="5">爵士又赢了！！！</font></p>
<p><font size="5">看来火箭被淘汰不是偶然，因为他们碰上一个真正具备顽强斗志、充满激情的团队，这是任何一个球队都要忌惮三分的球队。</font></p>
<p><font size="5">由于我不是一个专业的篮球迷，对NBA球队的了解也仅限于报纸新闻，所以如果有不尽之言，请拍砖就是了！！！<img src="/javascripts/fckeditor/editor/images/smiley/msn/wink_smile.gif" alt="" />之前，没怎么听过爵士有什么顶级球星，至少名气各方面没有象纳什、科比、麦第那么头顶耀眼光环的Super Star，但就是这样一只球队竟然在连输两场的不利局面下最终逆转火箭，接着又将淘汰了小牛的勇士打的找不到北，以这样的气势下去，说不定今年得总冠军都是他们的了（国内的姚名迷可能又要站出放话，看，姚名所在的火箭输给了总冠军球队，正常正常<img src="/javascripts/fckeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" />）。</font></p>
<p><font size="5">但究其原因，爵士之所以能接连取得胜利得益于他们得团队协作，互补。<font face="Arial">&nbsp;一个优秀的团队就象一支精良的部队，在任何时候都是无坚不摧，战无不胜！！！这就是为什么现在国内软件企业越来越重视团队，重视团队精神而且还要强调均衡。个人更看重团队力量的均衡。举个我们软件开发的例子来聊一聊：之前曾经带团做过一个项目，当初项目的组建是这样的，美工1人，JSP程序员3人，核心代码编写2人。在项目前期，大家都很配合的挺好可谓各尽其职，我想项目成功交付十拿九稳了，可是令我意外的是，在项目中期其中一个核心成员说有事情要走人而且态度之坚决让我直冒汗（不是单单加待遇就可解决的问题），天哪，他走了他手里的活谁接管呢，我还有其他事情要搞，另外一个核心成员忙的跟鬼似的，其他人熟悉至少还得两三天的时间，当时真恨不得自己有分身之术以解燃眉之急，艾，长叹一声，我忍了，项目要紧，只有自己下水了！！！</font></font></p>
<p><font size="5">从这个项目得出得教训就是，要是当初让所有人都参与讨论、参与设计，及时汇总，均衡力量，也许一个人的出走根本就影响不了整个项目得进度，一个倒下了，另外一个又顶上来（而且可以快速上手），不至于弄得我如此之狼狈，早知今日，何必当初，悔之晚矣！</font></p>
<p><font size="5">所以，团队力量的均衡是我最看重的，我所热衷的是组建一支平民话的团队，发挥每个人的能动性以作出常人无法想象的奇迹。也许有其他大牛不认同我的观点，没关系，各抒几见而已！</font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/78642#comments" style="color:red;">已有 <strong>21</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 10 May 2007 21:32:00 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/78642</link>
        <guid>http://superbo8888.javaeye.com/blog/78642</guid>
      </item>
      <item>
        <title>Java程序员的365（第二天)</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/78422" style="color:red;">http://superbo8888.javaeye.com/blog/78422</a>&nbsp;
          发表时间: 2007年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="5"><font size="5">一觉醒来，发现天亮了，赶快来看看吧（这边风景更好）</font></font></p>
<p><font size="5"><font size="5">Java第二天</font></font></p>
<p><font size="5">要想真正的应用Java，可谓&ldquo;工欲善其事，必先利其器&rdquo;，我需要哪些东西呢？I will tell this</font></p>
<p><font size="5">1.安装软件</font></p>
<p><font size="5">这个软件叫做JDK（Java Develop Kit)即java开发包，你可能还听说过这个咚咚-JRE（Java Runtime Enviroment)即java运行环境，它跟JDK又有什么区别呢？简单一点的说：</font></p>
<p><font size="5">JDK－既支持你开发一个Java程序，也支持运行你的Java程序</font></p>
<p><font size="5">JRE－只能运行你的Java程序</font></p>
<p><font size="5">从上面的概念看来，你可以理解成JDK包含了JRE（这是一个不错的理解！）</font></p>
<p><font size="5">懂得上面的概念后，对于立志成为Java程序员的你，是不是应该安装JDK了啊！！！</font></p>
<p><font size="5">1.下载JDK软件</font></p>
<p><font size="5">Sun公司发明的Java语言，那么很明显，JDK也应该在Sun公司的网站<a href="http://www.sun.com">http://www.sun.com</a>(全部是英语哦，趁机提升一下英语哈)上有下载地址</font>&nbsp;。</p>
<p><font size="5">2.开始安装</font></p>
<p><font size="5">对于windows下用户来说，需要你做的事情就是一路next，但别点的太快，一定要记得你把jdk安装到哪去了。为了下面表述方面，我假设你把jdk安装在d:\jdk5.0(建议不要安装在系统盘符下，为什么？你问我啊，天哪！先学os吧)，我用jdk安装路径代表d:\jdk5.0。</font></p>
<p><font size="5">3.配置环境变量</font></p>
<p><font size="5">何谓环境变量，简单的来讲，就是操作系统或者某个软件的默认搜索路径。比分方，你输入cmd命令，其实它是要执行操作系统执行的一个cmd.exe文件，而操作系统怎么知道这个文件在哪，这时，OS就会安装环境变量给出的路径来搜索和查找。这里，为了以后我们的方便使用javac(编译命令）和java(运行命令),我们需要设置相应的环境变量。总共包括两个环境变量</font></p>
<p><font size="5">JAVA_HOME环境设置</font></p>
<p><font size="5">我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统环境变量-&gt;新建</font></p>
<p><font size="5">变量名：JAVA_HOME</font></p>
<p><font size="5">变量值：d:\jdk5.0(jdk的安装路径，根据自己实际情况而定)</font></p>
<p><font size="5">设置好后，一路&ldquo;确定&rdquo;</font></p>
<p><font size="5">PATH环境变量设置</font></p>
<p><font size="5"><font size="5">我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统环境变量</font></font></p>
<p><font size="5">查找看是否存在path环境变量，如果有，选中后点击&ldquo;编辑&rdquo;；如果没有，点击&ldquo;新建&rdquo;</font></p>
<p><font size="5">对于已经存在path环境变量来说，点击&ldquo;编辑&rdquo;在弹出对话框，修改变量值，添加如下代码在原有信息的最前面，记住要用分号跟原有信息分开哦</font></p>
<p><font size="5">%JAVA_HOME%\bin;</font></p>
<p><font size="5">对于没有path环境变量来说，点击&ldquo;新建&rdquo;在弹出对话框中设置如下：</font></p>
<p><font size="5">变量名：PATH</font></p>
<p><font size="5">变量值：<font size="5">%JAVA_HOME%\bin</font></font></p>
<p><font size="5">一路&ldquo;确定&rdquo;</font></p>
<p><font size="5">4.测试</font></p>
<p><font size="5">为了验证jdk是否安装成功，可以采用如下步骤来进行校验</font></p>
<p><font size="5">打开dos窗口，输入命令</font></p>
<p><font size="5">javac -version</font></p>
<p><font size="5">如果显示如下信息，则表示正常</font></p>
<p><font size="4" color="#ff0000" face="Arial">javac 1.5.0_04<br />
javac: 无源文件<br />
用法：javac &lt;选项&gt; &lt;源文件&gt;<br />
其中，可能的选项包括：<br />
&nbsp; -g&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成所有调试信息</font></p>
<p><font size="4" color="#ff0000">。。。。。。</font></p>
<p><font size="5">如果显示如下信息，则表示安装或配置有问题</font></p>
<p><font size="4" color="#ff0000" face="Arial">'javac' 不是内部或外部命令，也不是可运行的程序<br />
或批处理文件。</font></p>
<p><font size="4">如果需要帮助，请将信息反馈给我，我会尽力帮你解决一切烦恼（失恋者勿扰！<img src="/javascripts/fckeditor/editor/images/smiley/msn/wink_smile.gif" alt="" />）</font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/78422#comments" style="color:red;">已有 <strong>9</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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>Thu, 10 May 2007 15:44:00 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/78422</link>
        <guid>http://superbo8888.javaeye.com/blog/78422</guid>
      </item>
      <item>
        <title>Java程序员的365（第一天)</title>
        <author>superbo8888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://superbo8888.javaeye.com">superbo8888</a>&nbsp;
          链接：<a href="http://superbo8888.javaeye.com/blog/78351" style="color:red;">http://superbo8888.javaeye.com/blog/78351</a>&nbsp;
          发表时间: 2007年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="5">不管你是接触Java也好，还是未接触Java也好，在这里你都会得到你想要得！！！This is my dream！！！</font></p>
<p><font size="5">Java第一天</font></p>
<p><font size="5">1.何谓Java？</font></p>
<p><font size="5">Java是一种计算机语言，说的通俗点就是用这样的一个东西帮你来驱使一台庞大的计算机，让它为你干活，为你服务。如果你学过C、C++也许对计算机语言这个字眼可能并不陌生，但对于一个刚接触计算机的人来说，可能就不那么容易了，因为思维还没扭转过来，但别急，请跟着慢慢来！<img src="/javascripts/fckeditor/editor/images/smiley/msn/tounge_smile.gif" alt="" /></font></p>
<p><font size="5">2.Java有何用？</font></p>
<p><font size="5">利用Java，我们可以开发出n多好玩的东西。比分说可以制作手机游戏，桌面游戏（泡泡糖、坦克大战etc)，企业办公软件（OA，Office Automation即办公自动化)，电子商务网站（淘宝、易趣），大型企业级应用程序（EAI，Enterprise Appliction Integration即企业应用集成，就是企业跟企业之间进行系统通信如银行系统跟航空公司售票系统集成以实现电子客票，银行系统和移动运营商系统集成以实现代缴费）。可以说，Java无处不在，无所不能！</font></p>
<p><font size="5">3.谁都在用Java？</font></p>
<p><font size="5">&ldquo;地球人都在用&rdquo;<img src="/javascripts/fckeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" />，由于Java特有的一些优势导致了现代企业都在尝试或者已经走上了Java开发之路，由于Java的大行其道，也导致了软件大王Mircosoft都不得不跟随它而发明了C#(据说C#就是C++的一个变种，你如果把那两个加号拼在一起不就是一个#号嘛)。也正是因为这样，做Java程序员可能会让你今后的路更广、更长！</font></p>
<p><font size="5">4.我该怎么用Java？</font></p>
<p><font size="5">想学吗？想用吗？请闭上眼，睡一觉醒来后等待我的第二篇吧！<img src="/javascripts/fckeditor/editor/images/smiley/msn/wink_smile.gif" alt="" /></font></p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://superbo8888.javaeye.com/blog/78351#comments" style="color:red;">已有 <strong>5</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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, 09 May 2007 23:12:07 +0800</pubDate>
        <link>http://superbo8888.javaeye.com/blog/78351</link>
        <guid>http://superbo8888.javaeye.com/blog/78351</guid>
      </item>
  </channel>
</rss>