<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Java笨狗(做不了第一，那就做唯一.任何傻瓜都会编写计算机能理解的代码。好的程序员能够编写人能够理解的代码)</title>
    <description>我只是只爱编程的笨狗。本人没有什么的优点,不过唯一自豪的是还算敢做敢当,要不高中的时候也不会把现在相处10年的老婆带回家住,本人唯一的遗憾是没有成为世界首富,不过没关系,小孩现在是我最大的财富(执子之手,与子偕老！老婆这是我最想说但却没在你面前说出口的话)！ 

</description>
    <link>http://openmouse.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>grails and tinymce</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/198737" style="color:red;">http://openmouse.javaeye.com/blog/198737</a>&nbsp;
          发表时间: 2008年05月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近弄了个grails tinymce下的代码高亮插件：</p>
<p>界面图：</p>
<p><img src="../../upload/picture/pic/15265/2b9dd1bf-7f67-3678-b244-575cf16f8478.bmp" height="395" alt="" width="549" />
</p>
<p>对话框：</p>
<p><img src="../../upload/picture/pic/15271/35779f50-aaf6-37c0-84ff-d5aad7650af2.bmp" alt="" />
</p>
<p>渲染代码：</p>
<p><img src="../../upload/picture/pic/15269/88c9e5fa-e1b6-3dc8-8a04-92848014edcb.bmp" alt="" />
</p>
<p>对文本的处理：</p>
<p><img src="../../upload/picture/pic/15273/290936be-30bd-34a6-b7e0-d20ac550df8d.bmp" alt="" />
</p>
<p>输入文本：</p>
<p><img src="../../upload/picture/pic/15267/c2084551-2a30-3caf-b11e-204ad3c25471.bmp" alt="" />
</p>
<p>当然这个可能存在很多问题，不过如果大家有这个需要，可以联系我，打包给大家，让大家一起来完善。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/198737#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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, 30 May 2008 16:44:13 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/198737</link>
        <guid>http://openmouse.javaeye.com/blog/198737</guid>
      </item>
      <item>
        <title>用dreamweaver CS3打开gsp文件</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/191528" style="color:red;">http://openmouse.javaeye.com/blog/191528</a>&nbsp;
          发表时间: 2008年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>网上已经有<a href="http://www.cnblogs.com/jackyrong/archive/2008/02/24/1079520.html" id="AjaxHolder_ctl01_TitleUrl">用dreamweaver 8打开gsp文件</a>
。那么这里我就介绍下用dreamweaver CS3打开gsp文件</p>
<p>基本原理还是一样的，只是修改的文件的位置不同：</p>
<p>
1 打开dw CS3安装时的目录<br />
&nbsp;&nbsp;\Documents and Settings\username\Application Data\Adobe\Dreamweaver 8\Configuration,<br />
在其中的extenstion.txt文件中的第一行，有很多文件后缀的，加入gsp<br />
在最后一行，加入<br />
gsp:grails文件。<br />
&nbsp; 这样以后dw8里，打开的设置里，可以选出gsp的文件来打开<br />
2 打开DW CS3安装路径\Adobe\Adobe Dreamweaver CS3\configuration\DocumentTypes\MMDocumentTypes.xml这个文件<br />
找到&quot;jsp&quot;，加入gsp,如下<br />
<span style="font-family: Verdana;">&lt;documenttype id=&quot;JSP&quot; servermodel=&quot;JSP&quot;
internaltype=&quot;Dynamic&quot; winfileextension=&quot;jsp,jst,gsp&quot;
macfileextension=&quot;jsp,jst&quot; file=&quot;Default.jsp&quot;
writebyteordermark=&quot;false&quot;&gt;</span>
<br />
这样打开gsp文件后，就可以切换到设计状态了，不用再是只看到代码状态的view了</p>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/191528#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 May 2008 17:47:02 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/191528</link>
        <guid>http://openmouse.javaeye.com/blog/191528</guid>
      </item>
      <item>
        <title>Grails中文文档beta发布</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/191224" style="color:red;">http://openmouse.javaeye.com/blog/191224</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>经过我们大家的努力Grails中文文档终于面试了</p>
<p>下载抵制</p>
<p>beta版的url： <span class="nobr"><a href="http://www.chinagroovy.org/grails-doc/index.html" title="Visit page outside Confluence" rel="nofollow">http://www.chinagroovy.org/grails-doc/index.html<sup><img class="rendericon" src="http://wiki.redsaga.com/confluence/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
 ,beta 版下载: <span class="nobr"><a href="http://wiki.redsaga.com/confluence/download/attachments/2458/grails-doc-1.0-beta1.tar.gz" title="Visit page outside Confluence" rel="nofollow">http://wiki.redsaga.com/confluence/download/attachments/2458/grails-doc-1.0-beta1.tar.gz<sup><img class="rendericon" src="http://wiki.redsaga.com/confluence/images/icons/linkext7.gif" border="0" height="7" align="absmiddle" alt="" width="7" />
</sup>
</a>
</span>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/191224#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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, 08 May 2008 21:32:52 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/191224</link>
        <guid>http://openmouse.javaeye.com/blog/191224</guid>
      </item>
      <item>
        <title>Java笨狗groovy学习笔记—Regular Expressions</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/189413" style="color:red;">http://openmouse.javaeye.com/blog/189413</a>&nbsp;
          发表时间: 2008年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>正則表達式就像一把瑞士軍刀。</p>
<pre name="code" class="java">&quot;potatoe&quot; ==~ /potatoe/</pre>
<p>&nbsp;假如你在groovyConsole運行它，將返回true.這裡有兩件需要注意的事情：</p>
<p>1.==~操作符。它類似于==操作符，但是用於匹配模式而不是計算相等性。</p>
<p>2.正則表達式包含在 '/'中.它會告訴Groovy這是個正則表達式而不是String.</p>
<pre name="code" class="java">&quot;potatoe&quot; ==~ /potatoe?/

&quot;potato&quot; ==~ /potatoe?/
</pre>
<p>&nbsp;這裡?表達的意思是'e'是可選的。</p>
<pre name="code" class="java">&quot;motato&quot; ==~ /potatoe?/</pre>
<p>沒有可匹配的。</p>
<p>現在讓我來看些複雜的，我們定義一個方法用來測試正則表達式：</p>
<pre name="code" class="java">def checkSpelling(spellingAttempt, spellingRegularExpression)
{
if (spellingAttempt ==~ spellingRegularExpression)
{
println(&quot;Congratulations, you spelled it correctly.&quot;)
} else {
println(&quot;Sorry, try again.&quot;)
}
}
theRegularExpression = /Wisniewski/
checkSpelling(&quot;Wisniewski&quot;, theRegularExpression)
checkSpelling(&quot;Wisnewski&quot;, theRegularExpression)</pre>
&nbsp;
<p>這裡有兩件事情需要注意：</p>
<p>1.我們定義了函數</p>
<pre name="code" class="java">def checkSpelling(spellingAttempt, spellingRegularExpression)
</pre>
<p>函數是一個類似于閉包的代碼集合。函數通常擁有名字，然而閉包可以是匿名的，一旦我們定義了函數，我們就可以在以後重複使用。</p>
<p>在函數中的if語句中，我們判斷 spellingAttempt 參數時候匹配正則表達式通過使用==~操作符</p>
<p>&nbsp;</p>
<pre name="code" class="java">theRegularExpression = /Wis[abcd]niewski/ // requires one of 'a', 'b', 'c' or 'd'
theRegularExpression = /Wis[abcd]?niewski/ // will allow one of 'a', 'b', 'c' or 'd', but not
required (like above)
theRegularExpression = /Wis[a-zA-Z]niewski/ // requires one of any upper\- or lower-case letter
theRegularExpression = /Wis[^abcd]niewski/ // requires one of any character that is '''not''' 'a',
'b', 'c' or 'd'</pre>
<p>&nbsp;這裡使用了 *[ ]*.用來分組字符</p>
<pre name="code" class="java">theRegularExpression = /Wis[abcd]niewski/ // requires one of 'a', 'b', 'c' or 'd'</pre>
<p>需要'a', 'b', 'c' , 'd'其中的一個。</p>
<pre name="code" class="java">theRegularExpression = /Wis[abcd]?niewski/ // will allow one of 'a', 'b', 'c' or 'd', but not
required (like above)</pre>
<p>需要'a', 'b', 'c' , 'd'其中的一個，但不是必須的，因為在[ ]後面跟隨了一個?</p>
<pre name="code" class="java">theRegularExpression = /Wis[a-zA-Z]niewski/ // requires one of any upper\- or lower-case letter</pre>
<p>需要一個任意的大寫或小寫字符。</p>
<pre name="code" class="java">theRegularExpression = /Wis[^abcd]niewski/ // requires one of any character that is '''not''' 'a',
'b', 'c' or 'd'</pre>
<p>任何一個不是''a', 'b', 'c' , 'd'</p>
<p>更多的正則表達式操作符可以去參考官方文檔。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/189413#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 May 2008 16:45:43 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/189413</link>
        <guid>http://openmouse.javaeye.com/blog/189413</guid>
      </item>
      <item>
        <title>Java笨狗groovy学习笔记—Getting Started</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/189321" style="color:red;">http://openmouse.javaeye.com/blog/189321</a>&nbsp;
          发表时间: 2008年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>(-)变量<br />

