<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>tacone</title>
    <description>ioc+aop+ajax</description>
    <link>http://tacone.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 Web Flow 2  发布了</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/193690" style="color:red;">http://tacone.javaeye.com/blog/193690</a>&nbsp;
          发表时间: 2008年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>在Spring的官方主页上公布Spring Web Flow 2发布的消息</strong><br />参见http://www.springframework.org/go-webflow2<br />四大特点值得关注：<br />（1）一级支持JSF<br />（2）一级支持AJAX<br />（3）为流转状态切换提供高级controller engine <br />（4）提供domain-specific-language 以定义调用流程的可重用控制器模块
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/193690#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, 16 May 2008 15:19:44 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/193690</link>
        <guid>http://tacone.javaeye.com/blog/193690</guid>
      </item>
      <item>
        <title>这是愚人节的童话吗——“SpringSourceAnnouncesAcquisitionbyM$”</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/178744" style="color:red;">http://tacone.javaeye.com/blog/178744</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.infoq.com/news/2008/04/microsoft-springsource-purchase" target="_blank">http://www.infoq.com/news/2008/04/microsoft-springsource-purchase</a><br />上竟然这样报道：SpringSource Announces Acquisition by Microsoft<br />而且里面有这么一段：<br />Mark Pollack, founder and lead of the Spring.Net project, added: <br />Anders Hejlsberg, Erik Meijer and I have had some excellent conversations around where Spring.Net can improve the development process for .Net applications, and we expect to add many of the existing Spring APIs in the .Net Framework 4.0 release. The AOP and Aspect namespaces will likely be added to the System namespace, and the DAO and Data namespaces will augment the existing ADO.Net APIs. <br /><br />这太不可能了！！！<br />   如果真这样，GUICE的机会也许来了，肯定有不少JAVAERS从SPRING转到GUICE
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/178744#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:28:09 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/178744</link>
        <guid>http://tacone.javaeye.com/blog/178744</guid>
      </item>
      <item>
        <title>Jason Rudolph 关于Groovy的新教程：Grails + EJB  Step by Step (增加关系)</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/117558" style="color:red;">http://tacone.javaeye.com/blog/117558</a>&nbsp;
          发表时间: 2007年08月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本文转引自http://www.infoq.com/cn/articles/grails-ejb-tutorial<br />作者 Jason Rudolph 译者 胡键 <br />这是grails很好的一个入门教程，对比JAVA应用可以省略大量的代码<br />下面是最关键的关系管理部分<br /><br /><br />步骤5 —— 增加关系管理 <br />关于关系管理，我们对应用有哪些期望？嗯，要我说，我们应该能…… <br /><br />查看分配给某个员工的所有计算机。 <br />查看单个计算机的细节（包括它的分配状况）。 <br />能增加、修改和删除计算机（包括它的分配状况）。 <br />准备好了吗？让我们开始吧。 <br /><br />在员工页列出计算机没有什么意义，因此让我们把这列移除。打开grails-app/views/employeeBean/list.gsp，并移除该列。现在，刷新浏览器，验证修改。 <br />【附件1】<br /> <br />接下来，点击显示（Show），查看员工的细节。 <br /><br /> 【附件2】<br />最少，我们需要整理显示每个计算机的文本。但是，可能我们根本就不愿直接在这个页面上看到计算机。与其在该页显示计算机，不如包含一个指向该员工的计算机列表的链接。 <br /><br />打开该页模板（即，grails-app/views/employeeBean/show.gsp），移除显示当前员工计算机列表的行。接着增加以下行，链接到显示该员工的计算机列表的单独页面。 <br /><pre name="code" class="java">
&lt;tr class="prop">    
    &lt;td colspan="2" align="left" class="name">
       &lt;g:link controller='computerBean' action='showComputersByEmployee'	           id='${employeeBean.id}' >Show Computers&lt;/g:link>   
&lt;/td>&lt;/tr>
</pre><br />此处，我们使用了Grails标签库。link标签将产生指向ComputerBeanController的链接，并调用一个我们需要定义的新动作，showComputersByEmployee。该链接还包含了所请求员工的ID。 <br /><br />让我们刷新浏览器，看看变化。 <br /><br /> <br />很好，我们得到链接了。现在，我们需要为链接定义一个新动作。在编辑器中打开grailsapp/controllers/ComputerBeanController.groovy，因为新动作将通过员工查找计算机，我们首先需要增加引用EmployeeBean类的import语句。 <br /><br />import com.jasonrudolph.ejb3example.entity.EmployeeBean<br />接着，我们增加新动作。 <br /><pre name="code" class="java">
def showComputersByEmployee = {
    render(view:'list', model:[ computerBeanList:
	ComputerBean.findAllByEmployeeBean(EmployeeBean.get(params.id)) ])
}
</pre><br />这个动作让我们好好见识了一下Groovy（和Grails）的能力，通过简单的几行代码，你的表现力究竟有多大。在以上几行代码中，我们告诉Grails，任何showComputersByEmployee的调用应该...... <br /><br />使用params.id从request中获得员工 <br />使用EmployeeBean#get方法获得员工ID对应的员工 <br />使用ComputerBean#findAllByEmployeeBean方法找出与员工相关的所有计算机 <br />将结果放入名为computerBeanList的对象 <br />展现（render）视图，在一个名为list的模板中，使用computerBeanList对象作为模型。 <br />记得曾在EmployeeBean中定义get方法，以及ComputerBean中定义findAllByEmployeeBean方法吗？没有？答对了。这些方法只是Grails为你的领域对象所提供的众多动态方法的一小部分而已。之后，我们将更多的探讨这些条目。现在，我们准备点击显示计算机链接了。 <br /><br /> <br />我们越来越接近完工了。我们仍然需要修改Employee Bean列中的文本。我们需要在此显示些更让人明白点儿的东西。 <br /><br />同样，我们可能更愿意标出这些计算机所属的员工。我们当前重用了list模板（作为ComputerBean的脚手架代码的一部分产生），而那个模板最初是为了列出所有计算机而设计的。另一方面，我们总能定义一个单独的模板，它用于显示计算机的子集，或能使list模板更动态一些以支持两个场景。就现在而言，我们将去掉这个特性，将其作为“有则更好”，而非必要的特性。 <br /><br />我们应该完成了管理员工所需的所有改变。现在，我们只需整理计算机管理的特性。 <br /><br />既然我们就在这儿，让我们整理一下计算机list模板。替换Employee Bean列的当前文本，改为显示员工的网络ID。打开grails-app/views/computerBean/list.gsp。找到在展现Employee Bean列文本的Groovy脚本…… ${it.employeeBean}<br />……将它改为显示员工的网络ID。 <br /><br />${it.employeeBean.networkId}<br />刷新浏览器，让我们看看它的样子。（Employee列在Brand列和Model列之间显得有些不合适，所以我调换了一下它们的位置。不愿这样做也可以。） <br /><br /> <br />list模板完成了，现在该show模板了。 <br /><br />点击显示（Show）链接，并访问我们需要改变的页面。 <br /><br /> <br />看起来，我们只需改变员工链接的文本就行了。对此，我们完全赞同。那么，打开grailsapp/views/computerBean/show.gsp，并找到展现当前链接文本的那段脚本。 <br /><br />${computerBean?.employeeBean}<br />就象我们为list模板所做的那样，改变代码以显示员工的网络ID。 <br /><br />${computerBean?.employeeBean.networkId}<br />让我们再次刷新浏览器，并验证我们的改变。（同样，Employee行在Brand行和Model行之间显得有些不合适。因此，只要觉得合适，你可以随意重新调整这些行。） <br /><br /> <br />让我们转到编辑（edit）功能。 <br /><br /> <br />我们着手查看这儿的一个主题。我们需要改变选择框，以提供一组网络ID的列表。在grails-app/views/computerBean/edit.gsp中找到&lt;g:select>标签，把它修理成以下内容： <br /><pre name="code" class="java">
&lt;g:select optionKey="id"    
          from="${com.jasonrudolph.ejb3example.entity.EmployeeBean.list()}" 
          name='employeeId'
          optionValue='networkId'
          value='${computerBean.employeeBean?.id}'>&lt;/g:select>
</pre><br />通过给标签增加optionValue参数，选择框中的文本会更具有含义。 <br /><br /> <br />现在，视图被修正了，但是更新（update）功能还需要除了视图之外的一点努力。我们同样需要增强控制器（即ComputerBeanController.groovy）。如果用户改变关联了计算机的员工，我们需要确保正确地持久化这些关联的变化。换句话说，我们需要从当前的员工去除关联，而将它分配给新的员工。这个增强型的更新方法需要一点额外的代码行。 <br /><pre name="code" class="java">
def update = {
    def computerBean = ComputerBean.get( params.id )
    if(computerBean) {
           if (computerBean.employeeBean) {
               computerBean.employeeBean.computers.remove(computerBean)
           }
           computerBean.properties = params
           def employeeBean = EmployeeBean.get(params.employeeId)
           employeeBean.computers.add(computerBean)
           computerBean.employeeBean = employeeBean
           if(computerBean.save()) {
                  redirect(action:show,id:computerBean.id)
           }
           else {
                  render(view:'edit',model:[computerBean:computerBean])
           }
    }
    else {
           flash.message = "ComputerBean not found with id ${params.id}"
           redirect(action:edit,id:params.id)
    }
}
</pre><br />保存你的改变，我们准备试验它了。让我们改变这台计算机的品牌——现在是联想（Lenovo）了——并将它重新分配给John Doe。 <br /><br /> <br />当然，我们也需要能够给我们的库存增加新的计算机。因此，让我们点击新建计算机（New ComputerBean）。 <br /><br /> <br />我们经过上次更改编辑（Edit）页之后，我们已具有很好的资格来整理这一页。我们需要对选择框做些相同的调整。打开grails-app/views/computerBean/create.gsp，调整&lt;g:select>标签，并刷新你的浏览器。 <br /><pre name="code" class="java">
&lt;g:select optionKey="id"
    from="${com.jasonrudolph.ejb3example.entity.EmployeeBean.list()}"
    name='employeeId'    optionValue='networkId'
    value='${computerBean.employeeBean?.id}'>&lt;/g:select>
</pre> <br />正如我们看到的编辑（edit）功能，我们需要对控制器进行轻微的增强。当我们创建新计算机时，我们需要在保存它之前分配给一个员工。编辑ComputerBeanController.groovy，以包含这个被更新的保存（save）方法。 <br /><pre name="code" class="java">
def save = {
    def computerBean = new ComputerBean()
    computerBean.properties = params
    def employeeBean = EmployeeBean.get(params.employeeId)
    employeeBean.computers.add(computerBean)
    computerBean.employeeBean = employeeBean
    if(computerBean.save()) {
           redirect(action:show,id:computerBean.id)
    }
    else {
           render(view:'create',model:[computerBean:computerBean])
    }
}</pre><br />回到浏览器，我们准备创建一个新计算机了。填写空的域，并创建。 <br /><br /> <br />现在，Jane有一台崭新的膝上电脑了。 <br /><br />7. 最后，只剩下删除（delete）功能了。这次我们不需要改变任何模板。我们只需要给控制器增加一行。当我们在ComputerBeanController.groovy中删除一台计算机时，我们同样需要移除对应的计算机与员工的关联。以下的第四行代码负责这些。 <br /><pre name="code" class="java">
def delete = {
    def computerBean = ComputerBean.get( params.id )
    if(computerBean) {
           computerBean.employeeBean.getComputers().remove(computerBean)
           computerBean.delete()
           flash.message = "ComputerBean ${params.id} deleted."
           redirect(action:list)
    }
    else {
           flash.message = "ComputerBean not found with id ${params.id}"
           redirect(action:list)
    }
}</pre><br />看起来Jane的新MacBook被回收了。我们应该删除它吗？ <br /><br /> <br />此时，我们完成它了！使用快捷的几步，我们现在已经有了一个功能完备的Web应用，它构建于我们的实体Bean上。当然，它还需一些打磨。但至少，作为一个可工作的原型，它已经足够了。尽管仍需改良，但它是个完全能发展成完美产品的一个原型。
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/117558#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, 28 Aug 2007 15:22:35 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/117558</link>
        <guid>http://tacone.javaeye.com/blog/117558</guid>
      </item>
      <item>
        <title>Jason Rudolph 关于Groovy的新教程：Grails + EJB  Step by Step  （步骤4）</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/117537" style="color:red;">http://tacone.javaeye.com/blog/117537</a>&nbsp;
          发表时间: 2007年08月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本文转引自http://www.infoq.com/cn/articles/grails-ejb-tutorial<br />作者 Jason Rudolph 译者 胡键 <br />这是grails很好的一个入门教程，对比JAVA应用可以省略大量的代码<br />下面是第四部分，框架代码<br /><br />步骤4 —— 产生脚手架代码 <br />现在，我们准备真正开始蓄势待发了。我们至今为止所做的大多数事情并没有被免去。（不论你的框架是多么的聪明，你总得告诉它在哪儿找到数据库。）然而，为用户界面构造一个好的、功能性的起点不再是手工活儿了。 <br /><br />确保你在工程的根目录下——在我们的例子中，它是ejb3_grails。然后，输入grails generate-controller。当询问领域类名时，输入我们第一个实体Bean的全限定类名——com.jasonrudolph.ejb3example.entity.EmployeeBean.。<br /><pre name="code" class="java">
 jMac:~/dev/ejb3_grails jason$ grails generate-controller  