你可以给变量赋值. 像下面:</p>
<pre name="code" class="java">x = 1
println x
x = new java.util.Date()
println x
x = -3.1499392
println x
x = false
println x
x = &quot;Hi&quot;
println x</pre>
<p>&nbsp;(二)Lists and Maps</p>
<p>Groovy已经内置支持两种重要的数据类型， lists 和maps（(Lists就像java中的数组一样来操作)）Lists用来存储有序集合数据，例如：</p>
<pre name="code" class="java">myList = [1776, -1, 33, 99, 0, 928734928763]</pre>
<p>&nbsp;你可以使用[]来存取给定的项（索引开始位置为0）：</p>
<pre name="code" class="java">println myList[0]</pre>
<p>&nbsp;输出结果：</p>
<p>1776</p>
<p>你也可以使用size方法来等到 list 长度：</p>
<pre name="code" class="java">println myList.size()</pre>
<p>&nbsp; 输出结果：</p>
<p>6</p>
<p>但是通常你并不需要List的长度，因为不像Java,循环遍历一个List中的所有元素的首选方法是each(),详细信息在本学习笔记的&quot;Code as Data&quot;章节。</p>
<p>另一个本地数据结构叫 map,map用来存储&rdquo;关联数组&ldquo;或&rdquo;词典&ldquo;，即无序非均匀的集合，命名数据。例如，我们存储名字的IQ分数：</p>
<pre name="code" class="java">scores = [ &quot;Brett&quot;:100, &quot;Pete&quot;:&quot;Did not finish&quot;, &quot;Andrew&quot;:86.87934 ]</pre>
<p>&nbsp;注意，每个存储在map中的值都是不同的类型， Brett'是 integer，Pete是string, Andrew是floating 。</p>
<p>我们可以使用两种方法来访问map中的值：</p>
<pre name="code" class="java">println scores[&quot;Pete&quot;]
println scores.Pete</pre>
<p>&nbsp;输出结果：</p>
<p>Did not finish<br />
Did not finish</p>
<p>为map添加数据，语法与给list添加值类似，例如：</p>
<pre name="code" class="java">scores[&quot;Pete&quot;] = 3</pre>
<p>&nbsp;随后取得其值：</p>
<pre name="code" class="java">println scores[&quot;Pete&quot;]</pre>
<p>&nbsp;输出结果：</p>
<p>&nbsp;3.</p>
<p>另外，你可以像下面这样创建空map和list:</p>
<pre name="code" class="java">emptyMap = [:](Map)
emptyList = [](List)</pre>
&nbsp;
<p>为了确定它们为空，可以像下列这样：</p>
<pre name="code" class="java">println emptyMap.size()
println emptyList.size()</pre>
<p>&nbsp;输出结果为0。</p>
<p>（三）Conditional Execution</p>
<p>任何一种语言的重要特性是在不同的条件下执行不懂的代码，简单的方法是使用&quot;if&quot;:</p>
<pre name="code" class="java">amPM = Calendar.getInstance().get(Calendar.AM_PM)
if (amPM == Calendar.AM)
{
println(&quot;Good morning&quot;)
} else {
println(&quot;Good evening&quot;)
}</pre>
&nbsp;
<p>上面的结果是:首先，他会判断（）中表达式，随后依据结果是否为&quot;true&quot;或&quot;false&quot;来执行第一个或第2个代码块。注意&quot;else&quot;代码块不是必须的：</p>
<pre name="code" class="java">amPM = Calendar.getInstance().get(Calendar.AM_PM)
if (amPM == Calendar.AM)
{
println(&quot;Have another cup of coffee.&quot;)
}</pre>
&nbsp;
<p>（四）Boolean Expressions</p>
<p>在很多编程语言中这个是很特别的数据类型，它用来表示真实值，&rdquo;true&ldquo;或&quot;false&quot;.Boolean就像其他数据类型一样可以储存在一个变量中：</p>
<pre name="code" class="java">myBooleanVariable = true</pre>
<p>&nbsp;更多Boolean表达式操作符:</p>
<pre name="code" class="java">* ==
* !=
* &gt;
* &gt;=
* &lt;
* &lt;=</pre>
<p>&nbsp;他们相当直观：</p>
<pre name="code" class="java">titanicBoxOffice = 1234600000
titanicDirector = &quot;James Cameron&quot;
trueLiesBoxOffice = 219000000
trueLiesDirector = &quot;James Cameron&quot;
returnOfTheKingBoxOffice = 752200000
returnOfTheKingDirector = &quot;Peter Jackson&quot;
theTwoTowersBoxOffice = 581200000
theTwoTowersDirector = &quot;PeterJackson&quot;
titanicBoxOffice &gt; returnOfTheKingBoxOffice  // evaluates to true
titanicBoxOffice &gt;= returnOfTheKingBoxOffice // evaluates to true
titanicBoxOffice &gt;= titanicBoxOffice         // evaulates to true
titanicBoxOffice &gt; titanicBoxOffice          // evaulates to false
titanicBoxOffice + trueLiesBoxOffice &lt; returnOfTheKingBoxOffice + theTwoTowersBoxOffice  //
evaluates to false
titanicDirector &gt; returnOfTheKingDirector    // evaluates to false, because &quot;J&quot; is before &quot;P&quot;
titanicDirector &lt; returnOfTheKingDirector    // evaluates to true
titanicDirector &gt;= &quot;James Cameron&quot;           // evaluates to true
titanicDirector == &quot;James Cameron&quot;           // evaluates to true</pre>
&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/189321#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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 May 2008 14:09:29 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/189321</link>
        <guid>http://openmouse.javaeye.com/blog/189321</guid>
      </item>
      <item>
        <title>关于使用IDEA开发Grails项目乱码的问题</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/181068" style="color:red;">http://openmouse.javaeye.com/blog/181068</a>&nbsp;
          发表时间: 2008年04月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>关于Grails乱码的问题</p>