... 
input-domain-class:
     [input] Enter domain class name:
 com.jasonrudolph.ejb3example.entity.EmployeeBean 
... 
[java] Generating controller for domain class
 [com.jasonrudolph.ejb3example.entity.EmployeeBean]      
[java] Controller generated at ./grails- app/controllers/EmployeeBeanController.groovy  
BUILD SUCCESSFUL Total time: 10 seconds 
</pre><br />既然有了控制器（controller），让我们产生相应的视图（view）。输入grails generate-views。当询问领域类名时，输入com.jasonrudolph.ejb3example.entity.EmployeeBean。 <br /><pre name="code" class="java">
jMac:~/dev/ejb3_grails jason$ grails generate-views 
... 
input-domain-class:
     [input] Enter domain class name:  com.jasonrudolph.ejb3example.entity.EmployeeBean 
... 
[java] Generating views for domain class [com.jasonrudolph.ejb3example.entity.EmployeeBean]      
[java] Generating list view for domain class [com.jasonrudolph.ejb3example.entity.EmployeeBean]      
[java] list view generated at /Users/jason/dev/ejb3_grails/./grails- app/views/employeeBean/list.gsp      
[java] Generating show view for domain class [com.jasonrudolph.ejb3example.entity.EmployeeBean]      
[java] Show view generated at /Users/jason/dev/ejb3_grails/./grails- app/views/employeeBean/show.gsp      
[java] Generating edit view for domain class [com.jasonrudolph.ejb3example.entity.EmployeeBean]      
[java] Edit view generated at /Users/jason/dev/ejb3_grails/./grails- app/views/employeeBean/edit.gsp      
[java] Generating create view for domain class [com.jasonrudolph.ejb3example.entity.EmployeeBean]      
[java] Create view generated at /Users/jason/dev/ejb3_grails/./grails- app/views/employeeBean/create.gsp  
BUILD SUCCESSFUL Total time: 11 seconds 
</pre><br /><br />对其他实体Bean（即com.jasonrudolph.ejb3example.entity.ComputerBean），重复以上过程，以产生相应的控制器和视图。 <br /><br />现在，让我们运行应用，看看通过以上那么丁点儿努力，我们得到了什么。输入grails run-app。打开浏览器，进入http://localhost:8080/ejb3_grails/。 <br />【见附件一】<br /> <br />很好，我们现在已有了两个控制器。并且，正如这儿的文字所建议的，我们最终会使用我们自己自定义的首页面替换它。至于现在，让我们转到EmployeeBeanController。 <br />【见附件二】<br /> <br />这儿，我们看到了大多数想要的东西。显然Computers这一列需要进行些调整，然而在别的方面，这页只需作一些装饰性的修改就可以用了。 <br /><br />让我们花些时间参观一下这个应用，看看我们现在得到了什么。试试创建新员工、编辑员工，接下来（如果你觉得特别有权势）终结某个可怜虫。对于计算机管理，试试类似的特性。在体验过程中，记下你想改变以及需要修改的地方。同时，一定要考虑那些已经满足了你需要的东西。它们是你“不劳而获”的内容！ <br /><br />...... <br /><br />完工了？很好，以下是一张我们所需东西的清单，然后我们可以谈谈那些“有则更好”（nice-to-have）的条目。 <br /><br />关系管理——很明显，脚手架在这个领域做了尝试，但还是不满足我们的需要。幸运的是，这非常容易修补（瞧瞧，即使是Ruby on Rails脚手架也没有给你免费的关系管理。） <br />验证——它只是被遗漏了。非常简单。我们也可以很快地添加它。 <br />就是它了。如果我们能实现正确的关系管理和验证，我们将获得一个功能齐全的Web应用来管理我们的实体Bean。在这之后，其余的就是小菜一碟。（尽管我们确定要在结束之前尝尝一些可口的小菜。）
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/117537#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, 28 Aug 2007 14:37:59 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/117537</link>
        <guid>http://tacone.javaeye.com/blog/117537</guid>
      </item>
      <item>
        <title>Jason Rudolph 关于Groovy的新教程：Grails + EJB  Step by Step 导入实体</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/117530" style="color:red;">http://tacone.javaeye.com/blog/117530</a>&nbsp;
          发表时间: 2007年08月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本文转引自http://www.infoq.com/cn/articles/grails-ejb-tutorial<br />作者 Jason Rudolph 译者 胡键 <br />这是grails很好的一个入门教程，对比JAVA应用可以省略大量的代码<br /><br />下面操作的第三步：<br /><strong>步骤3 —— 导入实体Bean </strong><br />Grails预装了HSQLDB，但因为我们使用的是MySQL，我们需要一些快捷的步骤，来告诉Grails如何与我们的数据库进行交流。首先，从http://www.mysql.com/products/connector/j/下载MySQL的Java驱动。我选择的是当前可用于产品阶段的产品，在本文撰写的时候，它的版本是3.1.13。 <br />打开zip文件，将其中的mysql-connector-java-3.1.13-bin.jar解压到你的Grails应用的lib目录——本例中，是ejb3_grails/lib。（注意：JAR文件确切的名字会跟据你下载驱动的版本不同而变化）。 <br />现在，我们准备告诉Grails在哪儿找到我们的数据库。用你喜爱的编辑器打开ApplicationDataSource.groovy，按以下内容修改。你可以在ejb3_grails/grails-app/conf/中找到这个文件。（注意：你需要改变用户名和口令以适应你MySQL帐号。） <br /><pre name="code" class="java">
import 
org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsAnnotationConfiguration
class ApplicationDataSource {
   def configClass = GrailsAnnotationConfiguration.class
   boolean pooling = true
   //String dbCreate = "create-drop"
   // one of 'create', 'create-drop','update'
   String url = "jdbc:mysql://localhost/ejb3example"
   String driverClassName = "com.mysql.jdbc.Driver"
   String username = "ejb3example"
   String password = "ejb3example"
}
</pre><br />除了指明链接设置，我们还需要定义configClass成员，以允许Grails支持在实体Bean中使用标注。 <br /><br />最后，我们需要给dbCreate设置加上注释。这个设置允许Grails在运行时使用你的领域对象同步更新数据库模式。尽管它是个强大的选项，但是在这个例子中我们并不需要。通过把这个设置注释掉，我们指示Grails保持模式的原样。 <br /><br />接下来，我们需要将实体Bean——EmployeeBean和ComputerBean——复制到我们的Grails工程。Grails会在src/java目录中查找Java类。请确保创建与这些类的包相匹配的、完整的目录结构。 <br /><br /><pre name="code" class="java">jMac:~/dev/ejb3_grails/src/java/com/jasonrudolph/ejb3example/entity jason$ lsComputerBean.java       EmployeeBean.java
</pre><br />在很长时间内，你将需要确保这些文件与这些类的正式副本保持同步（它们在你的JEE工程源码树中）。使用构建脚本，你可以很容易地做到这点。即，在构建时，将这些文件从JEE工程中复制到Grails工程中。 <br /><br />Grails允许我们与任何Java类工作，但是我们需要让Grails给予这些特殊的Java类（也就是我们的实体Bean）特别的对待。我们要让Grails将这些类认为是我们的领域类，并提供Grails领域类所拥有的ORM和动态方法的全部好处。要做到这些，我们需要在应用的hibernate目录增加如下的hibernate.cfg.xml文件，注册这些类。<br /><pre name="code" class="java">
&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!DOCTYPE 
   hibernate-configuration
   PUBLIC	
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
&lt;hibernate-configuration>
    &lt;session-factory>
      &lt;mapping package="com.jasonrudolph.ejb3example.entity" />
      &lt;mapping class="com.jasonrudolph.ejb3example.entity.EmployeeBean" />
      &lt;mapping class="com.jasonrudolph.ejb3example.entity.ComputerBean" />
    &lt;/session-factory>