<p>个人测试了以后</p>
<p>还是属于编辑器的问题</p>
<p>对于IDEA来说安装后，默认的使用系统编码（GB2312），我们最好是设置成UTF-8</p>
<p>其实挺简单的</p>
<p>按照下面图中的步骤，就可以在IDEA中解决Grails乱码的问题</p>
<p><img src="../../upload/picture/pic/11661/2161e3ff-0f6b-30f5-beb1-2dc2646b7a85.bmp" alt="" />
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>选择Settings--&gt;General修改下图的编码设置就OK了！</p>
<p><img src="../../upload/picture/pic/11663/8029f826-9cca-33b5-89ed-c207f5ba79ec.bmp" alt="" />
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>对于其他网站说的修改文件，在这里就没有必要了，不需要修改任何文件</p>
<p><img src="../../../upload/picture/pic/11665/cad95a93-16a4-3684-9f45-57c0737c6f09.bmp" alt="" />
</p>
<p>如果你把grails.views.gsp.encoding=&quot;UTF-8&quot;修改成GBK的话，编辑器里不会出现乱码，但是网页中显示的将会是乱码，毕竟你设置了两个不同的编码！</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/181068#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Apr 2008 02:40:09 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/181068</link>
        <guid>http://openmouse.javaeye.com/blog/181068</guid>
      </item>
      <item>
        <title>6.1.3 Models and Views</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/173564" style="color:red;">http://openmouse.javaeye.com/blog/173564</a>&nbsp;
          发表时间: 2008年03月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          h4. Returning the Model<br />h4. 返回模型（Model）<br />A model is essentially a map that the view uses when rendering. The keys within that map translate to variable names accessible by the view. There are a couple of ways to return a model, the first way is to explicitly return a map instance:<br />模型（Model）本质上是个map类型，当视图（view）被渲染时使用。map中的keys转变成变量名让view(视图)访问。这里有一对方式来返回模型（Model），第一种方式是明确返回map实体：<br />{code:java}<br />def show = {<br />&nbsp;&nbsp;&nbsp; &nbsp;[ book : Book.get( params.id ) ]<br />}<br />{code}<br /><br />If no explicit model is returned the controller's properties will be used as the model thus allowing you to write code like this:<br />假如没有明确的模型（Model）被返回，控制器的属性将被当做模型（Model）来使用，因此允许你的代码写成下面这样:<br />{code:java}<br />class BookController {<br />&nbsp;&nbsp;&nbsp; List books<br />&nbsp;&nbsp;&nbsp; List authors<br />&nbsp;&nbsp;&nbsp; def list = {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; books = Book.list()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; authors = Author.list()<br />&nbsp;&nbsp;&nbsp; }<br />}<br />{code}<br /><br />{note}<br />This is possible due to the fact that controllers are prototype scoped. In other words a new controller is created for each request. Otherwise code such as the above would not be thread safe.<br />这可能是由于事实上控制器（Controllers）是prototype（原型）范围。换句话说，每次请求,一个新的控制器（Controllers）会被创建。否则上面的代码将不是线程安全的。<br />{note}<br /><br />In the above example the @books@ and @authors@ properties will be available in the view. <br />在上面示例中的 @books@ 和 @authors@属性将在view(视图)中被使用。<br />A more advanced approach is to return an instance of the Spring [ModelAndView|api:org.springframework.web.servlet.ModelAndView] class:<br />一个更加高级的方法是返回Spring [ModelAndView|api:org.springframework.web.servlet.ModelAndView] 类。<br />{code:java}<br />import org.springframework.web.servlet.ModelAndView<br />...<br /><br />def index = {<br />&nbsp;&nbsp;&nbsp; def favoriteBooks = ... // get some books just for the index page, perhaps your favorites<br /><br />&nbsp;&nbsp;&nbsp; // forward to the list view to show them<br />&nbsp;&nbsp;&nbsp; return new ModelAndView(&quot;/book/list&quot;, [ bookList : favoriteBooks ])<br />}<br />{code}<br /><br /><br />h4. Selecting the View<br />h4.选择视图（ View）<br />In both the previous two example there was no code that specified which [view:guide:GSP] to render. So how does Grails know which view to pick? The answer lies in the conventions. For the action:<br />在先前的两个示例里没有代码指定哪个 [view:guide:GSP]去渲染。那么Grails怎么知道哪个视图（ View）被选取了？答案在于规约。观察这个Actions（操作）：<br />{code:java}<br />class BookController {<br />&nbsp;&nbsp; &nbsp;def show = {<br />&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;[ book : Book.get( params.id ) ]<br />&nbsp;&nbsp; &nbsp;}&nbsp;&nbsp; &nbsp;<br />}<br />{code}<br /><br />Grails will automatically look for a view at the location @grails-app/views/book/show.gsp@ (actually Grails will try to look for a JSP first, as Grails can equally be used with JSP).<br />Grails 将自动在 @grails-app/views/book/show.gsp@ 位置寻找一个视图（ View）(事实上 Grails将首先尝试寻找JSP页面, 因为Grails 可以等同的用于JSP).<br />If you wish to render another view, then the [render|controllers] method there to help:<br />假如你希望渲染另一个视图（ View），那么[render|controllers]方法可以帮助你：<br />{code:java}<br />def show = {<br />&nbsp; &nbsp;&nbsp; &nbsp;def map = [ book : Book.get( params.id ) ]<br />&nbsp;&nbsp;&nbsp; render(view:&quot;display&quot;, model:map)<br />}&nbsp;&nbsp; &nbsp;<br />{code}<br /><br />In this case Grails will attempt to render a view at the location @grails-app/views/book/display.gsp@. Notice that Grails automatically qualifies the view location with the @book@ folder of the @grails-app/views@ directory. This is convenient, but if you have some shared views you need to access instead use:<br />在这种情况下Grails将尝试渲染 @grails-app/views/book/display.gsp@位置上的视图（ View）。注意，Grails自动描述位于@book@文件夹中的 @grails-app/views@ 路径位置的视图（ View）。很便利，但是假如你拥有一些共享的视图（ View）用来存取，作为替代使用：<br />{code:java}<br />def show = {<br />&nbsp; &nbsp;&nbsp; &nbsp;def map = [ book : Book.get( params.id ) ]<br />&nbsp;&nbsp;&nbsp; render(view:&quot;/shared/display&quot;, model:map)<br />}&nbsp;&nbsp; &nbsp;<br />{code}<br /><br />In this case Grails will attempt to render a view at the location @grails-app/views/shared/display.gsp@.<br />在这种情况下Grails将尝试渲染@grails-app/views/shared/display.gsp@位置上的视图（ View）。<br /><br /><br /><br /><br /><br /><br />Rendering a Response<br />渲染Response（响应）<br />Sometimes its easier (typically with Ajax applications) to render snippets of text or code to the response directly from the controller. For this the highly flexible &quot;render&quot; method can be used:<br />有时它很容易的渲染来自创建控制器（Controllers）小块文本或者代码的响应(通常使用Ajax应用程序)。因为使用了高度灵活的 &quot;render&quot;方法。<br />{code:java}<br />render &quot;Hello World!&quot;<br />{code}<br /><br /><br />The above code writes the text &quot;Hello World!&quot; to the response, other examples include:<br />上面的代码打印出&quot;Hello World!&quot; 响应，其他的示例包括：<br />{code:java}<br />// write some markup<br />render {<br />&nbsp;&nbsp; for(b in books) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; div(id:b.id, b.title)<br />&nbsp;&nbsp; }<br />}<br />// render a specific view<br />render(view:'show')<br />// render a template for each item in a collection<br />render(template:'book_template', collection:Book.list())<br />// render some text with encoding and content type<br />render(text:&quot;&lt;xml&gt;some xml&lt;/xml&gt;&quot;,contentType:&quot;text/xml&quot;,encoding:&quot;UTF-8&quot;)<br />{code}<br />
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/173564#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 19 Mar 2008 00:02:09 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/173564</link>
        <guid>http://openmouse.javaeye.com/blog/173564</guid>
      </item>
      <item>
        <title>6.1.2 Controllers and Scopes</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/173558" style="color:red;">http://openmouse.javaeye.com/blog/173558</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          h4. Available Scopes<br />h4.可用范围（Scopes）<br />Scopes are essentially hash like objects that allow you to store variables. The following scopes are available to controllers:<br />范围（Scopes）本质上就像hash对象，允许你存储变量。下列为controllers（控制器）可用范围（Scopes）：<br />* [servletContext|controllers] - Also known as application scope, this scope allows you to share state across the entire web application. The servletContext is an instance of [javax.servlet.ServletContext|api:javax.servlet.ServletContext]<br />* [servletContext|controllers] - 也被叫做应用（application）范围, 这个范围允许你横跨整个web应用程序共享状态. servletContext对象为一个[javax.servlet.ServletContext|api:javax.servlet.ServletContext]实体。<br />* [session|controllers] - The session allows associating state with a given user and typically uses cookies to associate a session with a client. The session object is an instance of [HttpSession|api:javax.servlet.http.HttpSession]<br />* [session|controllers] - session允许关联某个给定用户的状态，通常使用Cookie把一个session与一位客户关联起来&nbsp; ，session对象为一个[HttpSession|api:javax.servlet.http.HttpSession]实体<br />* [request|controllers] - The request object allows the storage of objects for the current request only. The request object is an instance of [HttpServletRequest|api:javax.servlet.http.HttpServletRequest]<br />* [request|controllers] - request对象只允许存储当前的请求（request）对象，request 对象为一个[HttpServletRequest|api:javax.servlet.http.HttpServletRequest]实体<br />* [params|controllers] - Mutable map of incoming request (CGI) parameters <br />* [params|controllers] - 可变的进入请求参数map（map为java.util.Map类型参数）。<br />* [flash|controllers] - See below.<br />* [flash|controllers] - 见下文.<br />h4. Accessing Scopes<br />h4. 存取范围（Scopes）<br />Scopes can be accessed using the variable names above in combination with Groovy's array index operator even on classes provided by the Servlet API such as the [HttpServletRequest|api:javax.servlet.http.HttpServletRequest]:<br />Scopes的存取可以通过使用上面变量名与Groovy 的array索引操作符的结合来访问，甚至可以使用Servlet API提供的类，例如HttpServletRequest ： [HttpServletRequest|api:javax.servlet.http.HttpServletRequest]:<br /><br />{code:java}<br />class BookController {<br />&nbsp;&nbsp;&nbsp; def find = {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def findBy = params[&quot;findBy&quot;]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def appContext = request[&quot;foo&quot;]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def loggedUser = session[&quot;logged_user&quot;]<br /><br />&nbsp;&nbsp;&nbsp; }<br />}<br />{code}<br /><br />You can even access values within scopes using the de-reference operator making the syntax even clearer:<br />你甚至可以使用.操作符来存取范围（Scopes）内部值，这样使语法更加简洁清楚：<br />{code:java}<br />class BookController {<br />&nbsp;&nbsp;&nbsp; def find = {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def findBy = params.findBy<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def appContext = request.foo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def loggedUser = session.logged_user<br /><br />&nbsp;&nbsp;&nbsp; }<br />}<br />{code}<br /><br />This is one of the ways that Grails unifies access to the different scopes.<br />这是统一存取不同范围的方式之一.<br />h4. Using Flash Scope<br />h4. 使用 Flash Scope<br />Grails supports the concept of [flash|controllers] scope is a temporary store for attributes which need to be available for this request and the next request only. Afterwards the attributes are cleared. This is useful for setting a message directly before redirection, for example:<br />Grails 支持[flash|controllers] scope的概念，它临时存贮只在这次请求和下次请求中使用的属性，随后属性值将被清除。这在重定向之前直接设置消息是非常有用的。<br />{code:java}<br />def delete = {<br />&nbsp;&nbsp;&nbsp; def b = Book.get( params.id )<br />&nbsp;&nbsp;&nbsp; if(!b) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flash.message = &quot;User not found for id ${params.id}&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; redirect(action:list)<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; ... // remaining code<br />}<br />{code}<br />
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/173558#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 23:39:05 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/173558</link>
        <guid>http://openmouse.javaeye.com/blog/173558</guid>
      </item>
      <item>
        <title>6.1.1 Understanding Controllers and Actions</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/173553" style="color:red;">http://openmouse.javaeye.com/blog/173553</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          h4. Creating a controller<br />h4. 创建控制器（Controllers）<br />Controllers can be created with the [create-controller|commandLine] target. For example try running the following command from the root of a Grails project:<br />控制器（Controllers）可以使用[create-controller|commandLine]目标来创建.作为示例可以在Grails根目录下尝试运行下列命令。<br />{code:java}<br />grails create-controller book<br />{code}<br /><br />The command will result in the creation of a controller at the location @grails-app/controllers/BookController.groovy@:<br />这条命令将导致一个控制器（Controllers）在@grails-app/controllers/BookController.groovy@位置上被创建。<br />{code:java}<br />class BookController { ... }<br />{code}<br /><br />@BookController@ by default maps to the /book URI (relative to your application root). <br />@BookController@默认映射到/book URI上（相对于您的应用程序根目录）<br />{note}<br />The @create-controller@ command is merely for convenience and you can just as easily create controllers using your favorite text editor or IDE<br />{note}<br />@create-controller@命令仅仅是个方面的工具，你还可以使用你喜欢的文本编辑器或者IDE来容易的创建控制器（Controllers）。<br />h4. Creating Actions<br />h4. 创建 Actions（操作）<br />A controller can have multiple properties that are each assigned a block of code. Each of these properties maps to a URI:<br />一个控制器（Controllers）可以拥有多个属性，每个属性都被分配一个代码块.上述每个这样的属性将被映射到URI上。<br />{code:java}<br />class BookController {<br />&nbsp;&nbsp;&nbsp; def list = {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // do controller logic<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // create model<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return model<br />&nbsp;&nbsp;&nbsp; }<br />}<br />{code}<br /><br />This example maps to the @/book/list@ URI by default thanks to the property being named @list@. <br />默认情况下这个例子映射到/book/list URI上，因为属性被命名为@list@。<br />h4. The Default Action<br />h4. 默认Action（操作）<br />A controller has the concept of a default URI that maps to the root URI of the controller. By default the default URI in this case is @/book@. The default URI is dictated by the following rules:<br />一个控制器（Controllers）具有默认URI的概念即映射到控制器（Controllers）的根URI。默认情况下缺省URI在这里的是@/book@。默认的URI被支配通过以下规则：<br />* If only one action is present the default URI for a controller maps to that action. <br />* 如果只有一个Action（操作）存在，一个控制器（Controllers）的默认URI将映射到该Action（操作）。<br />* If you define an @index@ action which is the action that handles requests when no action is specified in the URI @/book@<br />* 假如你定义了一个@index@ Action（操作），当没有Action（操作）被指定在URI@/book@上时，这个Action（操作）将处理请求。<br />* Alternatively you can set it explicitly with the @defaultAction@ property:<br />* 除此之外，你可以明确的设置为@defaultAction@属性：<br />{code:java}<br />def defaultAction = &quot;list&quot;<br />{code}<br />
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/173553#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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 23:16:13 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/173553</link>
        <guid>http://openmouse.javaeye.com/blog/173553</guid>
      </item>
      <item>
        <title>6.1 Controllers</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/173547" style="color:red;">http://openmouse.javaeye.com/blog/173547</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          A controller handles requests and creates or prepares the response and is request-scoped.&nbsp; In other words a new instance is created for each [request|controllers]. A controller can generate the response or delegate to a view. To create a controller simply create a class whose name ends with @Controller@ and place it within the @grails-app/controllers@ directory.<br />一个控制器（Controllers）是请求范围的,用于处理请求，创建或者准备响应。换句话说，每次[request|controllers]会创建一个新的控制器（Controllers）实体。一个控制器（Controllers）能产生响应或者委托给一个视图。创建一个控制器（Controllers），简单创建一个类名以 @Controller@ 结尾的类，并放于@grails-app/controllers@目录中。<br />The default [URL Mapping|guide:mapping] setup ensures that the first part of your controller name is mapped to a URI and each action defined within your controller maps to URI within the controller name URI.<br />默认的[URL Mapping|guide:mapping]设置能确保你的控制器（Controllers）名字的第一部分被映射到一个URI上，并且控制器（Controllers）中的每个Actions（操作）定义被映射到控制器（Controllers）命名URI中的URI。<br /><br /><br />
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/173547#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 22:52:54 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/173547</link>
        <guid>http://openmouse.javaeye.com/blog/173547</guid>
      </item>
      <item>
        <title>Groovy（Java笨狗）系列-Working with closures（1）</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/173194" style="color:red;">http://openmouse.javaeye.com/blog/173194</a>&nbsp;
          发表时间: 2008年03月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>翻译自《Groovy in action》，如有不准确之处，希望指教！</p><p>&nbsp;</p><p>closures（闭包）很重要，非常的重要！！！可以被认为是Groovy中一个非常有用的特性。同时，在你没有完全了解它之前会是一个陌生的概念。为了发挥Groovy最大功效，或者了解任何其他Groovy代码，它将肯定让你感觉轻松。不只是&ldquo;一次婚礼上遇见它们&rdquo;的轻松，而是&ldquo;邀请它们参加周末烧烤&rdquo;的轻松。（注原文： Not just <br />&ldquo;met them once at a wedding&rdquo; comfortable, but &ldquo;invite them over for a barbecue on <br />the weekend&rdquo; comfortable.）</p><p>&nbsp;</p><p>此刻，我不是想吓跑你，closures（闭包）并不难---它只是不同于任何你过去习惯的事物。某种程度上，它是陌生的，因为在面向对象中一个首要的原则是对象拥有行为和数据。closures（闭包）是对象，在它的生命里最主要的目的是它们的行为---这几乎是他们的所有。</p><p>&nbsp;</p><p>&nbsp;</p><p>在这节我们将介绍closures（闭包）的基本概念，阐明它们的好处。然后，展示他们是怎样被定义和调用的。讨论基础之后，我们将更深入的探讨closures（闭包）中使用其他的方法和closures（闭包）的范围---即，它内部数据和成员的访问---以及，考虑closures（闭包）使用什么方法来返回。本节结尾，我们将讨论closures（闭包）怎样用于实现多数普通的设计模式和通过不同的解决方式来减轻另外某些需要。</p><p>&nbsp;</p><p>因此，不再啰嗦，首先，让我们来看下实际中的closures（闭包）。</p><p>&nbsp;</p><p>&nbsp;</p><p>让我们以一个简单的closures（闭包）定义开始，然后，我们通过一个示例来扩展它。closures（闭包）作为一个对象包装在一个代码块中。closures（闭包）的作用就像一个方法，因为，它可以获取参数并能返回值。它是一个普通的对象，因为，你可以给他传递一个引用，就如你可以引用任何其他对象一样。别忘了，JVM不会知道你正在运行Groovy代码，因此，你可以使用一个closures（闭包）对象也就没有什么特别奇怪的了，它只是个对象。Groovy提供了一个非常简单的方法来创建closures（闭包）并赋予一些非常敏捷的行为。</p><p>&nbsp;</p><p>&nbsp;</p><p>假如，它能帮助你用类似于真实世界的方式来思考，假设，一个信封中的一张信纸，信纸上可能写着变量的值：&ldquo;x=5, y=10&rdquo;等等。对于closures（闭包）来说，信纸可能拥有一个指令列表，你可以把信封给某人，某人可能依照信纸上的指令来做决定，或者他可能同样把这个信封给其他人。每次根据不同的上下文，可能会按照信纸上面的指令来做决定很多次。例如：信纸上写着：&rdquo;给你心里想着的人写一封信&ldquo;，然后，他会在他的地址簿里寻找他心里想着的一系列的人，最后，根据上面的指令，一个一个的给他们写信。</p><p>&nbsp;</p><p>&nbsp;</p><p>closures（闭包）等同于上面真实生活的示例，可以表示成如下的形式： </p><pre name="code" class="java">Closure envelope = { person -&gt; new Letter(person).send() }