&lt;/hibernate-configuration>
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/117530#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, 28 Aug 2007 14:18:54 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/117530</link>
        <guid>http://tacone.javaeye.com/blog/117530</guid>
      </item>
      <item>
        <title>Jason Rudolph 关于Groovy的新教程：Grails + EJB  Step by Step  （Hel）</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/117525" style="color:red;">http://tacone.javaeye.com/blog/117525</a>&nbsp;
          发表时间: 2007年08月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本文转引自http://www.infoq.com/cn/articles/grails-ejb-tutorial<br />作者 Jason Rudolph 译者 胡键 <br />这是grails很好的一个入门教程，对比JAVA应用可以省略大量的代码<br />下面是前两步<br /><br />步骤1 —— 安装Grails <br />因为EJB3依赖JDK 5，所以你需要确保JDK 5已经安装，并将你的JAVA_HOME环境变量指向JDK 5的安装目录。 <br /><br />按照这些快速步骤，在你的系统上安装Grails。（本文使用Grails 0.2.1，它是撰写文章时的最新稳定发布。译注：当前的版本是0.5.6。）（如果你在使用*nix系统，如遇安装问题，请检查这个线索。） <br /><br />步骤2 —— “Hello Grails!” <br />在命令提示符下，进入你想创建Grails应用的目录。然后输入grails create-app。当询问应用名时，输入ejb3_grails。<br /><pre name="code" class="java">
jMac:~/dev jason$ grails create-app
...
create-app:    [input] Enter application name:
ejb3_grails
...
BUILD SUCCESSFULTotal time: 4 seconds
</pre><br />为了验证环境正确，启动应用。进入刚刚创建的应用目录，然后输入grails run-app启动应用。 jMac:~/dev jason$ cd ejb3_grails jMac:~/dev/ejb3_grails jason$ grails run-app ... run-app:watch-context: <br />现在，应用正等待我们的请求。打开浏览器，输入http://localhost:8080/ejb3_grails/，你应该看到以下欢迎你进入Grails的友好信息。  （见附件）
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/117525#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, 28 Aug 2007 14:08:06 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/117525</link>
        <guid>http://tacone.javaeye.com/blog/117525</guid>
      </item>
      <item>
        <title>Jason Rudolph 关于Groovy的新教程：Grails + EJB  Step by Step  （前言）</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/117518" style="color:red;">http://tacone.javaeye.com/blog/117518</a>&nbsp;
          发表时间: 2007年08月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本文转引自http://www.infoq.com/cn/articles/grails-ejb-tutorial<br />作者 Jason Rudolph 译者 胡键 <br />这是grails很好的一个入门教程，对比JAVA应用可以省略大量的代码（下面是前言部分，转引者略有改动）<br />前言<br />Ruby on Rails不断地受到软件工程世界的关注，但企业依旧对其表示怀疑。为什么会这样？我们怀疑：“构建于脚本语言之上的框架，怎能适合我的企业应用？！”针对Ruby on Rails，典型的论调就是缺少对企业服务（如分布式事务、消息传递等）的支持。对很多企业而言，如果平台没有这些服务，那么它将不可能被考虑。 <br /><br />Grails旨在解决那些关注点，并证明快速应用开发（RAD）对企业是可行的。Grails建构于Groovy之上，提供了与Java的无缝集成。它能直接访问你的业务所依赖的那些企业服务，同时为你的工具集增添强大的动态语言结构。 <br /><br />作为展示它企业集成能力的令人印象深刻的一个例子，Grails可让你快速而简单的基于已有EJB3实体Bean构建一个Web应用。但是，它的能力并不是仅此而已。Grails大幅增强了你的实体Bean的能力，而且这些完全是动态做到的，没有更改任何你的EJB源码。Grails对象关系映射（GORM）建立在Hibernate3（最终将提供对Java持久化API的支持）之上，利用Groovy的元对象协议（MOP）为你的不同静态实体Bean增加了各种方便的动态方法。这些方法不仅能从Grails和Groovy访问，而且你的Java代码同样能访问它们！我们瞬间就拥有了JEE/EJB3的企业级能力和RAD Web应用开发的全部好处！ <br /><br />那么，让我们看看基于EJB3实体Bean构建Grails应用要做哪些工作。在以下步骤中，我们将创建一个新的Grails应用，将实体Bean导入到应用，为实体Bean产生快速构建缺省Web界面的脚手架代码（scaffolding），然后再探索Grails为实体Bean增加的一些方便的动态方法。 <br /><br />首先，我们需要从一个EJB3应用开始。（Grails并不需要你以一个EJB3应用作为起点。但是，本文的一般性假设是你有兴趣将RAD Web开发并入你的EJB3项目。）假设我们有一些EJB3实体Bean，它们代表一个公司里的员工（EmployeeBean）和分配给员工的计算机（ComputerBean）。（如果遇到任何问题，请参见资源小节。你将在那儿找到该Grails应用的完整源代码——一个使用这些实体Bean的简单JEE应用——以及其它有用的东西。） <br />【附件一为类结构图】<br /><br /> <br />以下是支持我们实体Bean的两张表。（例子中，我们将使用MySQL 5.0。你可以使用这个脚本创建一个名为ejb3example的新数据库，它同时将生成这些表。） <br /> 【附件二为表脚本】<br />构建与这些数据交互的Web用户界面，并和已有代码集成要花多长时间呢？它这不应该花费太多的时间，但是，我们肯定已经接受了这样的观点，即这个过程需要重大的努力。使用Grails，无需如此。 <br />下面是POJO代码<br /><pre name="code" class="java">package com.jasonrudolph.ejb3example.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "employees")
public class EmployeeBean implements Serializable {

	/** The primary key for this employee. */
	private int id;

	/** The network ID (i.e., user ID) for this employee. */
	private String networkId;

	/** The first name for this employee. */
	private String firstName;

	/** The last name for this employee. */
	private String lastName;

	/** The date on which this employee began his/her employment. */
	private Date startDate;

	/** The collection of computers assigned to this employee. */
	private Collection&lt;ComputerBean> computers = new ArrayList();

	public EmployeeBean() {
	}

	public EmployeeBean(String networkId, String firstName, String lastName,
			Date startDate) {
		this.networkId = networkId;
		this.firstName = firstName;
		this.lastName = lastName;
		this.startDate = startDate;
	}

	/**
	 * @return the system-generated primary key for this employee
	 */
	@Id
	@GeneratedValue
	public int getId() {
		return this.id;
	}

	/**
	 * Sets the primary key for this employee. Only the EJB container should
	 * invoke this method.
	 *
	 * @param id
	 *            the primary key for this employee
	 */
	public void setId(int id) {
		this.id = id;
	}

	@Column(name = "network_id")
	public String getNetworkId() {
		return this.networkId;
	}

	public void setNetworkId(String networkId) {
		this.networkId = networkId;
	}

	@Column(name = "first_name")
	public String getFirstName() {
		return this.firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	@Column(name = "last_name")
	public String getLastName() {
		return this.lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	@Column(name = "start_date")
	public Date getStartDate() {
		return startDate;
	}

	public void setStartDate(Date startDate) {
		this.startDate = startDate;
	}

	/**
	 * @return the collection of computers assigned to this employee
	 */
	@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, mappedBy = "employeeBean")
	public Collection&lt;ComputerBean> getComputers() {
		return this.computers;
	}

	/**
	 * Sets the collection of computers assigned to this employee.
	 *
	 * @param computers
	 *            the collection of computers assigned to this employee
	 */
	public void setComputers(Collection&lt;ComputerBean> computers) {
		this.computers = computers;
	}
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/117518#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, 28 Aug 2007 13:58:44 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/117518</link>
        <guid>http://tacone.javaeye.com/blog/117518</guid>
      </item>
      <item>
        <title>学习和应用extjs Developing with Extjs - tricks and tips. (4) </title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/113515" style="color:red;">http://tacone.javaeye.com/blog/113515</a>&nbsp;
          发表时间: 2007年08月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          来源http://www.akbkhome.com/blog.php/View/137/Developing_with_Extjs__tricks_and_tips.html <br /><strong>更有效的组合框</strong><br />function myCombo() {<br />	this.Store =  new Ext.data.Store({<br />            proxy: new Ext.data.HttpProxy({<br />                   url: baseURL + '/MyLister.js'<br />                    }),<br />            reader: new Ext.data.JsonReader({<br />                root: 'data',<br />                totalProperty: 'totalCount',<br />                id: 'id'<br />            }, [ 'id', 'fullname' ])        });<br />        }<br />    this.Store.load();<br />    config.store =  this.Store;<br />    myCombo.superclass.constructor.call(this, config);<br />}<br />Ext.extend(FlexyCash.AccountCombo, Ext.form.ComboBox, {<br />    mode: 'local',    .....});<br />这里是用json访问远程数据，其改进的关键点在于mode设置成：'local'，如此一来，只要激活<br />combo.store.load() 方法就能刷新数据了
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/113515#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>Fri, 17 Aug 2007 15:13:15 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/113515</link>
        <guid>http://tacone.javaeye.com/blog/113515</guid>
      </item>
      <item>
        <title>学习和应用extjs Developing with Extjs - tricks and tips. (3) </title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/113510" style="color:red;">http://tacone.javaeye.com/blog/113510</a>&nbsp;
          发表时间: 2007年08月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          来源http://www.akbkhome.com/blog.php/View/137/Developing_with_Extjs__tricks_and_tips.html <br /><strong>表单</strong><br /> var ar = form.getValues();<br />这个方法能取到表单中各域的值，但问题是这些键/值都经过编码了，需要增加解码才好处理<br />相应的方法则是：<br />Ext.form.Form.prototype.getValuesRaw = function() {<br />    var ar = this.getValues();<br />    var ret = {};<br />    for(var i in ar) {<br />              ret[decodeURIComponent(i)] = decodeURIComponent(ar[i]);<br />    }<br />    return ret;<br />};
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/113510#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, 17 Aug 2007 15:00:26 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/113510</link>
        <guid>http://tacone.javaeye.com/blog/113510</guid>
      </item>
      <item>
        <title>学习和应用extjs  Developing with Extjs - tricks and tips.  (2)</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/113504" style="color:red;">http://tacone.javaeye.com/blog/113504</a>&nbsp;
          发表时间: 2007年08月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          来源http://www.akbkhome.com/blog.php/View/137/Developing_with_Extjs__tricks_and_tips.html <br /><strong>接触Extjs's XMLHttpRequest 调用</strong><br />Extjs's XMLHttpRequest 可以取代传统德XMLHttp来调用远程服务<br />例如：<br />dialog.el.mask("Saving...");<br />var con = new Ext.data.Connection();<br />con.request({<br />    url: baseURL + "/mypage.txt", // where to post to..<br />    params: params, // &lt;&lt; key value object with data to send<br />    method: 'POST', <br />    callback: function(opts, success, response)  {<br />        dialog.el.unmask(true); // unmask the dialog.<br />	    if (!success || ("OK" != response.responseText)) {<br />             Ext.MessageBox.alert("Error", success ?<br />                                  response.responseText  :<br />          	                "Error saving data - try again");<br />             return;<br />        }<br />        dialog.hide();        <br />        // code to update stuff that's affected by the saved form working..     <br />        // goes here...<br />    }<br />});
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/113504#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>Fri, 17 Aug 2007 14:44:46 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/113504</link>
        <guid>http://tacone.javaeye.com/blog/113504</guid>
      </item>
      <item>
        <title>学习和应用extjs  Developing with Extjs - tricks and tips.  (1)</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/113486" style="color:red;">http://tacone.javaeye.com/blog/113486</a>&nbsp;
          发表时间: 2007年08月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          来源http://www.akbkhome.com/blog.php/View/137/Developing_with_Extjs__tricks_and_tips.html<br /><strong>定义对象：</strong><br />下面是定义对象简单方式：<br />aaa = {  <br />   ccc: "test",<br />   bbb : function() { <br />      alert(this.cc);<br />  }<br />}<br />aaa.bbb();<br /><br />定义对象私有变量可以这样：<br />aaa = (function () {<br />    var myprivate;<br />    return {<br />    	setIt: function(val) {<br />               myprivate = val;<br />         }<br />         getIt: function() { <br />             return myprivate;<br />         }    <br />    }<br />})();<br /><br />用Ext.extend来扩展对象<br />function MyCombo (config) {	<br />// set up your datasource here..<br />     MyCombo.superclass.constructor.call(this,config);<br />}<br />Ext.extend(MyCombo, Ext.form.ComboBox, {<br />    displayField:'title',<br />    typeAhead: true,<br />    loadingText: 'Searching...',<br />    forceSelection: true,<br />    allowBlank: false,<br />    width: 160,<br />    minChars: 1, <br />    pageSize:10,<br />    hideTrigger:true,<br />    displayField: 'FullName',<br />    valueField: 'id'<br />}
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/113486#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>Fri, 17 Aug 2007 13:57:46 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/113486</link>
        <guid>http://tacone.javaeye.com/blog/113486</guid>
      </item>
      <item>
        <title>好雨知时节</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/104498" style="color:red;">http://tacone.javaeye.com/blog/104498</a>&nbsp;
          发表时间: 2007年07月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp; 开头得一场雨和结尾得一场雨让本次<font face="Arial">&nbsp;欧洲大奖赛变得非常好看，而开头马萨超阿隆索，结束阿隆索超马萨也是一报还一报。法拉利可算是痛失好局：莱科宁的退赛，甚至马萨被超车所暴露的都是一个问题&mdash;&mdash;可靠性。</font></p>
<p>&ldquo;马萨：干地无懈可击 雨胎导致震颤 </p>
<p>　　第二名让我的嘴里感觉有点苦。直到最后下雨之前我在比赛中都表现得相当强大，一换上雨胎我就觉得<span class="yqlink"> <a href="http://www.iask.com/n?k=%C8%FC%B3%B5" title="赛车" class="akey" onclick="activateYQinl(this);return false;" target="_blank">赛车</a></span>出现颤动，赛车失去了平衡。但是在此之前我的表现真的非常强。</p>
<p>　　干地条件下我可以逐渐甩开阿隆索，因为赛车确实非常棒。发车后我比较幸运，在那样异常的天气条件下我仍然留在了赛道上。但是在比赛尾声我不是很走运。但是这就是赛车，我必须接受这个结果。积极的一面是我在积分榜上缩小了劣势。赛季还很长，我们必须保持信心。我与阿隆索的对话？当时我有些急，不过后来他道歉了，结果就是这样。</p>
<p>&rdquo;－－－（sina）</p>
<p>&ldquo;莱科宁：非常失望 但不失斗志 </p>
<p>　　我非常失望。我的位置很好，在马萨和阿隆索身后时赛车的速度飞快，当时我确信自己可以赢。但是逐渐的，赛车的液压系统出现故障，我开始变慢，然后停了下来。这次打击决不会让我失去斗志。今年还有七场比赛，我与领先者之间的积分差距意味着一切都可能发生。我们有一辆非常有<span class="yqlink"> <a href="http://www.iask.com/n?k=%BE%BA%D5%F9%C1%A6" title="竞争力" class="akey" onclick="activateYQinl(this);return false;" target="_blank">竞争力</a></span>的赛车，但是它显然还需要提高可靠性。</p>
<p>&rdquo;－－－（sina）</p>
<p>&ldquo;托德：可靠性问题再次摆到眼前 </p>
<p>　　我认为欧洲大奖赛的结果不应该被描述为失望。我们有一辆非常有竞争力的赛车，发车线上我们处在第一和第三位。但是我们只带回8个积分，感谢菲利佩的亚军。</p>
<p>　　比赛是在不断变化的天气条件下进行的。干，湿，干，最后又下雨了。菲利佩更应该获胜，但是最后时刻赛道被浇湿导致他失去了胜利。遗憾的是他的赛车换上雨胎后出现了震颤。我们对基米的赛车出现液压问题而退赛感到非常失望。我们必须找出原因，但是可靠性的问题再一次被摆到眼前。今年还有七场比赛，路还很长，一切都可能发生。</p>
<p>&rdquo;－－－（sina）</p>
<p>当然也得为汉米尔顿未取得积分感到遗憾，真希望他能拿今年的年度冠军</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/104498#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 23 Jul 2007 18:35:24 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/104498</link>
        <guid>http://tacone.javaeye.com/blog/104498</guid>
      </item>
      <item>
        <title>请大家来讨论下“会使软件开发误入歧途的10大错误”</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/100081" style="color:red;">http://tacone.javaeye.com/blog/100081</a>&nbsp;
          发表时间: 2007年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在http://blog.csdn.net/turingbook/archive/2007/07/09/1683376.aspx文中谈到著名的IT市场研究公司Forrester近日发布了一份报告，列出了会使软件开发误入歧途的10大错误，这些错误包括：<br />    <br /><br /> 1对项目的成功没有全心全意投入。Never committing to project success. <br /> 2在充分理解项目之前就定死进度和预算。Freezing the schedule and budget before a project is sufficiently understood. <br /> 3过分扩大某个解决方案的适用范围。Overscoping a solution. <br /> 4没有雇用专业的应用开发公司。Circumventing the application development organization altogether.（【按】此条翻译不够自信，请大家指教。） <br /> 5对问题的复杂性估计不足。Underestimating the complexity of a problem. <br /> 6缺乏领域专家，而专家的参与也不够。Being stingy with subject-matter experts, in which their participation is not sufficient.（【按】此条翻译不够自信，请大家指教。） <br /> 7项目的领导班子选择不当。Choosing the wrong project leadership. <br /> 8用人又疑。对已经委以任务的管理人员不信任。Distrusting managers who have had tasks delegated to them. <br /> 9未经足够研究，就进入开发阶段。Jumping into development without enough research. <br /> 10报喜不报忧，沟通不足。Suppressing bad news, in which dialogue is insufficient.<br /><br />  在我现在效力的公司中，就存在类似的问题，比较突出的有：2在充分理解项目之前就定死进度和预算/3过分扩大某个解决方案的适用范围/5对问题的复杂性估计不足/9未经足够研究，就进入开发阶段<br />  不知大家对此有什么感想，不妨多讨论讨论
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/100081#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, 11 Jul 2007 11:15:40 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/100081</link>
        <guid>http://tacone.javaeye.com/blog/100081</guid>
      </item>
      <item>
        <title>莱科宁的反击</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/99483" style="color:red;">http://tacone.javaeye.com/blog/99483</a>&nbsp;
          发表时间: 2007年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">莱科宁终于发奋了，连夺法国大奖赛、英国大奖赛两站冠军，一下子让车手竞争变得很有味道了。</font></p>
<p>速度上去了，也许稳定性是后面比赛中法拉利需要解决的大问题，加油啊法拉利！</p>
<p>虽然是法拉利的车迷，但还是希望汉密尔顿取得年度冠军</p>
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/99483#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 09 Jul 2007 18:55:06 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/99483</link>
        <guid>http://tacone.javaeye.com/blog/99483</guid>
      </item>
      <item>
        <title>汉密尔顿和安全车都很抢眼</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/89208" style="color:red;">http://tacone.javaeye.com/blog/89208</a>&nbsp;
          发表时间: 2007年06月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今年的加拿大站，安全车频频出击是一大两点，当然另一大亮点无疑是汉密尔顿夺标</p>
<p>汉密尔顿很稳定，其实早在马来西亚站他就应该夺冠了，可惜被车队压制</p>
<p>阿隆索和汉密尔顿都很稳定，这正是马萨、莱科宁所欠缺的，前四站法拉利赛车好于麦凯仑积分都落后，今年看来前景不妙啊</p>
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/89208#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 11 Jun 2007 18:01:33 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/89208</link>
        <guid>http://tacone.javaeye.com/blog/89208</guid>
      </item>
      <item>
        <title>测试驱动式的多团队并行迭代开发策略</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/89184" style="color:red;">http://tacone.javaeye.com/blog/89184</a>&nbsp;
          发表时间: 2007年06月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp; 这个题目有些拗口</p>
<p>&nbsp;&nbsp;&nbsp; 现在带着开发部地人员进行开发工作，所谓制众如制寡－－：）虽然没多少人，但开发模式及策略是很重要的，&ldquo;<font face="Arial">测试驱动式的多团队并行迭代开发策略</font>&rdquo;算是一点体会吧</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><font size="3"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">无论是</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">RUP</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还是</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">XP</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，都是迭代开发模式，迭代开发是基于面向对象技术开发的必然要求，从中国众多软件公司的现状来看，以测试驱动</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">XP</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发模式是结合实际的，</span><span lang="EN-US" style="COLOR: black"><font face="Times New Roman">XP</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比较适合中小型团队开发，而中国众多软件公司目前只能组织中小型开发团队，测试驱动是保证高质量软件产品的有效手段。</span><span lang="EN-US" style="COLOR: black"><o:p></o:p></span></font></p>
<p><span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: &quot;Times New Roman&quot;; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">测试驱动的迭代开发策略成功的首要保证是制定正确而切实的迭代策略，其次是组建有战斗力的开发测试团队，但最根本的是严谨的工作态度和有利于迭代开发的工作环境。</span></p>
<p><span style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"><span style="COLOR: black; FONT-FAMILY: 宋体">统一管理的多团队并发是一种有效的迭代模式，经过合理地组织协调，这种模式即便于干系人较及时地看到阶段性成果，又有利于团队安心地进行开发，也有利于于及时地开展测试工作。例如，平均迭代周期是三个月，但对于干系人特别是领导，往往会觉得周期太长，老看不见结果，于是产生急躁情绪，从而破坏团队开发气氛，不利于高质量地完成任务；但通过多团队地合理组配及切实地迭代安排，可以做到一个月或一个半月会有一个团队拿出一个可测试或可见地阶段性成果，别的团队可以安安心心地做工作，而干系人会觉得不断的有成果出现，开发工作在稳步向前推进，不会产生急躁情绪破坏开发气氛。<span lang="EN-US"><o:p></o:p></span></span></p>
<p><span lang="EN-US" style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-ansi-language: EN-US; mso-bidi-language: AR-SA"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>一般而言双团队和三团队地方式比较利于沟通和管理。</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/89184#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>Mon, 11 Jun 2007 16:54:29 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/89184</link>
        <guid>http://tacone.javaeye.com/blog/89184</guid>
      </item>
      <item>
        <title>用生命为股市洗盘，黄菊同志值得股市尊敬</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/89080" style="color:red;">http://tacone.javaeye.com/blog/89080</a>&nbsp;
          发表时间: 2007年06月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">出于对老市长辞世的哀悼，上海股市做了一个接近千点的回调，这既是自然的事也是应该的事。但好像仅仅两鞠躬草率了点，似乎应该再回调一下做第三次鞠躬，这样才算厚道。<br />
&nbsp;&nbsp;&nbsp; 在管理层诸多调控措施收效不理想的情况下，黄菊同志用生命为股市洗了一次盘，值得管理层尊敬，也值得市场怀恋。<br />
&nbsp;&nbsp;&nbsp; 不知道还有人为中国股市数浪没有，从过年到现在股市都一直走得这么强，不像是第五浪的样子，所以得考问考问：这次回调算不算第四浪，或者是第四浪的A浪？也许深强沪弱是牛市尾声的信号吧<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font>
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/89080#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>Mon, 11 Jun 2007 09:49:13 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/89080</link>
        <guid>http://tacone.javaeye.com/blog/89080</guid>
      </item>
      <item>
        <title>用Spring将Shark集成到你的应用中</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/89074" style="color:red;">http://tacone.javaeye.com/blog/89074</a>&nbsp;
          发表时间: 2007年06月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><font size="3"><span lang="EN-US"><font face="Times New Roman">Shark</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是个写得不错的工作流引擎，自然对一般的项目就可以考虑把</span><span lang="EN-US"><font face="Times New Roman">Shark</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">集成到自己的应用当中，现在大多数应用都使用</span><span lang="EN-US"><font face="Times New Roman">Spring</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架，而</span><span lang="EN-US"><font face="Times New Roman">Shark</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">并没有明确地支持</span><span lang="EN-US"><font face="Times New Roman">Spring</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，因此用必要采取一些措施，用</span><span lang="EN-US"><font face="Times New Roman">Spring</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将</span><span lang="EN-US"><font face="Times New Roman">Shark</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">集成到你的应用中。</span></font></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">让我们先看看下面几个重要类。</font></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">SharkInterface</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-font-kerning: 0pt">:</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">正如其注释中所说的，</span></font><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">SharkInterface</span><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是基于</span><span lang="EN-US"><font face="Times New Roman">Shark</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的工作流应用中访问引擎的最顶级的接口，它有</span></font><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">Shark</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">和</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">SharkEngineManager</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">两个实现类；</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">Shark</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">：</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 25.5pt"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">Shark</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">是</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">SharkInterface</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">的一个实现类，其主要功用在于加入配置信息并创建</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">SharkEngineManager</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">实例；</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">SharkEngineManager</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">：</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><font size="3" face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">SharkEngineManager</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">是</span><font size="3"><span lang="EN-US"><font face="Times New Roman">Shark</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用中十分重要的一个类，可以算是核心类之一，它除了装载</span></font><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">配置信息并初始化外，最重要的职能是封装了各种管理器和功能执行实例，诸如</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">CallbackUtilities</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">ObjectFactory</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">ToolActivityHandler</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">XMLInterface</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">AssignmentManager</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">CacheMgr</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">PersistentManagerInterface</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: #0000c0; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">eventAuditManagers</span><span style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">LoggingManager</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-font-kerning: 0pt"> RepositoryPersistenceManager </span><span style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-font-kerning: 0pt"> ScriptingManager </span><span style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-font-kerning: 0pt">SecurityManager</span><span style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-font-kerning: 0pt"> ToolAgentManager </span><span style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-font-kerning: 0pt">TxSynchronizationFactory </span><span style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">、</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-font-kerning: 0pt"> WfEngineInteroperability</span><span style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">等。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #0000c0; FONT-FAMILY: &quot;Courier New&quot;; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Shark</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的这种结构即提供了一种可扩展性，又为实现</span><span lang="EN-US"><font face="Times New Roman">IoC</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方式的应用集成提供了方便。</span></font></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">显而易见，要想用</span><span lang="EN-US"><font face="Times New Roman">Spring</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将</span><span lang="EN-US"><font face="Times New Roman">Shark</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">集成到你的应用中，最直接的方法是在</span><span lang="EN-US"><font face="Times New Roman">Spring</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的配置文件中配置</span></font><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">SharkInterface</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">接口，用</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">Shark</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">作实现类，并配置执行静态方法：</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: blue; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: blue; mso-font-kerning: 0pt">configure(File configFile)</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">即可；当然你也可以写自己的接口和实现类来创建提供</span><span lang="EN-US" style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: &quot;Courier New&quot;; mso-highlight: silver; mso-font-kerning: 0pt">SharkEngineManager</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Courier New'; mso-hansi-font-family: 'Courier New'; mso-font-kerning: 0pt; mso-bidi-font-family: 'Courier New'">实例。笔者是采用后一种方法的。</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></font></font></span><span lang="EN-US"><font size="3"><font face="Times New Roman">&nbsp;<o:p></o:p></font></font></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/89074#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>Mon, 11 Jun 2007 09:30:05 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/89074</link>
        <guid>http://tacone.javaeye.com/blog/89074</guid>
      </item>
      <item>
        <title>Webwork中REST方式的action</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/88184" style="color:red;">http://tacone.javaeye.com/blog/88184</a>&nbsp;
          发表时间: 2007年06月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>com.opensymphony.webwork.dispatcher.mapper.RestfulActionMapper.java中这段注释可能有帮助,用来表示<font face="Arial">REST方式的action</font></p>
<p>&nbsp;/** * A custom action mapper using the following format: * </p>
<p>* </p>
<p>* </p>
<ul><tt>http://HOST/ACTION_NAME/PARAM_NAME1/PARAM_VALUE1/PARAM_NAME2/PARAM_VALUE2</tt></ul>
    *
    <p>* You can have as many parameters you'd like to use. Alternatively the URL can be shortened to the following: * </p>
    <p>* </p>
    <ul><tt>http://HOST/ACTION_NAME/PARAM_VALUE1/PARAM_NAME2/PARAM_VALUE2</tt></ul>
        *
        <p>* This is the same as: * </p>
        <p>* </p>
        <ul><tt>http://HOST/ACTION_NAME/ACTION_NAME + &quot;Id&quot;/PARAM_VALUE1/PARAM_NAME2/PARAM_VALUE2</tt></ul>
            *
            <p>* Suppose for example we would like to display some articles by id at using the following URL sheme: * </p>
            <p>* </p>
            <ul><tt>http://HOST/article/Id</tt></ul>
                *
                <p>* </p>
                <p>* Your action just needs a setArticleId() method, and requests such as /article/1, /article/2, etc will all map * to that URL pattern. * </p>
                <p>* <strong>Note: The RestfulActionMapper is not supported if you use the (deprecated) ServletDispatcher!</strong> * * @author <a href="mailto:cameron@datacodex.net">Cameron Braid</a> * @author <a href="mailto:jerome.bernard@xtremejava.com">Jerome Bernard</a> * @author Patrick Lightbody */ </p>
                <p>也就是说action也是资源</p>
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/88184#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, 08 Jun 2007 16:49:34 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/88184</link>
        <guid>http://tacone.javaeye.com/blog/88184</guid>
      </item>
      <item>
        <title>Web应用:  静态缓存VS动态缓存</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/88181" style="color:red;">http://tacone.javaeye.com/blog/88181</a>&nbsp;
          发表时间: 2007年06月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>这几年来,一直用java开发中大型的web应用,其中web服务器一段的<font face="Arial">缓存对系统性能和稳定性有相当重大影响,看到<font face="Arial"><a href="http://ajax.cnrui.cn/article/52/55/2006/20061116932.shtml">http://ajax.cnrui.cn/article/52/55/2006/20061116932.shtml</a>&nbsp; 上的文章也颇有同感,不妨将人家的观点在这里转述转述:</font></font></p>
<ul>
    <li>静态缓存： 即所说的html,shtml文件。静态缓存不用占用负载（服务器的内存），但需要占用服务器的空间（因为生成很多文件），最重要的，是因为生成了静态的缓存，而不利于维护，因为当你设计一个系统的时候，你必须考虑到用这个的后果，应该就像设计模式中所说的，有的模式是灵活的，而有的模式是一开始布署的时候就不变了的。</li>
    <li>动态缓存：即所说的把缓存存于服务器的内存中，需要时调用。服务器负载量够大，无需考虑内存这里问题，那么你可以较多的使用动态的cache.</li>
</ul>
<p>作为权宜之计,采用Proxy的技术来设计，通过代码获得静态cache是否可用，如果可用的话，如果不可用（这里所说的不可用，即是cache不存在，或者已经改动过cache了），则重新生成输出，否则的话，直接输出。</p>
<p>文中的这段小注释很值得重视:&quot;通常Search Engine的robot在收录的网站的过程中。会一直在爬你的网站，因此，做一个流量访问的系统还是很有必要的，记得cnblog（博客园）的dodo在检测中发现yahoo的robot每分钟爬的次数是google的几倍，这对你的网站速度是某个方面是有影响的，有的时候还很大&quot;</p>
<p>爬虫也会影响性能的!!!</p>
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/88181#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>Fri, 08 Jun 2007 16:43:36 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/88181</link>
        <guid>http://tacone.javaeye.com/blog/88181</guid>
      </item>
      <item>
        <title>写写自己的BLOG</title>
        <author>tacone</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tacone.javaeye.com">tacone</a>&nbsp;
          链接：<a href="http://tacone.javaeye.com/blog/87349" style="color:red;">http://tacone.javaeye.com/blog/87349</a>&nbsp;
          发表时间: 2007年06月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">近来为公司开发多引擎的分布式工作流套件，学习</span><font face="Times New Roman"> <span lang="EN-US">SHARK</span></font><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US"><font face="Times New Roman">OFBIZ</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是不可避免的，就零零星星写点自己的心得体会吧，错谬之处还望大家斧正</span></font></p>
          <br/>
          <span style="color:red;">
            <a href="http://tacone.javaeye.com/blog/87349#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, 06 Jun 2007 12:56:32 +0800</pubDate>
        <link>http://tacone.javaeye.com/blog/87349</link>
        <guid>http://tacone.javaeye.com/blog/87349</guid>
      </item>
  </channel>
</rss>