addressBook.each (envelope)</pre>&nbsp;这是一个比较冗长的方式来处理它，不是Groovy惯用的.但是，它展示了closures（闭包）它自己(在这种情况下，envelope 变量的值) 和它用处（作为each方法中的参数.）之前的区别 。当第一次看到closures（闭包）的简写形式是难于理解。Groovy使它们非常简洁，因为它们经常被使用---但是，简写不利于学习过程。为了对比，先前的代码采用Groovy提供的简写形式，它往往有利于清楚的区分冗长的形式：<pre name="code" class="java">addressBook.each { new Letter(it).send() }</pre>&nbsp;<p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/173194#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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, 17 Mar 2008 22:28:27 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/173194</link>
        <guid>http://openmouse.javaeye.com/blog/173194</guid>
      </item>
      <item>
        <title>6.1.7 XML and JSON Responses</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/169524" style="color:red;">http://openmouse.javaeye.com/blog/169524</a>&nbsp;
          发表时间: 2008年03月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="xml">h4. Using the render method to output XML
h4. 使用render输出XML
Grails' supports a few different ways to produce XML and JSON responses. The first one covered is via the [render|controllers] method. 
Grails提供一些不同的方法来产生XML和JSON响应。第一个是隐式的通过[render|controllers]方法。
The @render@ method can be passed a block of code to do mark-up building in XML:
@render@方法可以传递一个代码块来执行标记生成器产生XML
{code}
def list = {
	def results = Book.list()
	render(contentType:&quot;text/xml&quot;) {
		books {
			for(b in results) {
				book(title:b.title)
			}
		}	
	}
}
{code}                            

The result of this code would be something like:
这段代码的结果将会像这样：
{code:xml}
&lt;books&gt;
	  &lt;book title=&quot;The Stand&quot; /&gt;
	  &lt;book title=&quot;The Shining&quot; /&gt;	
&lt;/books&gt;
{code}

Note that you need to be careful to avoid naming conflicts when using mark-up building. For example this code would produce an error:
 注意，当你使用标记生成器时，必须小心避免命名冲突。例如，这段代码将产生一个错误：
{code}
def list = {
	def books = Book.list()  // naming conflict here
	render(contentType:&quot;text/xml&quot;) {
		books {
			for(b in results) {
				book(title:b.title)
			}
		}	
	}
}
{code} 

The reason is that there is local variable @books@ which Groovy attempts to invoke as a method.
原因是，这里的一个本地变量@books@企图作为方法被调用。

h4. Using the render method to output JSON
h4. 使用 render 方法 输出 JSON
The @render@ method can also be used to output JSON:
@render@ 方法可以同样被用于输出JSON:
{code}
def list = {
	def results = Book.list()
	render(contentType:&quot;text/json&quot;) {
		books {
			for(b in results) {
				book(title:b.title)
			}
		}	
	}
}
{code}     

In this case the result would be something along the lines of:
在这种情况下，结果就会是大致相同的：
{code}
[
	{title:&quot;The Stand&quot;}, 
	{title:&quot;The Shining&quot;}
]
{code}

Again the same dangers with naming conflicts apply to JSON building.
同样的命名冲突危险适用于JSON生成器。
h4. Automatic XML Marshalling
h4. 自动 XML 列集(Marshalling)（在此附上对于列集(Marshalling)解释：对函数参数进行打包处理得过程，因为指针等数据，必须通过一定得转换，才能被另一组件所理解。可以说列集(Marshalling)是一种数据格式的转换方法。）
Grails also supports automatic marshaling of [domain classes|guide:gorm] to XML via special converters.
Grails同样支持自动列集(Marshalling)[domain classes|guide:gorm]为XML通过特定的转换器。
To start off with import the @grails.converters@ package into your controller:                                     
首先，导入@grails.converters@ 类包到你的控制器（Controllers）中：            
{code}
import grails.converters.*
{code}

Now you can use the following highly readable syntax to automatically convert domain classes to XML:
现在，你可以使用下列高度易读的语法来自动转换领域类成XML：
{code}
render Book.list() as XML
{code}

The resulting output would look something like the following::
输出结果看上去会像下列这样：
{code}
&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt;
&lt;list&gt;
  &lt;book id=&quot;1&quot;&gt;
    &lt;author&gt;Stephen King&lt;/author&gt;
    &lt;title&gt;The Stand&lt;/title&gt;
  &lt;/book&gt;
  &lt;book id=&quot;2&quot;&gt;
    &lt;author&gt;Stephen King&lt;/author&gt;
    &lt;title&gt;The Shining&lt;/title&gt;
  &lt;/book&gt;
&lt;/list&gt;                          
{code}     

An alternative to using the converters is to use the [codecs|guide:codecs] feature of Grails. The codecs feature provides [encodeAsXML|guide:codecs] and [encodeAsJSON|guide:codecs] methods:
一个使用转换器的替代方法是使用Grails的[codecs|guide:codecs]特性。codecs特性提供了[encodeAsXML|guide:codecs]和[encodeAsJSON|guide:codecs]方法:
{code}
def xml = Book.list().encodeAsXML()
render xml
{code}

For more information on XML marshaling see the section on [REST|guide:REST]
更多的XML 列集(Marshalling)信息见[REST|guide:REST]部分
h4. Automatic JSON Marshalling
h4. 自动JSON列集(Marshalling)
Grails also supports automatic marshaling to JSON via the same mechanism. Simply substitute @XML@ with @JSON@:
Grails同样支持自动列集(Marshalling)为JSON通过同样的机制。简单替代@XML@ 为@JSON@
{code}
render Book.list() as JSON
{code}

The resulting output would look something like the following:
输出结果看上去会像下列这样：
{code}
[
	{&quot;id&quot;:1,
	 &quot;class&quot;:&quot;Book&quot;,
	 &quot;author&quot;:&quot;Stephen King&quot;,
	 &quot;title&quot;:&quot;The Stand&quot;},
	{&quot;id&quot;:2,
	 &quot;class&quot;:&quot;Book&quot;,
	 &quot;author&quot;:&quot;Stephen King&quot;,
	 &quot;releaseDate&quot;:new Date(1194127343161),
	 &quot;title&quot;:&quot;The Shining&quot;}
 ]
{code}

Again as an alternative you can use the @encodeAsJSON@ to achieve the same effect.
再次作为一种替代，你可以使用@encodeAsJSON@达到相同的效果</pre>&nbsp;附上满江红的Grails翻译，因为雪灾的缘故，进度可能被我拖后了，也是为了让大家参数进来，如果翻译有什么不正确的地方可以及时提出来，进行更正。
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/169524#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 09 Mar 2008 15:19:51 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/169524</link>
        <guid>http://openmouse.javaeye.com/blog/169524</guid>
      </item>
      <item>
        <title>公益广告--为了迎接2008</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/158076" style="color:red;">http://openmouse.javaeye.com/blog/158076</a>&nbsp;
          发表时间: 2008年01月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <object height="500" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="700" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"><param name="movie" value="http://player.youku.com/player.php/sid/XODQ2MTg5Mg==/v.swf" /><param name="quality" value="high" /><param name="menu" value="false" /><param name="wmode" value="" /><embed pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://player.youku.com/player.php/sid/XODQ2MTg5Mg==/v.swf" type="application/x-shockwave-flash" wmode="" height="500" menu="false" quality="high" width="700"></embed></object><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/158076#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Jan 2008 16:22:30 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/158076</link>
        <guid>http://openmouse.javaeye.com/blog/158076</guid>
      </item>
      <item>
        <title>Grails（Java笨狗）系列-更好的理解闭包（closure）</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/157745" style="color:red;">http://openmouse.javaeye.com/blog/157745</a>&nbsp;
          发表时间: 2008年01月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>用现实生活中的示例来说明闭包</p><p>&nbsp;</p><p>现在，让我们来考虑放在信封里的信纸。信纸里可能写着&ldquo;x=5, y=10&rdquo;等等一些内容。对于一个闭包（closure），信纸上可能写着一系列的指令。你可以把信封交给其他人，这个人可能会按照信纸上面的指令来做决定，当然，他也可能同样会把这个信封交给其他人。每次根据不同的上下文，他们可能多次的根据信纸的指令做出决定。比如：</p><p>信纸上可能写着&rdquo;给你心里想着的人写一封信&ldquo;，然后他会在他的地址簿里寻找他心里想着的一系列的人，最后，根据上面的指令，一个一个的给他们写信。</p><p>&nbsp;</p><p>闭包（closure）等同于上面真实生活的示例，可以表示成如下的形式：</p><pre name="code" class="java">Closure envelope = { person -&gt; new Letter(person).send() }
addressBook.each (envelope)</pre>&nbsp;<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/157745#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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 20 Jan 2008 15:39:46 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/157745</link>
        <guid>http://openmouse.javaeye.com/blog/157745</guid>
      </item>
      <item>
        <title>可能Grails的翻译不会在发布到BLOG中来了</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/157385" style="color:red;">http://openmouse.javaeye.com/blog/157385</a>&nbsp;
          发表时间: 2008年01月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          很荣幸能参加满江红的Grails的翻译<br />所以<br />Grails的翻译文档，将不会在BLOG中翻译出来，如果大家想了解Grails可以等待满江红的Grails的中文文档出来。
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/157385#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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 Jan 2008 17:03:04 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/157385</link>
        <guid>http://openmouse.javaeye.com/blog/157385</guid>
      </item>
      <item>
        <title>Grails（Java笨狗）系列--Configuration</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/157239" style="color:red;">http://openmouse.javaeye.com/blog/157239</a>&nbsp;
          发表时间: 2008年01月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>首先，Grails是一个信奉&ldquo;规约重于配置&rdquo;的框架，这一点是来自现在流行的Rails.使用Grails的默认设置进行开发，你不需要任何的配置。Grilas装备有一个内置的容器和一个HSQLDB物理内存数据库。</p><p>不过有时，你也需要在实际的项目中使用相应的数据库，下面介绍Grails的一些配置（很简单的，这里我用自己的一些项目来说明）：</p><p>对于普通的配置 Grails 提供了一个路径为 <strong>grails-app/conf/Config.groovy</strong>的配置文件。 <img src="../../upload/picture/pic/7095/e0a3ee76-37cc-3627-8eb4-34adf6d770a9.bmp" alt="" /></p><p>注意看<strong>Config.groovy</strong></p><pre name="code" class="java">// locations to search for config files that get merged into the main config
// config files can either be Java properties files or ConfigSlurper scripts

// grails.config.locations = [ &quot;classpath:${appName}-config.properties&quot;,
//                             &quot;classpath:${appName}-config.groovy&quot;,
//                             &quot;file:${userHome}/.grails/${appName}-config.properties&quot;,
//                             &quot;file:${userHome}/.grails/${appName}-config.groovy&quot;]

// if(System.properties[&quot;${appName}.config.location&quot;]) {
//    grails.config.locations &lt;&lt; &quot;file:&quot; + System.properties[&quot;${appName}.config.location&quot;]
// }
grails.mime.file.extensions = true // enables the parsing of file extensions from URLs into the request format
grails.mime.types = [ html: ['text/html','application/xhtml+xml'],
                      xml: ['text/xml', 'application/xml'],
                      text: 'text-plain',
                      js: 'text/javascript',
                      rss: 'application/rss+xml',
                      atom: 'application/atom+xml',
                      css: 'text/css',
                      csv: 'text/csv',
                      all: '*/*',
                      json: ['application/json','text/json'],
                      form: 'application/x-www-form-urlencoded',
                      multipartForm: 'multipart/form-data'
                    ]
// The default codec used to encode data with ${}
grails.views.default.codec=&quot;none&quot; // none, html, base64

// enabled native2ascii conversion of i18n properties files
grails.enable.native2ascii = true

// log4j configuration
log4j {
    appender.stdout = &quot;org.apache.log4j.ConsoleAppender&quot;
    appender.'stdout.layout'=&quot;org.apache.log4j.PatternLayout&quot;
    appender.'stdout.layout.ConversionPattern'='[%r] %c{2} %m%n'
    appender.errors = &quot;org.apache.log4j.FileAppender&quot;
    appender.'errors.layout'=&quot;org.apache.log4j.PatternLayout&quot;
    appender.'errors.layout.ConversionPattern'='[%r] %c{2} %m%n'
    appender.'errors.File'=&quot;stacktrace.log&quot;
    rootLogger=&quot;error,stdout&quot;
    logger {
        grails=&quot;error&quot;
        StackTrace=&quot;error,errors&quot;
        org {
            codehaus.groovy.grails.web.servlet=&quot;error&quot;  //  controllers
            codehaus.groovy.grails.web.pages=&quot;error&quot; //  GSP
            codehaus.groovy.grails.web.sitemesh=&quot;error&quot; //  layouts
            codehaus.groovy.grails.&quot;web.mapping.filter&quot;=&quot;error&quot; // URL mapping
            codehaus.groovy.grails.&quot;web.mapping&quot;=&quot;error&quot; // URL mapping
            codehaus.groovy.grails.commons=&quot;info&quot; // core / classloading
            codehaus.groovy.grails.plugins=&quot;error&quot; // plugins
            codehaus.groovy.grails.orm.hibernate=&quot;error&quot; // hibernate integration
            springframework=&quot;off&quot;
            hibernate=&quot;off&quot;
        }
    }
    additivity.StackTrace=false
}

// WAR dependency config
grails.war.dependencies = [
    &quot;ant.jar&quot;,
    &quot;ant-launcher.jar&quot;,
    &quot;hibernate3.jar&quot;,
    &quot;jdbc2_0-stdext.jar&quot;,
    &quot;jta.jar&quot;,
    &quot;groovy-all-*.jar&quot;,
    &quot;springmodules-sandbox.jar&quot;,
    &quot;standard-${servletVersion}.jar&quot;,
    &quot;jstl-${servletVersion}.jar&quot;,
    &quot;antlr-*.jar&quot;,
    &quot;cglib-*.jar&quot;,
    &quot;dom4j-*.jar&quot;,
    &quot;ehcache-*.jar&quot;,
    &quot;junit-*.jar&quot;,
    &quot;commons-logging-*.jar&quot;,
    &quot;sitemesh-*.jar&quot;,
    &quot;spring-*.jar&quot;,
    &quot;log4j-*.jar&quot;,
    &quot;ognl-*.jar&quot;,
    &quot;hsqldb-*.jar&quot;,
    &quot;commons-lang-*.jar&quot;,
    &quot;commons-collections-*.jar&quot;,
    &quot;commons-beanutils-*.jar&quot;,
    &quot;commons-pool-*.jar&quot;,
    &quot;commons-dbcp-*.jar&quot;,
    &quot;commons-cli-*.jar&quot;,
    &quot;commons-validator-*.jar&quot;,
    &quot;commons-fileupload-*.jar&quot;,
    &quot;commons-io-*.jar&quot;,
    &quot;commons-io-*.jar&quot;,
    &quot;*oro-*.jar&quot;,
    &quot;jaxen-*.jar&quot;,
    &quot;xercesImpl.jar&quot;,
    &quot;xstream-1.2.1.jar&quot;,
    &quot;xpp3_min-1.1.3.4.O.jar&quot;
]

grails.war.java5.dependencies = [
    &quot;hibernate-annotations.jar&quot;,
    &quot;ejb3-persistence.jar&quot;,
]


</pre><p>&nbsp;上面是源代码.它使用了Groovy's <a href="http://groovy.codehaus.org/ConfigSlurper" target="blank">ConfigSlurper</a>，类似于Java的属性文件，只不过他是使用纯粹的Groovy文件，你可以重复使用变量和正确的Java类型。</p><p>&nbsp;</p><p>你可以在这里添加你自己的配置, for example: </p><pre name="code" class="java">foo.bar.hello = &quot;world&quot;</pre>&nbsp;稍后你可以在你的应用项目中访问这些设置。在大多数情况下你可以通过 <a href="file:///G:/%E5%BC%80%E5%8F%91%E8%B5%84%E6%96%99/Grails/grails-docs-1.0-RC4/api/org/codehaus/groovy/grails/commons/GrailsApplication.html" class="api">GrailsApplication</a> （在controllers and tag中的可用变量）对象来访问：<pre name="code" class="java">assert &quot;world&quot; == grailsApplication.config.foo.bar.hello</pre><p>&nbsp;</p><p>&nbsp;</p><p>Grails也提供下面这些配置选项:</p><ol><li><strong>grails.enable.native2ascii</strong> - 设置为<strong>false</strong> 你将不要求 native2ascii 转换Grails i18n 属性文件。<pre name="code" class="java">grails.enable.native2ascii = true</pre>&nbsp;默认为true.</li><li><strong>grails.views.default.codec</strong> - 设置<strong>GSP</strong>的默认编码方式 - 可以为这些中的其中一个（ '<strong>none</strong>', '<strong>html'</strong>,&nbsp; '<strong>base64</strong>' (default:
'<strong>none</strong>')）. 为了 减少XSS攻击的风险, 设置为 '<strong>html</strong>'.<pre name="code" class="java">grails.views.default.codec=&quot;none&quot;</pre>&nbsp;默认为none。</li></ol><br /><br />Grails 使用普通的配置机制去配置潜在的&nbsp; <a href="http://logging.apache.org/log4j/1.2/index.html" target="blank">Log4j</a> <strong>log system</strong>。配置<strong>logging</strong>你必须修改<strong> </strong><strong>Config.groovy</strong>文件 ，位于 <strong>grails-app/conf</strong> 路径下，它允许你指定单独的logging配置（如：<strong>development, test,&nbsp; production</strong> <a href="file:///G:/%E5%BC%80%E5%8F%91%E8%B5%84%E6%96%99/Grails/grails-docs-1.0-RC4/guide/single.html#3.2%20Environments" class="guide">environments</a>.）。Grails 执行<strong> Config.groovy</strong> 文件 并在web-app/WEB-INF/classes目录下产生适当的 <strong>log4j.properties</strong> 文件 。<pre name="code" class="java">log4j {
    appender.stdout = &quot;org.apache.log4j.ConsoleAppender&quot;
    appender.'stdout.layout'=&quot;org.apache.log4j.PatternLayout&quot;
    appender.'stdout.layout.ConversionPattern'='[%r] %c{2} %m%n'
    appender.errors = &quot;org.apache.log4j.FileAppender&quot;
    appender.'errors.layout'=&quot;org.apache.log4j.PatternLayout&quot;
    appender.'errors.layout.ConversionPattern'='[%r] %c{2} %m%n'
    appender.'errors.File'=&quot;stacktrace.log&quot;
    rootLogger=&quot;error,stdout&quot;
    logger {
        grails=&quot;error&quot;
        StackTrace=&quot;error,errors&quot;
        org {
            codehaus.groovy.grails.web.servlet=&quot;error&quot;  //  controllers
            codehaus.groovy.grails.web.pages=&quot;error&quot; //  GSP
            codehaus.groovy.grails.web.sitemesh=&quot;error&quot; //  layouts
            codehaus.groovy.grails.&quot;web.mapping.filter&quot;=&quot;error&quot; // URL mapping
            codehaus.groovy.grails.&quot;web.mapping&quot;=&quot;error&quot; // URL mapping
            codehaus.groovy.grails.commons=&quot;info&quot; // core / classloading
            codehaus.groovy.grails.plugins=&quot;error&quot; // plugins
            codehaus.groovy.grails.orm.hibernate=&quot;error&quot; // hibernate integration
            springframework=&quot;off&quot;
            hibernate=&quot;off&quot;
        }
    }</pre>&nbsp;如果你更喜欢标准的 Log4j 属性文件样式配置 你可以使用Groovy的多行String替代:<pre name="code" class="java">log4j = '''
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# ...remaining configuration
'''</pre><p>&nbsp;注意：Groovy的多行String是</p><pre name="code" class="java"> '''  '''</pre><p>的形式。</p><p>一些有用的 <strong>loggers：</strong></p><ul class="star"><li><strong>org.codehaus.groovy.grails.commons </strong>- 核心工件（ artefact）信息 比如 class loading 等等.</li><li><strong>org.codehaus.groovy.grails.web</strong> - Grails web 请求处理</li><li><strong>org.codehaus.groovy.grails.web.mapping</strong> - URL mapping调试</li><li><strong>org.codehaus.groovy.grails.plugins</strong> - 记录插件行为</li><li><strong>org.springframework </strong>- 观察spring正在干什么。</li><li><strong>org.hibernate</strong> -观察Hibernate正在干什么。</li></ul><p>&nbsp;</p><p>&nbsp;</p><p>当有异常抛出，<strong>full trace</strong> 总是会写入 StackTrace logger，文件名叫做 stacktrace.log--当然你可以做任何你喜欢的改变通过<strong>grails-app/conf/Config.groovy</strong>文件，例如：</p><pre name="code" class="java">StackTrace=&quot;error,errors&quot;</pre><p>&nbsp;你可以改变成：</p><pre name="code" class="java">StackTrace=&quot;error,stdout&quot;</pre><p>&nbsp;可以完全废除<strong>stacktrace filtering</strong> 通过设置 <strong>grails.full.stacktrace VM</strong> 属性为 true:</p><pre name="code" class="java">grails -Dgrails.full.stacktrace=true run-app</pre><p>&nbsp;</p><p>&nbsp;</p><h4>Logging通过规约：</h4><p>所用的应用程序工件（ artefacts）可以动态的添加<strong> log</strong> 属性. 包括 <a href="file:///G:/%E5%BC%80%E5%8F%91%E8%B5%84%E6%96%99/Grails/grails-docs-1.0-RC4/guide/single.html#5.%20Object%20Relational%20Mapping%20%28GORM%29" class="guide">domain classes</a>, <a href="file:///G:/%E5%BC%80%E5%8F%91%E8%B5%84%E6%96%99/Grails/grails-docs-1.0-RC4/guide/single.html#6.1%20Controllers" class="guide">controllers</a>, <strong>tag libraries</strong> 等等. 例如:</p><pre name="code" class="java">def foo = &quot;bar&quot;
log.debug &quot;The value of foo is $foo&quot;</pre><p>&nbsp;<strong>Logs命名</strong> 使用 规约<strong> grails.app.&lt;artefactType&gt;.ClassName，例如：</strong></p><pre name="code" class="java"># Set level for all application artefacts
log4j.logger.grails.app=&quot;info, stdout&quot;

# Set for a specific controller log4j.logger.grails.app.controller.YourController=&quot;debug, stdout&quot;

# Set for a specific domain class log4j.logger.grails.app.domain.Book=&quot;debug, stdout&quot;

# Set for a specific taglib log4j.logger.grails.app.tagLib.FancyAjax=&quot;debug, stdout&quot;

# Set for all taglibs log4j.logger.grails.app.tagLib=&quot;info, stdout&quot;</pre><p>&nbsp;工件（artefacts） 名字通过规约来规定:</p><ul class="star"><li><strong>bootstrap</strong> - For bootstrap classes</li><li><strong>dataSource</strong> - For data sources</li><li><strong>tagLib </strong>- For tag libraries</li><li><strong>service</strong> - For service classes</li><li><strong>controller</strong> - For controllers</li><li>d<strong>omain</strong><strong> </strong>- For domain entities</li></ul><p>&nbsp;</p><p>&nbsp;因为Grails 是构建在Java 技术 之上，配置<strong>data source</strong>
要求一些JDBC知识(并不是替代&nbsp;
<strong>Java Database Connectivity</strong>).</p><p>&nbsp;</p><p>本质上, 如果你使用除<strong>HSQLDB</strong>以外的<strong>database</strong> ， 你需要其对应的<strong>JDBC driver 。</strong>这里我们使用<strong>MySql。</strong></p><p>首先你的下载<strong>JDBC driver,</strong>并把他放在项目中的lib目录下。</p><p>其次你得修改位于项目中的<strong>grails-app/conf/DataSource.groovy</strong>文件。</p><p>主要包括一下设置：</p><ul class="star"><li><strong>driverClassName</strong> -&nbsp; JDBC driver的class name.</li><li><strong>username</strong> - username 为你的数据库用户名</li><li><strong>password </strong>- password 为你的数据库密码</li><li><strong>url</strong> -&nbsp; 数据库的JDBC URL </li><li><strong>dbCreate</strong> - 是否从<strong>domain model</strong> 自动生成数据库。</li><li><strong>pooling </strong>- 是否使用连接池 (默认为true)</li><li><strong>logSql</strong> - SQL logging</li></ul><p>附上源代码：</p><pre name="code" class="java">dataSource {
	pooled = false
	driverClassName = &quot;org.hsqldb.jdbcDriver&quot;
	username = &quot;sa&quot;
	password = &quot;&quot;
}
hibernate {
    cache.use_second_level_cache=true
    cache.use_query_cache=true
    cache.provider_class='org.hibernate.cache.EhCacheProvider'
}
// environment specific settings
environments {
	development {
		dataSource {
			dbCreate = &quot;create-drop&quot; // one of 'create', 'create-drop','update'
			url = &quot;jdbc:hsqldb:mem:devDB&quot;
		}
	}
	test {
		dataSource {
			dbCreate = &quot;update&quot;
			url = &quot;jdbc:hsqldb:mem:testDb&quot;
		}
	}
	production {
		dataSource {
			dbCreate = &quot;update&quot;
			url = &quot;jdbc:hsqldb:file:prodDb;shutdown=true&quot;
		}
	}
}</pre>&nbsp;<p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>典型的MySQ配置：</p><pre name="code" class="java">dataSource {
	pooling = true
	dbCreate = &quot;update&quot;
	url = &quot;jdbc:mysql://localhost/yourDB&quot;
	driverClassName = &quot;com.mysql.jdbc.Driver&quot;
	username = &quot;yourUser&quot;
	password = &quot;yourPassword&quot;	
}</pre>&nbsp;<p>&nbsp;</p><h2><a name="3.3.2 JNDI DataSources"></a> JNDI DataSources</h2><p>有时你需要使用JNDI，Grails支持JNDI：</p><pre name="code" class="java">dataSource {
    jndiName = &quot;java:comp/env/myDataSource&quot;
}</pre><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;<strong>DataSource</strong>
<strong>的dbCreate</strong> 属性定义是非常重要的 ，因为他规定了Grails 在运行时怎样尝试数据库表格 ，可选的操作:
</p><ul class="star"><li>create-drop - 当Grails运行时自动销毁和产生数据库表格。</li><li>create - 假如不存在就创建它,但不是修改它。</li><li>update -假如不存在就创建它, 假如存在就修改它。</li></ul><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><pre name="code" class="java">dataSource {
	dbCreate = &quot;create-drop&quot; // one of 'create', 'create-drop','update'
}</pre><p>&nbsp;当然，假如你不想使用上面所说的配置，你可以删除</p><pre>dataSource {
	dbCreate = <span class="java-quote">&quot;create-drop&quot;</span> // one of 'create', 'create-drop','update'
}</pre><p>&nbsp;</p><p>就可以了。</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/157239#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 18 Jan 2008 12:42:00 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/157239</link>
        <guid>http://openmouse.javaeye.com/blog/157239</guid>
      </item>
      <item>
        <title>Groovy（Java笨狗）系列--fields and local variables</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/155699" style="color:red;">http://openmouse.javaeye.com/blog/155699</a>&nbsp;
          发表时间: 2008年01月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>使用最简单的术语，a variable（变量）： 变量名引用的值关联着物理内存的某个位置。和Java一样，Groovy拥有 local variables（本地变量），fields（字段）：local variables他们的范围定义为方法的一部分存在。fields的存在范围为类或者对象中。Fields and local variables有太多相同的声明方式，所以同时讲解他们。</p><ul><li>Declaring variables</li></ul><ol><li><strong>Fields</strong> and <strong>local variables</strong> 使用前必须被声明 。</li><li>声明包括：指定变量名, 可选的类型声明和 修饰符,分配初始值.</li><li>一旦被定义，变量将通过变量名来引用。</li><li>Groovy 使用Java&rsquo;的修饰符&mdash; <strong>private</strong>, <strong>protected</strong>, <strong>public </strong>，<strong>final（</strong>不允许在分配值<strong>），static（</strong>为类变量<strong>），</strong>这些修饰符和Java中的意思相同。</li><li>非静态变量被看到对象变量<strong>。</strong></li><li>在<strong>Groovy</strong>中<strong>，</strong><strong>&nbsp; fields </strong>默认的修饰符有着特别的意义<strong>（在GroovyBeans中讲解）。</strong></li><li>变量类型的定义是可选的：但是假如你没有给出类型定义和修饰符定义，你必须使用def来定义变量，来说明此变量为未知类型（哈哈，希望大家能有点思维能力，其实外国人的东西都是套公式的东西，灵活运用在于你的思维能力了。前面说过<strong>Groovy</strong>一切都是对象，你用def关键字定义的变量，实际是默认值为<strong>Object</strong>）</li><li>下面给出一些示例：<br /><pre name="code" class="java">class SomeClass {
public fieldWithModifier
String typedField
def untypedField
protected field1, field2, field3
private assignedField = new Date()
static classField
public static final String CONSTA = 'a', CONSTB = 'b'
def someMethod(){
def localUntypedMethodVar = 1
int localTypedMethodVar = 1
def localVarWithoutAssignment, andAnotherOne
}
}
def localvar = 1
boundvar1 = 1
def someMethod(){
localMethodVar = 1
boundvar2 = 1
}</pre>&nbsp;</li><li>注意，这里有个规则：在Groovy中，比如你给一个动态类型分配了number类型的值，就不能再用String的类型了 ，反之亦然（在后面的章节会说明原因）。</li></ol><ul><li>Referencing and dereferencing fields</li></ul><ol><li>在Groovy中你可以通过<strong>obj.fieldName</strong>来引用变量，同时他提供了额外的能力，你可以使用下标运算符来引用，示例：<pre name="code" class="java">class Counter {
public count = 0
}
def counter = new Counter()
counter.count = 1
assert counter.count == 1
def fieldName = 'count'
counter[fieldName] = 2
assert counter['count'] == 2</pre>&nbsp;</li></ol>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/155699#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jan 2008 16:28:41 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/155699</link>
        <guid>http://openmouse.javaeye.com/blog/155699</guid>
      </item>
      <item>
        <title>Groovy（Java笨狗）系列--datatypes</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/154858" style="color:red;">http://openmouse.javaeye.com/blog/154858</a>&nbsp;
          发表时间: 2008年01月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <ul><li><strong>Java&rsquo;s type system&mdash;primitives and references(原始值和引用)</strong></li></ul><ol><li>在Groovy中，一切都是对象。</li><li>Java 区分<strong>primitive types</strong> (比如：int, double, char, and byte) and <strong>reference types</strong> (比如: Object and String)。</li><li>对于<strong>primitive types</strong> (比如：int, double, char, and byte)，他们只能定义相应的变量类型，而且不会存在方法。</li><li><strong>reference types（除了</strong><strong>primitive types的任何类型</strong><strong>）。</strong></li><li>另一方面，操作符，比如a+b,a*b..只支持原始类型而不支持引用类型（当然也有例外，比如&rdquo;+&ldquo;支持String）。</li><li>对于<strong>primitive types</strong>类型的操作，他们有相应的包装类型，当你从int到Integer,或者其他类型，都需要进行转换。<pre name="code" class="java">// Java code!
ArrayList results = new ArrayList();
for (int i=0; i &lt; listOne.size(); i++)
{
Integer first = (Integer)listOne.get(i);
Integer second = (Integer)listTwo.get(i);
int sum = first.intValue()+second.intValue();
results.add (new Integer(sum));
}</pre>&nbsp;上面的代码进行了转换，得到相应的结果。那么看下Groovy对于一些都是对象这句话，是怎么做的，稍后会跟大家说下其中的原理。<pre name="code" class="java">results.add (first.plus(second))</pre>&nbsp;上面的代码，其实没有任何的转换操作，很简单的运用了Groovy内置的方法来实现。<pre name="code" class="java">// Java
int sum = first.intValue()+second.intValue();
results.add (new Integer(sum));</pre>&nbsp;<pre name="code" class="java">//Groovy Code

results.add (first + second)</pre>&nbsp;</li><li>为了使Groovy完全面向对象，Groovy中移除了<strong>primitive types，</strong>任何时候，你在Groovy代码中看到类似于<strong>primitive types</strong>的变量，比如： number值为 5, 或者 Boolean 值为true，这些都是引用了适当的包装类型。</li></ol><ul><li>automatic boxing and unboxing（自动装箱，拆箱）</li></ul><ol><li>或许automatic boxing and unboxing你在使用C#或者其他语言中碰到过。</li><li>转换<strong>primitive value</strong> 到包装类型实例i叫<strong>boxing</strong>。</li><li>倒转过来从一个包装类型到<strong>primitive value</strong>叫<strong>unboxing。</strong></li><li><strong>Groovy</strong>完成这些操作都是自动的。</li><li>你已经知道，Groovy被设计成能和Java很好一起工作的语言。因此当Java方法取得primitive参数或者返回primitive发生了什么？我们该怎样从Groovy中调用那些方法？考虑已存在的方法<strong>java.lang.String class: int indexOf (int ch).</strong>在Groovy中你可以这样来使用：<pre name="code" class="java">assert 'ABCDE'.indexOf(67) == 2</pre>&nbsp;以Groovy的观点来看，上面传递了包含67的Integer，虽然方法中希望的值类型为int.其实这也就是Groovy中的装箱和拆箱自动完成的效果</li><li>通过图，我们来更好的理解他们之间的自动装箱和拆箱机制：<img src="../../../upload/picture/pic/6849/38e72039-1f3d-3294-aded-9df7a2c22055.bmp" alt="" /></li><li>同时附上Groovy类型图标：<img src="../../../upload/picture/pic/6851/d9a26f5f-58ec-3273-bd5b-0bd6867967e5.bmp" height="265" alt="" width="523" /></li><li>因为上面图表的都是Object,你就可以使用它们的方法了，同时，Groovy也支持操作符重载，你既可以使用方法来让两个数相加，同时也可以使用&rdquo;+&ldquo;实现两数相加，这些都是允许的。当然还有更多运算符。</li></ol>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/154858#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Jan 2008 20:17:07 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/154858</link>
        <guid>http://openmouse.javaeye.com/blog/154858</guid>
      </item>
      <item>
        <title>Grails（Java笨狗）系列---The Application Domain</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/153645" style="color:red;">http://openmouse.javaeye.com/blog/153645</a>&nbsp;
          发表时间: 2008年01月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>任何面向对象语言，不管是桌面，Server,Mobile 应用程序，Domain在程序中都是重要的。</p><p>Domain是任何企业应用的核心，比如在书店应用中需要Book,在购物应用中需要Order，这些企业实体相互关联着，他们的状态可以被保存，或者在以后的某个时刻被取回。</p><p>在OOP中，Object拥有属性，字段，方法。数据库中的表格拥有Columns和primary keys。如果你使用过ORM，那么对象与数据库的映射将非常的简单。</p><p>Grails是构建在Spring+Hibernate之上的,不过他提供了一种更简单的映射Grails Object-Relational<br />Mapping (GORM)。</p><p>Grails使用Hibernate&rsquo;高度定制配置APIs，考虑更加容易使用ORM映射， 通过运用规约的力量使用新的映射战略叫Grails Object-relational Mapping (GORM)。</p><p>Domain class 可以通过命令行 <a href="file:///G:/%E5%BC%80%E5%8F%91%E8%B5%84%E6%96%99/Grails/grails-docs-1.0-RC3/ref/Command%20Line/create-domain-class.html" class="commandLine">create-domain-class</a>创建:</p><pre name="code" class="xml">grails create-domain-class Person</pre><p>&nbsp;他将创建一个路径为 grails-app/domain/Person.groovy 的类：</p><pre name="code" class="java">class Person {	
}</pre><p>&nbsp; 假如你在 <a href="file:///G:/%E5%BC%80%E5%8F%91%E8%B5%84%E6%96%99/Grails/grails-docs-1.0-RC3/guide/single.html#3.3%20The%20DataSource" class="guide">DataSource</a>设置了 dbCreate property 为 &quot;update&quot;, &quot;create&quot; or &quot;create-drop&quot; &nbsp;<a href="file:///G:/%E5%BC%80%E5%8F%91%E8%B5%84%E6%96%99/Grails/grails-docs-1.0-RC3/guide/single.html#3.3%20The%20DataSource" class="guide"></a>, Grails w将自动产生修改你的数据表格。</p><p>你可以通过添加属性来定制你的Domain class：</p><pre name="code" class="java">class Person {	
	String name
	Integer age
	Date lastVisit
}</pre><ul><li>&nbsp;<a name="5.1.1 Basic CRUD" title="5.1.1 Basic CRUD"></a>Basic CRUD</li><li><a name="5.1.1 Basic CRUD" title="5.1.1 Basic CRUD"></a></li></ul><p>基本的CRUD (Create/Read/Update/Delete) 操作.&nbsp;</p><ol><li><h4>Create：设置Domain属性 然后调用 <a href="file:///G:/%E5%BC%80%E5%8F%91%E8%B5%84%E6%96%99/Grails/grails-docs-1.0-RC3/ref/Domain%20Classes/save.html" class="domainClasses">save</a>方法保存到数据库中（利用潜在的hibernate ORM层）:</h4><pre name="code" class="java">def p = new Person(name:&quot;Fred&quot;, age:40, lastVisit:new Date())
p.save()</pre>&nbsp;注意Groovy中new一个对象与Java中的差别，这点，会在相应的Groovy系列教材中讲到。</li><li><h4>Read：Grails 会自动添加一个&nbsp; id property 在你的 domain class ，通过id来取得对应的Domain class:</h4><pre name="code" class="java">def p = Person.get(1)
assert 1 == p.id</pre></li><li><h4>Update：更新某个实体, 先设置其属性然后再次调用 <a href="file:///G:/%E5%BC%80%E5%8F%91%E8%B5%84%E6%96%99/Grails/grails-docs-1.0-RC3/ref/Domain%20Classes/save.html" class="domainClasses">save</a> 方法:</h4><pre name="code" class="java">def p = Person.get(1)
p.name = &quot;Bob&quot;
p.save()</pre>&nbsp;</li><li><h4>Delete：删除实体通过 <a href="file:///G:/%E5%BC%80%E5%8F%91%E8%B5%84%E6%96%99/Grails/grails-docs-1.0-RC3/ref/Domain%20Classes/delete.html" class="domainClasses">delete</a> 方法:</h4><pre name="code" class="java">def p = Person.get(1)
p.delete()</pre>&nbsp;</li></ol><ul><li><h2><a name="5.2 Domain Modelling in GORM" title="5.2 Domain Modelling in GORM"></a>Domain Modelling in GORM</h2></li></ul><p><a name="5.2 Domain Modelling in GORM" title="5.2 Domain Modelling in GORM"></a>下面我们来看下怎么样设计 domain in GORM. </p><ol><li>创建a domain class 你可以在命令行提示符中运行 <a href="file:///G:/%E5%BC%80%E5%8F%91%E8%B5%84%E6%96%99/Grails/grails-docs-1.0-RC3/ref/Command%20Line/create-domain-class.html" class="commandLine">create-domain-class</a> （必须在项目路径下使用此命令行，谨记！！！）: <br /><pre name="code" class="xml">grails create-domain-class Book</pre>&nbsp;结果一个 class 将在你的项目路径grails-app/domain/Book.groovy下被创建:<pre name="code" class="java">class Book {	
}</pre>&nbsp;注：假如你想创建packages，只需要把class移动到你相应的packages中，不过必须是在grails-app/domain下，然后按照Java的packages规则来声明packages。上面的Class被自动映射到一个名为book的数据表格中 (和class同样的名字，当然它是小写的).上面这些都是通过<a href="file:///G:/%E5%BC%80%E5%8F%91%E8%B5%84%E6%96%99/Grails/grails-docs-1.0-RC3/guide/single.html#5.5.2%20Custom%20ORM%20Mapping" class="guide">ORM Domain Specific Language</a>规约产生的。</li><li>现在可以使用 Java类型来定义你的 properties<pre name="code" class="java">class Book {
	String title
	Date releaseDate
	String ISBN
}</pre>每个属性将被映射到 数据库对应表格的column中。这里有个规约：每个 column名字都是小写的，除了class的 properties使用的&ldquo;驼峰&rdquo;书写方式的 properties名字就需要使用&ldquo;&mdash;&rdquo;符号了。比如： releaseDate将被自动写成 release_date。但是你也可以通过<a href="file:///G:/%E5%BC%80%E5%8F%91%E8%B5%84%E6%96%99/Grails/grails-docs-1.0-RC3/guide/single.html#7.1%20Declaring%20Constraints" class="guide">Constraints</a> or&nbsp; <a href="file:///G:/%E5%BC%80%E5%8F%91%E8%B5%84%E6%96%99/Grails/grails-docs-1.0-RC3/guide/single.html#5.5.2%20Custom%20ORM%20Mapping" class="guide">ORM DSL</a>.定制。&nbsp; </li></ol><ul><li><a name="5.2.1 Association in GORM" title="5.2.1 Association in GORM"></a>GORM中的关联：</li></ul><ol><li><h2><a name="5.2.1.1 One-to-one" title="5.2.1.1 One-to-one"></a>One-to-one</h2></li></ol><pre name="code" class="java">class Face {
    Nose nose
}
class Nose {	
}</pre>&nbsp;上面，我们使用了单向one-to-one 关联从 Face 到 Nose. 如果使用双向one-to-one 关联，看下面的代码：<pre name="code" class="java">class Face {
    Nose nose
}
class Nose {	
	Face face
}</pre>&nbsp;上面两段代码都很容易理解。下面我们看下第3段代码：<pre name="code" class="java">class Face {
    Nose nose
}
class Nose {	
	static belongsTo = [face:Face]
}</pre><p>上面我们使用了&ldquo; belongsTo &rdquo;，设置 Nose &quot;属于&quot; Face.</p><pre><span class="java-keyword">new</span> Face(nose:<span class="java-keyword">new</span> Nose()).save()</pre><p>保存Face的同时，必须要保存Nose，因为这里是一个&ldquo; belongsTo &rdquo;关系，假如你使用下面的代码：</p><pre><span class="java-keyword">new</span> Nose(face:<span class="java-keyword">new</span> Face()).save() // will cause an error</pre><p>将会产生错误。</p><p>就拿客户和订单来做比较，当然这里是使用一对一的，一个客户对应一个订单，保存客户的同时，你得把它的订单一起保存，因为这个订单是属于某个客户的，倒转过来思维，因为订单没有设置belongsTo，也就是说他不会关心他的客户是谁，可以把belongsTo这个看作是某个class的属性，如果你保存一个没有的属性当然会出错，不知道大家能不能理解，这个是我自己的意思。</p><p>继续：</p><pre>def f = Face.get(1)
f.delete() // both Face and Nose deleted</pre><p>&nbsp;</p><p>删除某个Faces会同时删除对应的Nose,反过来不成立。就如上面所说的，既然某个Nose是某个Face的属性，因为设置了belongsTo，我们暂时这样来理解，如果客户都不存在，订单还有存在的价值吗，其实也就是一个class被删除了，属于他的属性还会继续存在吗？</p>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/153645#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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, 07 Jan 2008 23:03:09 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/153645</link>
        <guid>http://openmouse.javaeye.com/blog/153645</guid>
      </item>
      <item>
        <title>一点感受</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/153399" style="color:red;">http://openmouse.javaeye.com/blog/153399</a>&nbsp;
          发表时间: 2008年01月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          有时觉得翻译，比看书辛苦多了，最好能口述，有人做笔记<img src="/images/smiles/icon_biggrin.gif"/><br />突然想翻译Prototype1.6这本书<br />可能没接触过脚本语言的朋友对于脚本语言存在抵触心理，而当他们真正的理解一个脚本语言，比如Protottype，或者其他后，可能对于更好地理解Groovy on Grails会有帮助。不过还是以后再说吧，太辛苦了，又要打字又要去看这个字名词，动词，形容词的不同意思，才能准确的理解语义。
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/153399#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jan 2008 21:45:43 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/153399</link>
        <guid>http://openmouse.javaeye.com/blog/153399</guid>
      </item>
      <item>
        <title>Groovy（Java笨狗）系列--Class，Scripts</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/153393" style="color:red;">http://openmouse.javaeye.com/blog/153393</a>&nbsp;
          发表时间: 2008年01月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>Class</strong>是<strong>OOP</strong>编程的基础。</p><p>现在我们开始<strong>Class</strong>。</p><p>下面我们定义一个简单的Groovy类：</p><pre name="code" class="java">class Book {
private String title
Book (String theTitle) {
title = theTitle
}
String getTitle(){
return title
}
}</pre><p>在上面的Book类中，其实和我们平常的Java类没什么区别，定义了title属性，构造函数，get方法，完全是Java中的一个简单JavaBean.当然，Groovy中的类远不止这么简单，因为我在前面说过，学习一种编程语言，就如学习一门新的外语，假如，你所学的外语接近你的母语，相信，你能更快的熟悉这门语言。</p><p>&nbsp;</p><p>对于脚本语言可能存在一种误解，因为脚本语言提供一种宽松的类型定义和让人感到惊奇的简短语法，它可能更适合作为黑客们（<span style="font-weight: bold">Hackers</span>）的玩具而不是严谨的OOP语言。这种声音可能源于使用<span style="font-weight: bold">shell scripts</span>或者早期的<span style="font-weight: bold">Perl，</span>对于封装的缺乏，对于<span style="font-weight: bold">OOP</span>代码管理上的缺乏，代码的频繁复制，隐藏的模糊不清的<span style="font-weight: bold">Bugs.</span>不能帮助我们使用已有的代码来运用组合继承。</p><p>随着时间的推移，脚本语言的前景开始引人注目了。<span style="font-weight: bold">Perl</span>添加了对<span style="font-weight: bold">OOP</span>的支持，<span style="font-weight: bold">Python</span>扩展了对OOP的支持，最近的Ruby,也成为完全的OOP语言。</p><p>当然我们的Groovy也是一种完全的OOP语言。它不但增强了Java的脚本语言能力，而且带来了新的OOP特性。比如Java的原始类型在Groovy中的改变，引入了<span style="font-weight: bold">Ranges</span>和<span style="font-weight: bold">closures（闭包）</span>，为<span style="font-weight: bold">Collections</span>的使用提供了更简单的方法。</p><p>&nbsp;</p><p>Groovy中定义<span style="font-weight: bold">Class</span>和<span style="font-weight: bold">Java</span>差不多，通过class关键字来定义<span style="font-weight: bold">Class.Class</span>中包含了<span style="font-weight: bold">contain fields</span>, <span style="font-weight: bold">constructors</span>, <span style="font-weight: bold">initializers</span>,&nbsp; <span style="font-weight: bold">methods。</span>而对于<span style="font-weight: bold">Scripts（脚本）</span>不同（哈哈，现在才开始说道<span style="font-weight: bold">Scripts（脚本）</span>），提供了额外的灵活度也带来了一定的限制，它即包含了代码，变量的定义，方法的定义又包含了Class定义。</p><p>&nbsp;</p><p>在Java,Groovy都拥有<span style="font-weight: bold">local variables</span>，他们作为方法一部分存在。</p><p>对于<span style="font-weight: bold">variables（变量）</span>它必须在使用前被声明（除了<span style="font-weight: bold">Scripts</span>），这样可以强制范围和拼写错误。声明<span style="font-weight: bold">variables（变量）</span>包括指定name，可选的类型声明，修饰符，赋原始值，定义了变量后，就可以通过他们的名字来引用了。</p><p>而在<span style="font-weight: bold">Scripts（脚本）</span>中可以使用未声明的<span style="font-weight: bold">variables（变量）。（待续，今天没多少时间）</span></p><p>&nbsp;</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/153393#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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jan 2008 21:10:24 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/153393</link>
        <guid>http://openmouse.javaeye.com/blog/153393</guid>
      </item>
      <item>
        <title>Groovy on Grails群</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/153305" style="color:red;">http://openmouse.javaeye.com/blog/153305</a>&nbsp;
          发表时间: 2008年01月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          群：50059426<br />希望更多喜欢Groovy on Grails进来一起讨论
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/153305#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jan 2008 10:56:18 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/153305</link>
        <guid>http://openmouse.javaeye.com/blog/153305</guid>
      </item>
      <item>
        <title>Groovy（Java笨狗）系列---断言</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/153181" style="color:red;">http://openmouse.javaeye.com/blog/153181</a>&nbsp;
          发表时间: 2008年01月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>假如你使用过JDK1.4或者更高版本，你一定熟悉assertions（断言）。。通常，他会在你的代码中测试你的逻辑是否矛盾和正确。</p><p>接下来我们通过实例来学习Groovy中的断言，在学习之前，请务必记住assert这个关键字。</p><pre name="code" class="java">assert(true) 
assert 1 == 1
def x = 1
assert x == 1
def y = 1 ; assert y == 1</pre><p>请注意，def关键字类似与JavaScript中的var.用来定义动态变量。</p><p>下面我们来一行一行的解释：</p><p>&nbsp;&nbsp;</p><pre name="code" class="java">assert(true)</pre><p>&nbsp;传递一个参数给断言，这里返回true;</p><pre name="code" class="java">assert 1 == 1</pre><p>&nbsp;在这里我们省略了圆括号，因为这个是可选的，注意Groovy的&ldquo;==&rdquo;与Java中的含义不同，留在后面的教材里讲解。</p><pre name="code" class="java">def x = 1
assert x == 1</pre><p>&nbsp;先定义一个变量x，赋值1，判断x是否为1.</p><p>&nbsp;</p><pre name="code" class="java">def y = 1 ; assert y == 1</pre><p>&nbsp;同上。</p><p>&nbsp;</p><p>&nbsp;<strong>assertions的目的：</strong></p><table border="0"><tbody><tr><td>■ <strong>显示当前的程序状态。</strong><br />■<strong> 更好的替换注释，因为它同时担起验证的责任</strong><br /></td></tr></tbody></table><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/153181#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Jan 2008 18:14:18 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/153181</link>
        <guid>http://openmouse.javaeye.com/blog/153181</guid>
      </item>
      <item>
        <title>Groovy（Java笨狗）系列---注释，语法，包导入机制</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou</a>&nbsp;
          链接：<a href="http://openmouse.javaeye.com/blog/153114" style="color:red;">http://openmouse.javaeye.com/blog/153114</a>&nbsp;
          发表时间: 2008年01月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>学习一门新的编程语言，就像学习一门新的外语。你必须面对新的词汇量，语法，方言。而Groovy能和Java无缝的结合在一起，Java能调用Groovy,Groovy能调用Java,而且语法上是类似而友好的，这为你学习Groovy无疑平滑的。那么现在我们就开始Groovy的学习吧。</p><ul><li><strong>Commenting Groovy code</strong></li></ul><ol><li>单行注释和多行注释就和Java一样，唯一不同的是Groovy多了一个首行注释。<pre name="code" class="java">#!/usr/bin/groovy（首行注释，必须出现在第一行）

// some line comment（单行注释）

/*                              （多行注释）
some multiline
comment
*/</pre>&nbsp;</li><li>一些指导方针来书写注释.<br /><table border="0" height="85" width="520"><tbody><tr><td>■&nbsp; <strong>#! </strong>注释只允许出现在第一行 ，允许Unix shells 定位 <strong>Groovy bootstrap script</strong>&nbsp; 通过它来运行代码<br />■ <strong>// </strong>单行注释<br />■<strong>/* &hellip; */</strong> 多行注释.<br />■<strong> /** &hellip; */</strong> Javadoc，Groovydoc注释。<br /></td></tr></tbody></table></li><li>一些Groovy代码--但不完全是--看上去完全像Java代码。这经常导致一些错误的结论---Groovy语法是Java语法的扩展子集。尽管类似，但他们谁也不是谁的子集。例如，Groovy不支持Java中的for(init;test;inc)</li><li>相对于稍微的不同，其实Java的绝大部分语法是Groovy语法的一部分：<table border="0"><tbody><tr><td>■ <strong>普通的包导入机制</strong><br />■<strong> Statements</strong> (i包括 <strong>package </strong>and <strong>import </strong>语句)<br />■ <strong>Class and method</strong> 定义 (除了嵌套Class)<br />■ <strong>控制结构</strong> (除了for(init;test;inc) )<br />■ <strong>操作符</strong>, <strong>表达式</strong>, and <strong>赋值</strong><br />■ <strong>异常处理</strong><br />■ <strong>字符声明 </strong><br />■ <strong>对象实例化</strong>, <strong>应用</strong>，<strong> 解除对象, 方法调用</strong><br /></td></tr></tbody></table></li><li>Groovy增加的语法部分，这些添加的部分是Groovy代码更简洁易懂<table border="0" height="115" width="298"><tbody><tr><td>■ <strong>通过新的表达式和操作符更加容易的访问对象<br />■ 允许更多的方法声明对象<br />■ 提供新的控制结构使用高级流控制<br />■ 引入新的数据类型与表达式和操作符一起工作<br />■Groovy中的一切都是对象</strong></td></tr></tbody></table></li></ol><ul><li><strong>通过简洁让语法更美好</strong></li></ul><ol><li><strong>Groovy</strong>允许你省略掉一些Java中必须的语法。省略这些使语法更简洁，不冗长，更具有表达力，例如：<pre name="code" class="java"><strong>Java:</strong>
java.net.URLEncoder.encode(&quot;a b&quot;);</pre>&nbsp;<pre name="code" class="java"><strong>Groovy:</strong>
URLEncoder.encode 'a b'</pre>&nbsp;上面的代码不单是简洁了，而且更直接的方式的表达了我们的意思，省略了包导入机制，圆括号，分号。代码最小化了。然而，这可能对我们习惯使用Java语法的人来说，直觉上有点不舒服（也有可能产生语法上的误解，比如优先机制），而Groovy看出了我们的心思，上面这些都是可选的，意思就是，你可以使用或者不使用。</li><li>Groovy自动导入下面的类包：<br /><table border="0" height="130" width="270"><tbody><tr><td><strong>groovy.lang.*<br />groovy.util.*<br />java.lang.*<br />java.util.*<br />java.net.*<br />java.io.*<br />java.math.BigInteger<br />java.math.BigDecimal</strong><br /></td></tr></tbody></table>这样你可以使用这些包，而不用再去导入了。</li></ol>
          <br/>
          <span style="color:red;">
            <a href="http://openmouse.javaeye.com/blog/153114#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 04 Jan 2008 16:16:27 +0800</pubDate>
        <link>http://openmouse.javaeye.com/blog/153114</link>
        <guid>http://openmouse.javaeye.com/blog/153114</guid>
      </item>
      <item>
        <title>Grails（Java笨狗）系列---Grails Getting Started（1）</title>
        <author>Javabengou</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openmouse.javaeye.com">Javabengou<