﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;h3 style="font-family: Comic Sans MS"&gt;&lt;font color="#FA1A0A" size="10"&gt;︻┳═一Java&lt;/font&gt;&lt;/h3&gt;-随笔分类-Groovy&amp;Grails</title><link>http://www.blogjava.net/rain1102/category/37638.html</link><description>&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;子曰：危邦不入，乱邦不居。天下有道则见，无道则隐。&lt;/font&gt;&lt;font color="#3C1435"&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Sun, 04 Apr 2010 02:26:21 GMT</lastBuildDate><pubDate>Sun, 04 Apr 2010 02:26:21 GMT</pubDate><ttl>60</ttl><item><title>Grails五行代码实现图片上传与展示</title><link>http://www.blogjava.net/rain1102/archive/2010/04/01/317219.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 01 Apr 2010 11:52:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2010/04/01/317219.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/317219.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2010/04/01/317219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/317219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/317219.html</trackback:ping><description><![CDATA[<p>域中写如下代码：<font color="#ff3300"><code><br />
class Something{<br />
byte[] image<br />
}</code></font></p>
<p>控制器中展示图片的方法</p>
<p><font color="#ff3300"><code>def image= {<br />
def something = Something.get( params.id )<br />
byte[] image = something.image<br />
response.outputStream &lt;&lt; image<br />
}<br />
</code></font></p>
<p>页面展示</p>
<p><font color="#ff3300"><code>&lt;img src="${createLink(controller:'something', action:'image', id: something.id)}"/&gt;</code></font></p>
<!--adcode--><img src ="http://www.blogjava.net/rain1102/aggbug/317219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2010-04-01 19:52 <a href="http://www.blogjava.net/rain1102/archive/2010/04/01/317219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Grails和Rome产生Rss [转载]</title><link>http://www.blogjava.net/rain1102/archive/2008/09/07/227606.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Sun, 07 Sep 2008 14:53:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/09/07/227606.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/227606.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/09/07/227606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/227606.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/227606.html</trackback:ping><description><![CDATA[<p>Grails本身好像并没有产生rss的插件。如果要用grails产生Rss，可以使用Rome。方法大概如下：</p>
<h2>下载需要的库文件</h2>
<p>到<a href="https://rome.dev.java.net/">https://rome.dev.java.net/</a>下载Rome，之后把rome-xxx.jar放到你的grails项目的lib目录下。这里xxx是版本号。比如我的是rome-1.0RC1.jar</p>
<p>再到<a href="http://www.jdom.org/">http://www.jdom.org/</a>下载JDom。之后同样是把jdom.jar放到lib目录下。</p>
<h2>书写代码</h2>
<p>创建一个controller，当然你也可以在你已经有的controller里面增加相应方法。这里我们创建一个叫做FeedController的类。<br />
<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.sun.syndication.feed.synd.</span><span style="color: #000000">*</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.sun.syndication.io.SyndFeedOutput;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;FeedController&nbsp;{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;supportedFormats&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">rss_0.90</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">rss_0.91</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">rss_0.92</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">rss_0.93</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">rss_0.94</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">rss_1.0</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">rss_2.0</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">atom_0.3</span><span style="color: #000000">"</span><span style="color: #000000">]&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;rss&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;render(text:&nbsp;getFeed(</span><span style="color: #000000">"</span><span style="color: #000000">rss_1.0</span><span style="color: #000000">"</span><span style="color: #000000">),&nbsp;contentType:</span><span style="color: #000000">"</span><span style="color: #000000">text/xml</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;encoding:</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;atom&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;render(text:&nbsp;getFeed(</span><span style="color: #000000">"</span><span style="color: #000000">atom_1.0</span><span style="color: #000000">"</span><span style="color: #000000">),&nbsp;contentType:</span><span style="color: #000000">"</span><span style="color: #000000">text/xml</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;encoding:</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;or&nbsp;specify&nbsp;your&nbsp;own&nbsp;feed&nbsp;type&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;all&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;format&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;params.id&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">26</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(supportedFormats.contains(format))&nbsp;{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">27</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;render(text:&nbsp;getFeed(format),&nbsp;contentType:</span><span style="color: #000000">"</span><span style="color: #000000">text/xml</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;encoding:</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">28</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.sendError(response.SC_FORBIDDEN);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">31</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">32</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">33</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">34</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;getFeed(feedType)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">35</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">36</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;items&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Post.list(max:&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">,&nbsp;sort:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">created</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;order:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">desc</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">37</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">38</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;entries&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;[]&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">39</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;items.each&nbsp;{&nbsp;item&nbsp;</span><span style="color: #000000">-&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">40</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;desc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SyndContentImpl(type:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">text/plain</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;value:&nbsp;item.description);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">41</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;entry&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SyndEntryImpl(title:&nbsp;item.name&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;-&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;item.summary,&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">42</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">http://www.ondev.net/item/show/</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;item.name,&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">43</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;publishedDate:&nbsp;item.created,&nbsp;description:&nbsp;desc);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">44</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entries.add(entry);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">45</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">46</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">47</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SyndFeed&nbsp;feed&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SyndFeedImpl(feedType:&nbsp;feedType,&nbsp;title:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">标题</span><span style="color: #000000">'</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">48</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">http://www.ondev.net</span><span style="color: #000000">'</span><span style="color: #000000">,&nbsp;description:&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">说明性文字</span><span style="color: #000000">'</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">49</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entries:&nbsp;entries);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">50</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">51</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringWriter&nbsp;writer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringWriter();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">52</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SyndFeedOutput&nbsp;output&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SyndFeedOutput();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">53</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.output(feed,writer);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">54</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.close();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">55</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">56</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;writer.toString();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">57</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">58</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">59</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">60</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">61</span>&nbsp;<span style="color: #000000">}&nbsp;&nbsp;<br />
</span><span style="color: #008080">62</span>&nbsp;</div>
<br />
<p>之后访问相应的页面，比如说<a href="http://www.ondev.net/feed/rss"><font color="#002c99">http://www.ondev.net/feed/rss</font></a>就可以了<br />
<br />
原贴地址： <a href="http://www.ondev.net/story/show/75">http://www.ondev.net/story/show/75</a><br />
</p><img src ="http://www.blogjava.net/rain1102/aggbug/227606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-09-07 22:53 <a href="http://www.blogjava.net/rain1102/archive/2008/09/07/227606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>给Grails添加验证码插件之jcaptcha-1.0</title><link>http://www.blogjava.net/rain1102/archive/2008/08/28/225433.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 28 Aug 2008 14:54:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/08/28/225433.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/225433.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/08/28/225433.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/225433.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/225433.html</trackback:ping><description><![CDATA[JCaptcha Plugin ：基于 JCaptcha 开源图片和音频验证码项目的Grails插件<br />
而jcaptcha-1.0终于出来了. 比起0.2轻量了很多, 而且0.2里面有不少无用的东西...<br />
现在grails-app下面主要的文件就剩下JcaptchaController.groovy, JcaptchaService.groovy, JcaptchaTagLib.groovy了.<br />
JcaptchaTagLib.groovy里面其实也就定义了两个标签, 一个用户图片验证(jpeg), 一个用于语音验证(wav).<br />
JcaptchaController.groovy里面则定义了主要两个action(jpeg和wav)用于JcaptchaTagLib.groovy的两个标签调用.<br />
JcaptchaService.groovy则定义了四个常用方法, 主要是boolean validateResponse(captchaName, id, response)用于验证输入验证码是否正确<br />
<br />
下面看看使用验证码代码:<br />
首先需要在Config.groovy, 添加:<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.awt.Font<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.awt.Color<br />
import com.octo.captcha.service.multitype.GenericManageableCaptchaService<br />
import com.octo.captcha.engine.GenericCaptchaEngine<br />
import com.octo.captcha.image.gimpy.GimpyFactory<br />
import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator<br />
import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage<br />
import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator<br />
import com.octo.captcha.component.image.backgroundgenerator.GradientBackgroundGenerator<br />
import com.octo.captcha.component.image.color.SingleColorGenerator<br />
import com.octo.captcha.component.image.textpaster.NonLinearTextPaster<br />
<br />
jcaptchas {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imageCaptcha = new GenericManageableCaptchaService(&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new GenericCaptchaEngine(&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new GimpyFactory(&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new RandomWordGenerator(&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"abcdefghijklmnopqrstuvwxyz1234567890"&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new ComposedWordToImage(&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new RandomFontGenerator(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000">&nbsp;// 生成图片文字的字体以及字号大小，可以是多种字体，会随机出现。<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20, // min font size&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;30, // max font size&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[new Font("Arial", 0, 10)] as Font[]&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new GradientBackgroundGenerator(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000">// 配置验证图片的大小和背景色以及过渡色<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;140, // width&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;35, // height&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new SingleColorGenerator(new Color(255, 255, 255)),&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new SingleColorGenerator(new Color(200, 200, 200))&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new NonLinearTextPaster(&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4, // minimal length of text&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4, // maximal length of text&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Color(11, 11, 11)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180, // minGuarantedStorageDelayInSeconds&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;180000 // maxCaptchaStoreSize&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;) <br />
}&nbsp;<br />
<br />
页面中添加:<br />
&lt; input id="captchaResponse" maxlength="30" name="captchaResponse" type="text" /&gt;<br />
<span style="color: #008000">&lt; jcaptcha:jpeg name="imageCaptcha" width="100px" height="25px" &gt;&lt; /jcaptcha:jpeg &gt; <br />
</span><br />
Controller里面要做验证<br />
if (!<span style="color: #008000">jcaptchaService.validateResponse("imageCaptcha", session.id, params.captchaResponse</span><span style="color: #008000">)</span>){<br />
&nbsp;&nbsp;&nbsp;&nbsp;flash.message = message(code:'pinpin.login.invalid.jcaptcha')<br />
&nbsp;&nbsp;&nbsp;&nbsp;return<br />
}<img src ="http://www.blogjava.net/rain1102/aggbug/225433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-08-28 22:54 <a href="http://www.blogjava.net/rain1102/archive/2008/08/28/225433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>groovy中list去除重复数据</title><link>http://www.blogjava.net/rain1102/archive/2008/08/02/219567.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Sat, 02 Aug 2008 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/08/02/219567.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/219567.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/08/02/219567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/219567.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/219567.html</trackback:ping><description><![CDATA[以前在java里面要想去除list中的重复数据可以使用两种方式实现:<br />
1. 循环list中的所有元素然后删除重复<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font face="Georgia"><span style="color: #0000ff"><span style="color: #008000"><font face="Georgia">public &nbsp; static&nbsp;&nbsp;&nbsp;List&nbsp;&nbsp;removeDuplicate(List&nbsp;list)&nbsp; </font><span id="Codehighlighter1_66_268_Open_Text"><font face="Georgia">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for &nbsp;( int &nbsp;i&nbsp; = &nbsp; 0 ;&nbsp;i&nbsp; &lt; &nbsp;list.size()&nbsp; - &nbsp; 1 ;&nbsp;i ++ )&nbsp; </font><span id="Codehighlighter1_112_238_Open_Text"><font face="Georgia">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for &nbsp;( int &nbsp;j&nbsp; = &nbsp;list.size()&nbsp; - &nbsp; 1 ;&nbsp;j&nbsp; &gt; &nbsp;i;&nbsp;j -- )&nbsp; </font><span id="Codehighlighter1_159_234_Open_Text"><font face="Georgia">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if &nbsp;(list.get(j).equals(list.get(i)))&nbsp; </font><span id="Codehighlighter1_202_229_Open_Text"><font face="Georgia">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;list.remove(j);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font> </span><br />
<font face="Georgia">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}</font> </span><br />
<font face="Georgia">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}</font>&nbsp;</span><br />
<font face="Georgia">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return list;<br />
&nbsp;&nbsp;&nbsp; }</font> </span><br />
</span></span></font>2. 通过HashSet踢除重复元素<br />
&nbsp;&nbsp;&nbsp;<span style="color: #008000">&nbsp;<font face="Georgia"><span style="color: #008000"><font face="Georgia">public &nbsp; static&nbsp;&nbsp;&nbsp;List&nbsp;&nbsp;removeDuplicate(List&nbsp;list)&nbsp; </font><span id="Codehighlighter1_66_159_Open_Text"><font face="Georgia">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HashSet&nbsp;h&nbsp; = &nbsp; new </font><font face="Georgia">&nbsp;HashSet(list);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.clear();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.addAll(h);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return list;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></span></font><span id="Codehighlighter1_66_159_Open_Text" style="color: #000000"> <br />
在groovy中当然也可以使用上面的两种方法, 但groovy自己提供了unique方法来去除重复数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;def list = [1, 2, 3, 2, 4, 1, 5]<br />
&nbsp;&nbsp;&nbsp;&nbsp;list.<span style="color: #008000">unique</span>()&nbsp; // [1, 2, 3, 4, 5]</span></span><img src ="http://www.blogjava.net/rain1102/aggbug/219567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-08-02 13:55 <a href="http://www.blogjava.net/rain1102/archive/2008/08/02/219567.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails Yahoo! UI Library (YUI) Plugin</title><link>http://www.blogjava.net/rain1102/archive/2008/07/29/218550.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 29 Jul 2008 14:38:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/29/218550.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/218550.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/29/218550.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/218550.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/218550.html</trackback:ping><description><![CDATA[<p class="paragraph">This plugin provides integration with the Yahoo! UI Library. When installing the plugin, it downloads and installs automatically the latest YUI 2.5.2 distribution in your application, and registers itself to be used with the adapative AJAX tags. It also contains two helper tags to easily include additional YUI javascript and css files as well.
<p class="paragraph"><a name="Installation"></a>
<h2>Installation</h2>
<p class="paragraph">To install the YUI plugin type this command from your project's root folder:
<div class="code">
<pre>grails install-plugin yui</pre>
</div>
The complete YUI distribution is downloaded and installed under your project's web-appjsyui2.5.2 folder.
<p class="paragraph"><a name="Usage"></a>
<h2>Usage</h2>
<p class="paragraph">To use Grails' adaptive AJAX support just add the folowing line in the head section:
<div class="code">
<pre>&lt;g:javascript library=<span class="java-quote">"yui"</span> /&gt;</pre>
</div>
If you want to include additional YUI javascript and css files include them using:
<div class="code">
<pre>&lt;yui:javascript dir=<span class="java-quote">"calendar"</span> file=<span class="java-quote">"calendar-min.js"</span> /&gt;
&lt;yui:javascript dir=<span class="java-quote">"calendar"</span> file=<span class="java-quote">"calendar-min.js"</span> version=<span class="java-quote">"2.5.2"</span> /&gt;
// version to be used in <span class="java-keyword">case</span> multiple version installed
&lt;yui:stylesheet dir=<span class="java-quote">"calendar/assets"</span> file=<span class="java-quote">"calendar.css"</span> /&gt;</pre>
</div>
Refer to the Ajax section of the Grails reference documentation for usage.
<p class="paragraph"><a name="Overriding default javascript files"></a>
<h2>Overriding default javascript files</h2>
<p class="paragraph">By default only yahoo-dom-event.js and connection-min.js are included when using &lt;g:javascript library="yui" /&gt;. Adding additional libraries to the default list can be done in a <a class="createPageLink" href="http://www.grails.org/create/GRAILS%3ABootstrap+Classes">BootStrap (+)</a> class:
<div class="code">
<pre><span class="java-keyword">import</span> org.codehaus.groovy.grails.plugins.web.taglib.JavascriptTagLib
<p class="paragraph">class BootStrap {
def init = { servletContext -&gt;
JavascriptTagLib.LIBRARY_MAPPINGS.yui += [<span class="java-quote">"yui/2.5.2/calendar/calendar-min"</span>,
<span class="java-quote">"yui/2.5.2/container/container-min"</span>]
}
def destroy = {
}
}</p>
</pre>
</div>
It's also possible to replace all default included javascript libraries. For example if you want to use the YUI debug javascript files in development mode:
<div class="code">
<pre><span class="java-keyword">import</span> grails.util.GrailsUtil
<span class="java-keyword">import</span> org.codehaus.groovy.grails.plugins.web.taglib.JavascriptTagLib
<p class="paragraph">class BootStrap {
def init = { servletContext -&gt;
<span class="java-keyword">if</span> (GrailsUtil.isDevelopmentEnv()) {
JavascriptTagLib.LIBRARY_MAPPINGS.yui = [<span class="java-quote">"yui/2.5.2/yahoo/yahoo-debug"</span>,
<span class="java-quote">"yui/2.5.2/dom/dom-debug"</span>,
<span class="java-quote">"yui/2.5.2/event/event-debug"</span>,
<span class="java-quote">"yui/2.5.2/connection/connection-debug"</span>]
}
}
def destroy = {
}
}</p>
</pre>
</div>
<p class="paragraph"><a name="Serving YUI Files from Yahoo! Servers"></a>
<h2>Serving YUI Files from Yahoo! Servers</h2>
<p class="paragraph">It's also possible to serve the javascript from the Yahoo! servers. First delete the yui folder from web-appjs after installing the plugin. Then, in a BootStrap class, override the mapping which contains the javascript files to include by default:
<div class="code">
<pre><span class="java-keyword">import</span> org.codehaus.groovy.grails.plugins.web.taglib.JavascriptTagLib
<p class="paragraph">class BootStrap {
def init = { servletContext -&gt;
JavascriptTagLib.LIBRARY_MAPPINGS.yui = []
}
def destroy = {
}
}</p>
</pre>
</div>
The only drawback is that you need to include the references to the javascript files manually. Probably the easiest way is to do this in the main.gsp layout.
<p class="paragraph"><a name="Upgrading"></a>
<h2>Upgrading</h2>
<p class="paragraph">If you want to upgrade:
<ul class="star">
    <li>Delete the plugin from the project's plugins folder
    <li>(Optional) Delete the previous YUI version folder from web-appjsyui
    <li>Re-install the plugin by executing grails install-plugin yui </li>
</ul><img src ="http://www.blogjava.net/rain1102/aggbug/218550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-29 22:38 <a href="http://www.blogjava.net/rain1102/archive/2008/07/29/218550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails初始化系统数据</title><link>http://www.blogjava.net/rain1102/archive/2008/07/28/218206.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 28 Jul 2008 15:02:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/28/218206.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/218206.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/28/218206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/218206.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/218206.html</trackback:ping><description><![CDATA[<span style="font-size: 7pt; color: black; font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"><span style="font-size: 12pt"><span style="color: black; font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">比如当应用启动时候往user表中添加一条数据,修改</span><span lang="EN-US" style="color: black; font-family: Arial; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"> grails-app\config\BootStrap.groovy </span><span style="color: black; font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">的代码：<br />
&nbsp;
<p style="line-height: 14.25pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 8.5pt; color: black; font-family: 'Lucida Console'"><span style="font-size: 10pt">class BootStrap {</span></span></p>
<p style="line-height: 14.25pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 8.5pt; color: black; font-family: 'Lucida Console'"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; def init = { servletContext -&gt;</span></span></p>
<p style="line-height: 14.25pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 8.5pt; color: black; font-family: 'Lucida Console'"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def user = new Users(id:1,username:'rain'</span></span></p>
<p style="line-height: 14.25pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 8.5pt; color: black; font-family: 'Lucida Console'"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,password:'1102')</span></span></p>
<p style="line-height: 14.25pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 8.5pt; color: black; font-family: 'Lucida Console'"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.password = user.password.encodeAsPassword()</span></span></p>
<p style="line-height: 14.25pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 8.5pt; color: black; font-family: 'Lucida Console'"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user.save()</span></span></p>
<p style="line-height: 14.25pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 8.5pt; color: black; font-family: 'Lucida Console'"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; }</span></span></p>
<p style="line-height: 14.25pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 8.5pt; color: black; font-family: 'Lucida Console'"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; def destroy = { }</span></span></p>
<span style="font-size: 8.5pt; color: black; font-family: 'Lucida Console'"><span style="font-size: 10pt">}</span></span></span></span></span><img src ="http://www.blogjava.net/rain1102/aggbug/218206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-28 23:02 <a href="http://www.blogjava.net/rain1102/archive/2008/07/28/218206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails中使用SHA 对密码加密</title><link>http://www.blogjava.net/rain1102/archive/2008/07/28/218205.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 28 Jul 2008 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/28/218205.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/218205.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/28/218205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/218205.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/218205.html</trackback:ping><description><![CDATA[根据Grails的命名规范, 到<span lang="EN-US">grails-app\utils </span><span>中创建一个名为</span><span> </span><span lang="EN-US">PasswordCodec</span><span lang="EN-US"> </span><span>的</span><span lang="EN-US"> Groovy </span><span>类(强调一下类名必需是</span><span lang="EN-US"> XXXCodec)</span> , 代码如下:<br />
<br />
import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.security.MessageDigest<br />
import sun.misc.BASE64Encoder<br />
/**<br />
&nbsp;*<br />
&nbsp;* @author eric<br />
&nbsp;*/<br />
class PasswordCodec {<br />
&nbsp;&nbsp;&nbsp; static encode = {str -&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageDigest md = MessageDigest.getInstance('SHA')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; md.update(str.getBytes('UTF-8'))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (new BASE64Encoder()).encode(md.digest())<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
写好以后,使用如下:<br />
user.save()user.password = user.password.<span style="color: red">encodeAsPassword</span>()<br />
user.save()<br />
<br />
def user = User.findByUserNameAndPassword(params.userName, params.password.<span style="color: red">encodeAsPassword</span>())<br />
<br />
<br /><img src ="http://www.blogjava.net/rain1102/aggbug/218205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-28 23:00 <a href="http://www.blogjava.net/rain1102/archive/2008/07/28/218205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在NetBeans IDE中创建Grails插件[转]</title><link>http://www.blogjava.net/rain1102/archive/2008/07/28/218004.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 28 Jul 2008 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/28/218004.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/218004.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/28/218004.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/218004.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/218004.html</trackback:ping><description><![CDATA[<p><a id="hello_grails_plugin" name="hello_grails_plugin"></a><strong>Creating a Grails Plugin in NetBeans IDE</strong> <br />
<br />
Let's create a plugin for Grails. Grails is, after all, modular and pluggable. Here's the ultimate simple Grails plugin, just to give an idea what is involved, from start to finish. The most useful references I have found so far are these:
<ul>
    <li>
    <p><a href="http://www.grails.org/The+Plug-in+Developers+Guide">The Plug-in Developers Guide</a> </p>
    <li>
    <p><a href="http://jshingler.blogspot.com/2008/07/phone-number-custom-constraint-for.html">Phone Number Custom Constraint for Grails</a> </p>
    <li>
    <p><a href="http://dahernan.net/2008/02/my-first-grails-plugin.html">My first Grails plugin</a> </p>
    </li>
</ul>
<p>Between those three, you should have enough to figure things out. I still found it hard, despite those instructions and so to avoid having to figure things out again some time in the future, I'll write absolutely everything here.
<p><u>Creating the Plugin</u>
<ol>
    <p>
    <li>On the command line, run this:
    <pre>grails create-plugin SamplePlugin</pre>
    <p>Now you have a Grails plugin. However, at the same time it is just another Grails application, which means you can simply open it in NetBeans IDE. (I.e., there is no import process and no NetBeans artifacts are added to the plugin in order to be able to open it in the IDE.)
    <p>&nbsp;</p>
    <li>So open the plugin in the IDE. The Projects window isn't very interesting, it just shows you the same as you would normally see for Grails applications:
    <p><img alt="" src="http://blogs.sun.com/geertjan/resource/grails-plugin-1.png" />
    <p>The Files window (Ctrl-2) however, shows a lot more:
    <p><img alt="" src="http://blogs.sun.com/geertjan/resource/grails-plugin-2.png" />
    <p>Open the "SamplePluginGrailsPlugin.groovy" file and there you see the following:
    <pre>class SamplePluginGrailsPlugin {
    def version = 0.1
    def dependsOn = [:]
    def doWithSpring = {
    // TODO Implement runtime spring config (optional)
    }
    def doWithApplicationContext = { applicationContext -&gt;
    // TODO Implement post initialization spring config (optional)
    }
    def doWithWebDescriptor = { xml -&gt;
    // TODO Implement additions to web.xml (optional)
    }
    def doWithDynamicMethods = { ctx -&gt;
    // TODO Implement registering dynamic methods to classes (optional)
    }
    def onChange = { event -&gt;
    // TODO Implement code that is executed when this class plugin class is changed
    // the event contains: event.application and event.applicationContext objects
    }
    def onApplicationChange = { event -&gt;
    // TODO Implement code that is executed when any class in a GrailsApplication changes
    // the event contain: event.source, event.application and event.applicationContext objects
    }
    }</pre>
    <p>I.e., you have hooks for integrating your code into meaningful places in the plugin.
    <p>&nbsp;</p>
    <li>Now we'll create code that will let our plugin provide a new "constraint". (If you don't know what that is, you will know by the time you finish reading all this.) To do so, we will need to extend <a href="http://grails.org/doc/1.0.x/api/org/codehaus/groovy/grails/validation/AbstractConstraint.html">org.codehaus.groovy.grails.validation.AbstractConstraint</a>, in a package within <tt>src/groovy</tt>:
    <pre>import org.codehaus.groovy.grails.validation.AbstractConstraint
    import org.springframework.validation.Errors
    class BestFrameworkConstraint extends AbstractConstraint {
    private static final String DEFAULT_MESSAGE_CODE = "default.answer.invalid.message";
    public static final String NAME = "oneCorrectResponse";
    private boolean validateConstraint
    <strong>//The parameter which the constraint is validated against:</strong>
    @Override
    public void setParameter(Object constraintParameter) {
    if (!(constraintParameter instanceof Boolean))
    throw new IllegalArgumentException("Parameter for constraint ["
    + NAME + "] of property ["
    + constraintPropertyName + "] of class ["
    + constraintOwningClass + "] must be a boolean value");
    this.validateConstraint = ((Boolean) constraintParameter).booleanValue()
    super.setParameter(constraintParameter);
    }
    <strong>//Returns the default message for the given message code in the current locale:</strong>
    @Override
    protected void processValidate(Object target, Object propertyValue, Errors errors) {
    if (validateConstraint &amp;&amp; !validate(target, propertyValue)) {
    def args = (Object[]) [constraintPropertyName, constraintOwningClass,
    propertyValue]
    super.rejectValue(target, errors, DEFAULT_MESSAGE_CODE,
    "not." + NAME, args);
    }
    }
    <strong>//Returns whether the constraint supports being applied against the specified type:</strong>
    @Override
    boolean supports(Class type) {
    return type != null &amp;&amp; String.class.isAssignableFrom(type);
    }
    <strong>//The name of the constraint, which the user of the plugin will use
    //when working with your plugin.</strong>
    @Override
    String getName() {
    return NAME;
    }
    <strong>//Validate this constraint against a property value,
    //In this case, ONLY "Grails" is valid, everything else will cause an error:</strong>
    @Override
    boolean validate(target, propertyValue) {
    propertyValue ==~ /^Grails$/
    }
    }</pre>
    <p>&nbsp;</p>
    <li>Next, back in the Groovy plugin class that we looked at earlier, hook the above class into the plugin, using the "doWithSpring" closure to do so:
    <pre>def doWithSpring = {
    <strong>org.codehaus.groovy.grails.validation.ConstrainedProperty.registerNewConstraint(
    BestFrameworkConstraint.NAME,
    BestFrameworkConstraint.class);</strong>
    }</pre>
    <p>&nbsp;</p>
    <li>Now, back on the command line, navigate to within the "SamplePlugin" folder. There, run the following:
    <pre>grails package-plugin</pre>
    <p>Back in the IDE, examine the ZIP file that the above command created:
    <p><img alt="" src="http://blogs.sun.com/geertjan/resource/grails-plugin-3.png" /> </p>
    </li>
</ol>
<p>That ZIP file <strong>is</strong> your Grails plugin.
<p><u>Installing the Plugin</u>
<p>Now we will install our plugin in a new application.
<ol>
    <p>
    <li>First, create a new Grails application by going to the New Project wizard (Ctrl-Shift-N) and choosing Groovy | Grails Application. Click Next and type "SampleApplication" and then click Finish.
    <p>&nbsp;</p>
    <li>After the IDE has finished running the "grails create-app" command for you, you will see the new application open in the IDE. Right-click it and choose "Plugins", as shown here:
    <p><img alt="" src="http://blogs.sun.com/geertjan/resource/grails-plugin-4.png" />
    <p>&nbsp;</p>
    <li>In the Grails Plugins dialog, notice that the list gets filled with many potential plugins that you might want to install, from the Grails plugins repository. Instead, we'll install our own. Click Browse and browse to the ZIP file that we created three steps ago and notice that it appears in the text field at the bottom of the dialog:
    <p><img alt="" src="http://blogs.sun.com/geertjan/resource/grails-plugin-5.png" />
    <p>&nbsp;</p>
    <li>Click "Install" and then a progress bar appears, ending with the plugin being installed. Notice that you can also uninstall it:
    <p><img alt="" src="http://blogs.sun.com/geertjan/resource/grails-plugin-6.png" />
    <p>&nbsp;</p>
    <li>Take a look at your application and notice (in the Files window) what's happened to the plugin. It's been unzipped, plus the ZIP file is still there. And all that's been done in the "plugins" folder. <em>Nothing</em> else has changed, which means that uninstallation is as simple as removing the folder from the "plugins" folder:
    <p><img alt="" src="http://blogs.sun.com/geertjan/resource/grails-plugin-15.png" />
    <p>Thanks to "convention over configuration", Grails knows exactly where everything is—so that, for example, the "plugin.xml" file that you see above, if found within the folder structure you see above, is the indicator to Grails that a plugin is available for use. </p>
    </li>
</ol>
<p><u>Using the Functionality Provided By the Plugin</u>
<ol>
    <p>
    <li>Let's now use our plugin. Create a domain class called "Quiz", after right-clicking the "Domain Classes" node and choosing "Create new Domain Class":
    <p><img alt="" src="http://blogs.sun.com/geertjan/resource/grails-plugin-7.png" />
    <p>&nbsp;</p>
    <li>Right-click the "Controllers" node and choose "Create new controller". Type "Quiz" and then click Finish. Use the Groovy editor to add one line for adding the scaffolding (and uncomment the other line):
    <p><img alt="" src="http://blogs.sun.com/geertjan/resource/grails-plugin-8.png" />
    <p>&nbsp;</p>
    <li>Back in the "Quiz" domain class, add your property and use the "oneCorrectResponse" constraint defined in your plugin, as shown here:
    <p><img alt="" src="http://blogs.sun.com/geertjan/resource/grails-plugin-9.png" />
    <p><strong>Note:</strong> The "oneCorrectResponse" constraint that you see above is the name of the constraint defined in the plugin.
    <p>&nbsp;</p>
    <li>And then add the message to the <tt>messages.properties</tt> file, which is within the "Messages Bundles" node:
    <p><img alt="" src="http://blogs.sun.com/geertjan/resource/grails-plugin-10.png" />
    <p>&nbsp;</p>
    <li>Run the application and you will see that your constraint will prevent anything other than "Grails" from being considered acceptable, when "Create" is clicked below:
    <p><img alt="" src="http://blogs.sun.com/geertjan/resource/grails-plugin-13.png" /> </p>
    </li>
</ol>
<p>Congratulations, you've created, installed, and used your first Grails plugin!</p><img src ="http://www.blogjava.net/rain1102/aggbug/218004.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-28 11:35 <a href="http://www.blogjava.net/rain1102/archive/2008/07/28/218004.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails中使用Fck-editor</title><link>http://www.blogjava.net/rain1102/archive/2008/07/26/217648.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Sat, 26 Jul 2008 05:32:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/26/217648.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/217648.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/26/217648.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/217648.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/217648.html</trackback:ping><description><![CDATA[下载插件grails-fck-editor-0.3。下载地址<a href="http://svn.codehaus.org/grails-plugins/grails-fck-editor/tags/RELEASE_0_3/grails-fck-editor-0.3.zip">http://svn.codehaus.org/grails-plugins/grails-fck-editor/tags/RELEASE_0_3/grails-fck-editor-0.3.zip</a> 。<br />
放到磁盘上,比如 D:/down/grails-fck-editor-0.3.zip<br />
安装: grails install-plugin D:/down/grails-fck-editor-0.3.zip<br />
这里我使用的是grails1.0.3, 在干装的时候会报错..<br />
<span style="color: red">Grails Bug: If the plugin wasn't loaded it should be in the failed plugins list,<br />
but is not. Please report the issue.<br />
<a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.lang.IllegalArgumentException: Grails Bug: If the plugin wasn't loaded it s<br />
hould be in the failed plugins list, but is not. Please report the issue.</span><br />
这时候到自己的工程目录下找到plugins文件夹, 解压grails-fck-editor-0.3.zip到当前目录.<br />
在页面里使用fck标签:<br />
<span style="color: #008000">&lt;fck:editor id="content" name="content" height="400"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${fieldValue(bean:news,field:'content')}<br />
&lt;/fck:editor&gt;</span><br />
启动项目, <br />
<img height="360" alt="" src="http://www.blogjava.net/images/blogjava_net/rain1102/33302/o_grails-fck-editor.JPG" border="0" wdith="440" /><img src ="http://www.blogjava.net/rain1102/aggbug/217648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-26 13:32 <a href="http://www.blogjava.net/rain1102/archive/2008/07/26/217648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails中sortableColumn标签改写支持ajax</title><link>http://www.blogjava.net/rain1102/archive/2008/07/23/217039.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 23 Jul 2008 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/23/217039.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/217039.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/23/217039.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/217039.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/217039.html</trackback:ping><description><![CDATA[<p>前两天从同事那里得来需求, 要求一个主页面里面使用ajax加载一个表格, 并且需要表头点击以后可以排序. 刚才看了一下grails中的sortableColumn标签源码, 该标签最后其实就是生成了一个普通的link.<br />
<span style="color: red">${link(action:action, params:linkParams) { title }}</span><br />
很简单, 只需要修改link的生成方法, 使用remoteLink来生成就可以了.<br />
<span style="color: #008000">def update = attrs.remove("update")<br />
</span>...<br />
<span style="color: #008000">${remoteLink(action:action,update:update, params:linkParams) { title }}</span><br />
当然update那个值需要传过来的. 页面里面就改写成:<br />
&lt;g:sortableColumnEric property="id" title="Id" <span style="color: #ff0000">update="userlist"/</span>&gt;<br />
一切ok.<br />
有了排序, 当然分页也要这样了, 实现应该差不多...<br />
把所有的link(linkTagAttrs.clone())改为remoteLink(linkTagAttrs.clone())<br />
这里也别忘了要传个update参数过来的, <br />
修改def linkTagAttrs = [action:action]为:<br />
<span style="color: red">def update = attrs.remove("update")<br />
def linkTagAttrs = [action:action, update:update]</span><br />
页面里就要改为:<br />
&lt;g:paginateEric <span style="color: red">update="userlist"</span> total="${User.count()}" maxsteps="3"/&gt;</p><img src ="http://www.blogjava.net/rain1102/aggbug/217039.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-23 22:49 <a href="http://www.blogjava.net/rain1102/archive/2008/07/23/217039.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails的域类验证详解[转]</title><link>http://www.blogjava.net/rain1102/archive/2008/07/21/216470.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 21 Jul 2008 14:47:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/21/216470.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/216470.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/21/216470.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/216470.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/216470.html</trackback:ping><description><![CDATA[<p>在Grails里，我们可以通过定义约束属性来验证一个领域类的实例。约束属性在一个叫&#8220;constraints&#8221;闭包的定义。可以为领域类里的每个属性定义约束。<br />
<br />
class User {<br />
String login<br />
String password<br />
String email<br />
Date age</p>
<p>static constraints = {<br />
login(length:5..15,blank:false,unique:true)<br />
password(length:5..15,blank:false)<br />
email(email:true,blank:false)<br />
age(min:new Date(),nullable:false)<br />
}<br />
}</p>
<blockquote>
<p>constraints必须声明为static。</p>
</blockquote>
<p>同时，每个属性的约束属性都有与之对应的错误消息（Error message code），当表单未能通过验证的时候，将会返回这些错误消息。<br />
这些错误消息在<strong>grails-app/i18n/message.properties</strong>里定义。<br />
例如我们要让User的email为空时返回"Please enter your email"，则可以在message.properties定义：<br />
user.email.blank=Please enter your email<br />
如果用户没有自定义错误消息，系统则会用默认的设置。当然默认的消息肯定不会是你想要的&#8230;&#8230;</p>
<p>Grails提供很多验证属性，可以满足一些基本的验证需求：</p>
<p><font size="2"><strong>blank</strong></font><br />
验证属性能否为空，不允许为空则设为false。<br />
<strong>Note: 如果在form里为空而提交，则属性的值是一个空字符串，而不是null。<br />
</strong>Example: login(blank:false)<br />
Error message code: className.propertyName.blank</p>
<p><font size="2"><strong>creditCard</strong></font><br />
如果要求属性为信用卡号码，则设为true。<br />
Example: cardNumber(creditCard:true)<br />
Error message code: className.propertyName.creditCard.invalid</p>
<p><font size="2"><strong>email</strong></font><br />
如果要求属性为emial地址，则设为true。<br />
Example: contactEmail(email:true)<br />
Error message code: className.propertyName.email.invalid</p>
<p><font size="2"><strong>inList</strong></font><br />
如果要求属性的值必须为规定的值，则定义规定的值。<br />
Example: name(inList:["Joe", "Fred", "Bob"] )<br />
Error message code: className.propertyName.not.inList</p>
<p><font size="2"><strong>length</strong></font><br />
约束字符串或者数组的长度。<br />
<font color="#ff0000">这个约束属性在0.5版本是被取消，用size代替。</font><br />
Example: login(length:5..15)<br />
Error message code:<br />
className.propertyName.length.toolong<br />
className.propertyName.length.tooshort</p>
<p><font size="2"><strong>matches</strong></font><br />
应用正则表达式对字符串进行验证。<br />
Example: login(matches:"[a-zA-Z]+")<br />
Error message code: className.propertyName.matches.invalid</p>
<p><font size="2"><strong>max</strong></font><br />
设定属性的最大值，值的类型必须跟属性一样。<br />
Example:<br />
age(max:new Date())<br />
price(max:999F)<br />
Error message code: className.propertyName.max.exceeded</p>
<p><font size="2"><strong>maxLength</strong></font><br />
设定字符串或者数组的最大长度。<br />
<font color="#ff0000">在0.5版本中被取消，由maxSize代替。</font><br />
Example: login(maxLength:5)<br />
Error message code: className.propertyName.maxLength.exceeded</p>
<p><font size="2"><strong>maxSize</strong></font><br />
设定一个数字或者集合的最大大小。<br />
<font color="#ff0000">在0.5版本中不被建议用在数字上，改用max。</font><br />
Example: children(maxSize:25)<br />
Error message code: className.propertyName.maxSize.exceeded</p>
<p><font size="2"><strong>min</strong></font><br />
设定属性的最小值。类型必须跟属性一致。<br />
Example:<br />
age(min:new Date())<br />
price(min:0F)<br />
Error message code: className.propertyName.min.notmet</p>
<p><font size="2"><strong>minLength</strong></font><br />
设定字符串属性或者数组属性的最小长度。<br />
<font color="#ff0000">在0.5版本中被取消，由minSize代替。</font><br />
Example: login(minLength:5)<br />
Error message code: className.propertyName.minLength.notmet</p>
<p><font size="2"><strong>minSize</strong></font><br />
设定一个数字或者集合的最小大小。<br />
<font color="#ff0000">在0.5版本中不被建议用在数字属性上，改用min。</font><br />
Example: children(minSize:5)<br />
Error message code: className.propertyName.minSize.notmet</p>
<p><font size="2"><strong>notEqual</strong></font><br />
验证属性的值是否跟指定的值相等。<br />
Example: login(notEqual:"Bob")<br />
Error message code: className.propertyName.notEqual</p>
<p><font size="2"><strong>nullable</strong></font><br />
如果属性不可以为null，则设为false。<br />
Note: 如果在表单里未填任何东西而提交时，则作为request parameter，属性的值为一个空字符串，而不是null。<br />
Example: age(nullable:false)<br />
Error message code: className.propertyName.nullable</p>
<p><font size="2"><strong>range</strong></font><br />
限制属性的值在指定的范围里。<br />
Example: age(range:minAge..maxAge)<br />
Error message code:<br />
className.propertyName.range.toosmall<br />
className.propertyName.range.toobig</p>
<p><font size="2"><strong>scale</strong></font><br />
版本0.4才开始出现的约束属性。<br />
根据设定的scale数值，自动把浮点型数字小数点后的位数调整为设定的值。<br />
适用于以下数值类型：java.lang.Float, <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.Double, and <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.math.BigDecimal (and its subclasses)。<br />
Example: salary(scale:2)<br />
Error message code: 不返回错误信息</p>
<p><font size="2"><strong>size</strong></font><br />
规定一个数值，集合或者字符串长度的大小。<br />
<font color="#ff0000">在版本0.5中不被建议用在数字类型的属性上，改用range。</font><br />
Example: children(size:5..15)<br />
Note: 不能使用这个约束属性如果blank设为true或者nullable设为true。<br />
Error message code:<br />
className.propertyName.size.toosmall<br />
className.propertyName.size.toobig</p>
<p><font size="2"><strong>unique</strong></font><br />
如果属性必须为唯一，则设为true。<br />
Example: login(unique:true)<br />
Note: 有可能会发生通过unique验证但是在随后的数据库储存出现错误的情况。预防这种情况发生的方法是使用连续事务隔离级别或者进行eception的处理。<br />
从版本0.5开始，unique的范围（Scope）可以被指定。"Scope"是同一个类里其他属性的名字，或者这些属性名字的一个list。<br />
Example: group(unique:'department')<br />
上面的例子里group名在一个department里是唯一的，但是可能在其他department里有相同名字的groups。<br />
Another Example: login(unique:['group','department'])<br />
在这个例子，login在group和department里必须是唯一的。可能在不同等group和department里会有相同的login。<br />
Error message code: className.propertyName.unique</p>
<p><font size="2"><strong>url</strong></font><br />
如果属性为一个URL地址，则设为true。<br />
Example: homePage(url:true)<br />
Error message code: className.propertyName.url.invalid</p>
<p><font size="2"><strong>validator</strong></font><br />
在闭包里设定自定义的验证。<br />
Example:<br />
even( validator: {<br />
return (it % 2) == 0<br />
})<br />
Error message code (default): className.propertyName.validator.invalid<br />
将会在另外的文章里进行介绍。</p><img src ="http://www.blogjava.net/rain1102/aggbug/216470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-21 22:47 <a href="http://www.blogjava.net/rain1102/archive/2008/07/21/216470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails中Service层事务处理</title><link>http://www.blogjava.net/rain1102/archive/2008/07/21/216447.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 21 Jul 2008 13:29:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/21/216447.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/216447.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/21/216447.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/216447.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/216447.html</trackback:ping><description><![CDATA[在Grails中Service层默认就是支持事务的,事务传播级别默认是PROPAGATION_REQUIRED.&nbsp; 当然你也可以设置transactional = false.<br />
如果transactional 设置为true, 则在Service层如何方法内部抛出RuntimeException类型异常, 所有操作将会回滚.<br />
<p>class UserService {</p>
<p>&nbsp;&nbsp;&nbsp; <span style="color: #008000">boolean transactional = true</span></p>
<p>&nbsp;&nbsp;&nbsp; public boolean register(User user, UserInfo userInfo) throws RuntimeException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (user.save()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; userInfo.user = user<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (userInfo.save()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new <span style="color: #008000">RuntimeException </span>('ServiceException: UserService.register()...');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new <span style="color: #008000">RuntimeException </span>('ServiceException: UserService.register()...');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
这样不管哪个保存失败, 数据都将会回滚!<img src ="http://www.blogjava.net/rain1102/aggbug/216447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-21 21:29 <a href="http://www.blogjava.net/rain1102/archive/2008/07/21/216447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails中的领域类中约束,验证以及错误消息处理</title><link>http://www.blogjava.net/rain1102/archive/2008/07/20/216253.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Sun, 20 Jul 2008 14:20:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/20/216253.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/216253.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/20/216253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/216253.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/216253.html</trackback:ping><description><![CDATA[<p><span style="font-size: 10pt; font-family: 宋体">Grails</span><span style="font-size: 10pt; font-family: 宋体">的验证功能是建立在Spring's Validator API和数据绑定之上的，但Grails在此特性和约束机制的基础上又提供了统一的定义验证约束的方法。<br />
在一个领域类中，约束constraints被定义在constraints属性的代码块中: </span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">class User {</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">...</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: green; font-family: 宋体">static constraints</span></strong><span style="font-size: 10pt; font-family: 宋体"> = {</span></p>
<p style="margin-left: 42pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">userName(size:5..15, blank:</span><span style="font-size: 10pt; font-family: 宋体">false</span><span style="font-size: 10pt; font-family: 宋体">, unique:</span><span style="font-size: 10pt; font-family: 宋体">true</span><span style="font-size: 10pt; font-family: 宋体">)</span></p>
<p style="margin-left: 42pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">password(size:5..15, blank:</span><span style="font-size: 10pt; font-family: 宋体">false</span><span style="font-size: 10pt; font-family: 宋体">)</span></p>
<p style="margin-left: 42pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">email(email:</span><span style="font-size: 10pt; font-family: 宋体">true</span><span style="font-size: 10pt; font-family: 宋体">, blank:</span><span style="font-size: 10pt; font-family: 宋体">false</span><span style="font-size: 10pt; font-family: 宋体">)</span></p>
<p style="margin-left: 42pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">age(min:18, nullable:</span><span style="font-size: 10pt; font-family: 宋体">false</span><span style="font-size: 10pt; font-family: 宋体">)</span></p>
<p style="text-indent: 20pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">}</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">}</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">这样在你每次保存一个对象的时候都回去调用validate方法来验证. </span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">当然你可以在任何实例上调用其validate方法去验证领域类.</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体">def user =&nbsp;new User(params)</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">if</span><span style="font-size: 10pt; font-family: 宋体">(</span><strong><span style="font-size: 10pt; color: green; font-family: 宋体">user.validate</span></strong><span style="font-size: 10pt; font-family: 宋体">()) {</span></p>
<p style="text-indent: 20pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">// </span><span style="font-size: 10pt; font-family: 宋体">do</span><span style="font-size: 10pt; font-family: 宋体"> something with user</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">} </span><span style="font-size: 10pt; font-family: 宋体">else</span><span style="font-size: 10pt; font-family: 宋体"> {</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><strong><span style="font-size: 10pt; color: green; font-family: 宋体">&nbsp;&nbsp; &nbsp;user.errors.allErrors</span></strong><span style="font-size: 10pt; font-family: 宋体">.each {</span></p>
<p style="text-indent: 40pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">println it</span></p>
<p style="text-indent: 20pt; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">}</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">}</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">如果你在注册的时候, 比如要输入两次密码, 这时候想把错误消息也放入领域类的errors属性里面, 由于领域类的 errors属性是Spring的Errors接口实例，</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">Errors</span><span style="font-size: 10pt; font-family: 宋体">接口提供了访问这些验证错误的方法，并且还可以取得原始的值。</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">具体使用的实现类是BeanPropertyBindingResult</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; font-family: 宋体"><a title="Java爱好者" href="http://www.blogjava.net/rain1102"><span style="font-size: 10pt; color: #002c99; text-decoration: none; text-underline: none">Java</span></a></span><span style="font-size: 10pt; font-family: 宋体">.lang.Object</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">org.springframework.validation.AbstractErrors</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">org.springframework.validation.AbstractBindingResult</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">org.springframework.validation.AbstractPropertyBindingResult</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><strong><span style="font-size: 10pt; color: green; font-family: 宋体">org.springframework.validation.BeanPropertyBindingResult</span></strong></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 10pt; font-family: 宋体">每一个消息对应一个<span style="color: green">org.springframework.validation.ObjectError</span>对象.所有可以想领域类的errors属性里面直接添加ObjectError对象就可以了.</span></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">&nbsp;<strong><span style="font-size: 10pt; color: green; font-family: 宋体">def error = new ObjectError('password', message(code:'pinpin.register.valid.password.notequal'))</span></strong></p>
<p style="text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><strong><span style="font-size: 10pt; color: green; font-family: 宋体">&nbsp;user.errors.addError(error)</span></strong></p><img src ="http://www.blogjava.net/rain1102/aggbug/216253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-20 22:20 <a href="http://www.blogjava.net/rain1102/archive/2008/07/20/216253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails中使用Spring的JdbcTemplate处理SQL语句</title><link>http://www.blogjava.net/rain1102/archive/2008/07/18/215891.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Fri, 18 Jul 2008 12:37:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/18/215891.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/215891.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/18/215891.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/215891.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/215891.html</trackback:ping><description><![CDATA[今天遇到一个可笑但又很实际的问题, 比如我有一个user表, 里面的字段为id, name, password等等,&nbsp;还有一个表user_info表, 里面有id, age, email, address 等等.<br />
但这两张表没有关联字段,也就是说没有外键约束. 但我想在grail中查询两张表, 获取里面的name, password, age, email以及address等等. 条件是两个id相等.<br />
这时候如何做呢??? 目前为止我想到的就是使用Spring中的JdbcTemplate来处理SQL语句:<br />
class User {<br />
&nbsp;String name<br />
&nbsp;String password<br />
}<br />
<br />
class UserInfo {<br />
&nbsp;&nbsp;&nbsp; int age<br />
&nbsp;&nbsp;&nbsp; String email<br />
&nbsp;&nbsp;&nbsp; String address<br />
}<br />
<br />
在controller中写:<br />
<br />
<p>def dataSource<br />
&nbsp;&nbsp;&nbsp; def list = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def template = new JdbcTemplate(dataSource)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def userList = template.queryForList("select ui.name as <span style="color: #ff0000">name</span>, u.password as <span style="color: #ff0000">password</span>, ui.age as <span style="color: #ff0000">age</span>, ui.email as <span style="color: #ff0000">email</span>, ui.address as <span style="color: #ff0000">address&nbsp; </span>from user u, user_info ui where u.id = ui.id");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def map = [userList : userList]</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; render(view:"list", model:map)<br />
&nbsp;&nbsp;&nbsp; }</p>
<br />
在gsp中只要使用as后面的别名来取对应的值就可以了.<br />
<p>&lt;table&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;thead&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;g:sortableColumn property="name" title="Name" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;g:sortableColumn property="password" title="Password" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;g:sortableColumn property="email" title="Emial" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;g:sortableColumn property="age" title="Age" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;g:sortableColumn property="address" title="Address" /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/thead&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tbody&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;g:each in="${userList}" status="i" var="user"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr class="${(i % 2) == 0 ? 'odd' : 'even'}"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;${user.<span style="color: #ff0000">name</span>}&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;${user.<span style="color: #ff0000">password</span>}&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;${user.<span style="color: #ff0000">email</span>}&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;${user.<span style="color: #ff0000">age</span>}&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;${user.<span style="color: #ff0000">address</span>}&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/g:each&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tbody&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;</p>
<span style="color: #ff0000">注意</span>:红色的部分要名字一样, 当然你也可以不使用别名, 直接用原来名字也可以!<img src ="http://www.blogjava.net/rain1102/aggbug/215891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-18 20:37 <a href="http://www.blogjava.net/rain1102/archive/2008/07/18/215891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>grails调用存储过程[转]</title><link>http://www.blogjava.net/rain1102/archive/2008/07/18/215656.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Fri, 18 Jul 2008 01:30:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/18/215656.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/215656.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/18/215656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/215656.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/215656.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt">&nbsp;
<p style="background: white; line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">在特殊情况下，</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana">grails</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">应用需要调用数据库的存储过程，这在</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana">grails</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">的官方文档里边好像没有提到过，在</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana"><a href="http://james-says.blogspot.com/2007/03/grails-little-of-spring-framework.html"><span style="color: #1a8bc8; line-height: 150%; text-decoration: none; text-underline: none">james</span></a></span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">的</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana">blog</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">里介绍如何解决这个问题。</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana"><br />
&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">代码转贴如下</span></p>
<p style="background: white; line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana"><a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> </span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">代码</span></p>
<ol type="1">
    <li style="background: white; color: #4b4b4b; line-height: 150%; text-align: left; tab-stops: list 36.0pt"><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">class</span><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">&nbsp;MainController&nbsp;{&nbsp;&nbsp; </span></li>
    <li style="background: white; color: #4b4b4b; line-height: 150%; text-align: left; tab-stops: list 36.0pt"><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">&nbsp;&nbsp; </span></li>
    <li style="background: white; color: #4b4b4b; line-height: 150%; text-align: left; tab-stops: list 36.0pt"><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">&nbsp;&nbsp;def&nbsp;dataSource&nbsp;</span><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">//&nbsp;using&nbsp;the&nbsp;datasource&nbsp;we&nbsp;define&nbsp;in&nbsp;the&nbsp;spring's&nbsp;resources.xml</span><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">&nbsp;&nbsp; </span></li>
    <li style="background: white; color: #4b4b4b; line-height: 150%; text-align: left; tab-stops: list 36.0pt"><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">&nbsp;&nbsp; </span></li>
    <li style="background: white; color: #4b4b4b; line-height: 150%; text-align: left; tab-stops: list 36.0pt"><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">&nbsp;&nbsp;def&nbsp;index&nbsp;=&nbsp;{&nbsp;&nbsp; </span></li>
    <li style="background: white; color: #4b4b4b; line-height: 150%; text-align: left; tab-stops: list 36.0pt"><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sql&nbsp;sql&nbsp;=&nbsp;</span><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">new</span><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">&nbsp;Sql(dataSource)&nbsp;&nbsp; </span></li>
    <li style="background: white; color: #4b4b4b; line-height: 150%; text-align: left; tab-stops: list 36.0pt"><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;row&nbsp;=&nbsp;sql.execute(</span><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">"call&nbsp;create_daily_hours(${new&nbsp;Date()+1})"</span><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">)&nbsp;&nbsp; </span></li>
    <li style="background: white; color: #4b4b4b; line-height: 150%; text-align: left; tab-stops: list 36.0pt"><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">&nbsp;&nbsp;}&nbsp;&nbsp; </span></li>
    <li style="background: white; color: #4b4b4b; line-height: 150%; text-align: left; tab-stops: list 36.0pt"><span style="font-size: 10pt; line-height: 150%; font-family: Verdana">}&nbsp;&nbsp;</span></li>
</ol>
<p style="background: white; margin-bottom: 12pt; line-height: 150%; text-align: left" align="left">&nbsp;<span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">需要说明的一些是：</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana">grails</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">本身没有提供访问存储过程的便捷方法，而</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana">groovy</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">的</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana"><a href="http://groovy.codehaus.org/GSQL"><span style="color: #1a8bc8; line-height: 150%; text-decoration: none; text-underline: none">GSQ</span></a>L</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">提供了，因此</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana">grails</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">可以直接拿过来用了，当然也可以用</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana">spring</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">的</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana">JdbcTemplate</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">。</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana"><br />
&nbsp; </span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">希望对</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana">grails</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">用户有点用。</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana"><br />
<br />
</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: 宋体">原文地址：</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana">http://grails.group.javaeye.com/group/blog/86666<br />
<br />
<br />
<br />
My experience with grails is getting richer the longer I use it for web application developing. It's very nice that grails is built on top of spring framework which we can take advantage of. I am not a spring user before but with a help from the nice people at the grails forum I was able to achieve what I want to do.<br />
<br />
Calling a stored procedure from a MySQL database or any other database is simple. First we need a datasource which spring could provide for us. I have the following code place in the resources.xml found in the spring folder in your grails folder.</span></p>
<p style="background: white; line-height: 150%; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: #4b4b4b; line-height: 150%; font-family: 宋体"><br />
&lt;bean id="dataSource" class=" org.apache.commons.dbcp.BasicDataSource "&gt;<br />
&lt;property name="driverClassName"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;value&gt;org.hsqldb.jdbcDriver&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;property name="url"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;value&gt;jdbc:hsqldb:hsql://localhost&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;property name="username"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;value&gt;sa&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;property name="password"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;value&gt;&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;</span></p>
<p style="background: white; margin-bottom: 12pt; line-height: 150%; text-align: left" align="left"><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%; font-family: Verdana"><br />
<br />
I use connection pooling for better performance. In my controller here is how I use the datasource to call a store procedure.</span></p>
<p style="background: white; line-height: 150%; text-align: left; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span style="font-size: 12pt; color: #4b4b4b; line-height: 150%; font-family: 宋体"><br />
class MainController {<br />
<br />
&nbsp;def dataSource // using the datasource we define in the spring's resources.xml<br />
<br />
&nbsp;def index = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sql sql = new Sql(dataSource)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def row = sql.execute("call create_daily_hours(${new Date()+1})")<br />
&nbsp;}<br />
}</span></p>
<p><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana"><br />
<br />
That's it! Notice that I am using Groovy SQL instead of Spring JDBCTemplate. It's a lot more friendlier for a beginner.<br />
<br />
Grails really makes everything easy here and provides a lot of flexibility thanks to it's nice integration with spring. From here everything is possible.<br />
<br />
</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">原文地址：</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">http://james-says.blogspot.com/2007/03/grails-little-of-spring-framework.html</span></p>
</span><img src ="http://www.blogjava.net/rain1102/aggbug/215656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-18 09:30 <a href="http://www.blogjava.net/rain1102/archive/2008/07/18/215656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在grails中使用dojo上传文件 (转载)</title><link>http://www.blogjava.net/rain1102/archive/2008/07/17/215602.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 17 Jul 2008 14:58:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/17/215602.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/215602.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/17/215602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/215602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/215602.html</trackback:ping><description><![CDATA[首先下载dojo和安装dojo plugin （grails 1.0以上）<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 91.73%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 218px; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&lt;</span><span style="color: #000000">g:javascript&nbsp;library</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">dojo</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">g:javascript</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />dojo.require(</span><span style="color: #000000">"</span><span style="color: #000000">dojo.io.IframeIO</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">g:javascript</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">g:form&nbsp;url</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">[action:'submitToRemoteCall']</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">form2</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />enctype</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">multipart/form-data</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />File:&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">input&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">someFile</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;type</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">file</span><span style="color: #000000">"</span><span style="color: #000000">&gt;&lt;/</span><span style="color: #000000">input</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">g:submitToRemote<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">Submit&nbsp;Upload</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">form2</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />action</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">submitToRemoteUpload</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />update</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">[success:'message',failure:'error']</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">g:form</span><span style="color: #000000">&gt;</span></div>
注意 form中写入url属性， 而且form不要有hide类型的input，否则会调用XMLHttpRequest，而不用IframeIO<br />
<br />
在controller中写入<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 91.69%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 230px; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">def&nbsp;submitToRemoteUpload&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000"><br />
<img id="Codehighlighter1_27_320_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_320_Open_Text.style.display='none'; Codehighlighter1_27_320_Closed_Image.style.display='inline'; Codehighlighter1_27_320_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_27_320_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_27_320_Closed_Text.style.display='none'; Codehighlighter1_27_320_Open_Image.style.display='inline'; Codehighlighter1_27_320_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_27_320_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_27_320_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />def&nbsp;f&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getFile(</span><span style="color: #000000">'</span><span style="color: #000000">someFile</span><span style="color: #000000">'</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_77_97_Open_Image" onclick="this.style.display='none'; Codehighlighter1_77_97_Open_Text.style.display='none'; Codehighlighter1_77_97_Closed_Image.style.display='inline'; Codehighlighter1_77_97_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_77_97_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_77_97_Closed_Text.style.display='none'; Codehighlighter1_77_97_Open_Image.style.display='inline'; Codehighlighter1_77_97_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(f.empty)&nbsp;</span><span id="Codehighlighter1_77_97_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_77_97_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />render&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">No&nbsp;file!</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img id="Codehighlighter1_104_318_Open_Image" onclick="this.style.display='none'; Codehighlighter1_104_318_Open_Text.style.display='none'; Codehighlighter1_104_318_Closed_Image.style.display='inline'; Codehighlighter1_104_318_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_104_318_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_104_318_Closed_Text.style.display='none'; Codehighlighter1_104_318_Open_Image.style.display='inline'; Codehighlighter1_104_318_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_104_318_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_104_318_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />def&nbsp;fileName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;f.getOriginalFilename()<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />render(text:</span><span style="color: #000000">"</span><span style="color: #000000">&lt;html&gt;&lt;body&gt;&lt;textarea&gt;You&nbsp;called&nbsp;${actionName}&nbsp;in</span><span style="color: #000000"><br />
<img id="Codehighlighter1_209_224_Open_Image" onclick="this.style.display='none'; Codehighlighter1_209_224_Open_Text.style.display='none'; Codehighlighter1_209_224_Closed_Image.style.display='inline'; Codehighlighter1_209_224_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_209_224_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_209_224_Closed_Text.style.display='none'; Codehighlighter1_209_224_Open_Image.style.display='inline'; Codehighlighter1_209_224_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #000000">$</span><span id="Codehighlighter1_209_224_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_209_224_Open_Text"><span style="color: #000000">{controllerName}</span></span><span style="color: #000000">&nbsp;with&nbsp;file&nbsp;$</span><span id="Codehighlighter1_237_246_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_237_246_Open_Text"><span style="color: #000000">{fileName}</span></span><span style="color: #000000">&lt;/</span><span style="color: #000000">textarea</span><span style="color: #000000">&gt;&lt;/</span><span style="color: #000000">body</span><span style="color: #000000">&gt;&lt;/</span><span style="color: #000000">html</span><span style="color: #000000">&gt;</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">contentType:</span><span style="color: #000000">"</span><span style="color: #000000">text/html</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;encoding:</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
IframeIO的默认mimetype为text/plain，所以使用render （text：...）而且套嵌在&lt;textarea&gt;中<br />
<br />
如果要返回render view。 可以修改dojo的dojo.io.bind()，bind参数加上mimetype:"text/html"。form中的&lt;g:submitToRemote&gt;改为<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 91.88%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 106px; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&lt;</span><span style="color: #000000">input&nbsp;onclick</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">dojo.io.bind({url:'/test/index/submitToRemoteUpload',&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mimetype:'text/html',<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;load:function(type,data,evt){<strong>dojo.byId('message')innerHTML&nbsp;=&nbsp;data.body.innerHTML</strong>;},<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error:function(type,error)&nbsp;{&nbsp;dojo.html.textContent(&nbsp;dojo.byId('error'),error.message);},<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formNode:dojo.byId('form2')});return&nbsp;false</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">submit</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">form2</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">Submit&nbsp;Upload</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span></div><img src ="http://www.blogjava.net/rain1102/aggbug/215602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-17 22:58 <a href="http://www.blogjava.net/rain1102/archive/2008/07/17/215602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>定制Grails的web.xml</title><link>http://www.blogjava.net/rain1102/archive/2008/07/16/215332.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 16 Jul 2008 14:17:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/16/215332.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/215332.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/16/215332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/215332.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/215332.html</trackback:ping><description><![CDATA[<p>Grails的web.xml是自动生成的。如果需要修改web.xml该怎么办？</p>
<p>先说一下grails的web.xml的产生过程</p>
<p>Grails的web.xml是在Package.groovy的generateWebXml target中生成的。可以在%Grails_Home%/scripts下找到它。其实在运行grails war时也是先走的这一步。</p>
<p>在generateWebXml里</p>
<p>1.先判断有没有config.grails.config.base.webXml属性，如果有，则使用指定的config.grails.config.base.webXml值作为最终的web.xml</p>
<p>2.如果没有config.grails.config.base.webXml属性。再判断是否存在%Project_Home%/src/templates/war/web.xml，如果存在就使用这个作为最终的web.xml</p>
<p>3.如果上面两个都没有，就使用%Grails_Home%/src/war/WEB-INF/web${servletVersion}.template.xml作为最终的web.xml</p>
<p>根据上面的顺序，我们有3个方法来指定web.xml</p>
<p>第一，可以修改 %Project_Home%/grails-app/conf/Config.groovy 文件，在文件中添加<br />
grails.config.base.webXml = "file:${basedir}/web.xml"<br />
其中${basedir}代表%Project_Home%，就是说会将%Project_Home%/web.xml作为最终的web.xml。</p>
<p>第二，使用 grails install-templates 命令，它会创建%Project_Home%/src/templates/war/web.xml 文件。这样只要修改这个web.xml就行了。</p>
<p>第三，修改%Grails_Home%/src/war/WEB-INF/web${servletVersion}.template.xml文件，但是最好不要这样做。</p>
<p>这里使用Grails 1.0.1</p><img src ="http://www.blogjava.net/rain1102/aggbug/215332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-16 22:17 <a href="http://www.blogjava.net/rain1102/archive/2008/07/16/215332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails and uuid.hex generator</title><link>http://www.blogjava.net/rain1102/archive/2008/07/15/214880.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 15 Jul 2008 02:05:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/15/214880.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/214880.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/15/214880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/214880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/214880.html</trackback:ping><description><![CDATA[<p>class Country {<br />
&nbsp;&nbsp;&nbsp; String id<br />
&nbsp;&nbsp;&nbsp; String name<br />
&nbsp;&nbsp;&nbsp; Boolean active = true</p>
<p>&nbsp;&nbsp;&nbsp; static mapping = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000">id generator:'uuid.hex', params:[separator:'-']<br />
</span>&nbsp;&nbsp;&nbsp; }<br />
}</p>
<span style="color: #008000">params:[separator:'-']为主键中间使用"-"分隔, 比如生成格式为: <a href="http://localhost:8080/pinpin/country/show/2c9d004d-1b247311-011b-2473734f-0001">2c9d004d-1b247311-011b-2473734f-0001</a></span><br />
当然可以去掉<span style="color: #008000">params:[separator:'-']</span>直接写成<br />
<p>class Country {<br />
&nbsp;&nbsp;&nbsp; String id<br />
&nbsp;&nbsp;&nbsp; String name<br />
&nbsp;&nbsp;&nbsp; Boolean active = true</p>
<p>&nbsp;&nbsp;&nbsp; static mapping = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000">id generator:'uuid.hex'<br />
</span>&nbsp;&nbsp;&nbsp; }<br />
}<br />
这样就生成格式为: <a href="http://localhost:8080/pinpin/country/show/2c9d004d1b247311011b2473ebf90003">2c9d004d1b247311011b2473ebf90003</a></p><img src ="http://www.blogjava.net/rain1102/aggbug/214880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-15 10:05 <a href="http://www.blogjava.net/rain1102/archive/2008/07/15/214880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工欲善其事,必须利其器(NetBeans中设置grails和groovy)</title><link>http://www.blogjava.net/rain1102/archive/2008/07/14/214797.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 14 Jul 2008 11:10:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/07/14/214797.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/214797.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/07/14/214797.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/214797.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/214797.html</trackback:ping><description><![CDATA[<p>5ipinpin刚开始,必然要选择开发工具, 之前一直是eclipse+myeclipse.<br />
刚开始使用netbeans就遇到问题, 本来以为在netbeans里面和eclipse是一样的, 对grails支持是需要下载或者更新插件的.<br />
所以今天上午还担心这事....刚才突然看到设置grails的地方, 大喜....<br />
之前在本地上弄了grails1.0.2, 然后今天又下了grails1.0.3, 所有我这里就又两个版本了, 然后通过netbeans的设置很简单就可以切换两个版本,并进行开发...<br />
废话扯远了..具体设置如下:<br />
Tools-&gt;Options-&gt;Groovy<br />
下面就有设置Grails和Groovy的地方了, 很简单, 选择本地路径就可以了, Ok.<br />
<br />
设置tab键的size可以到Editor下面的Indentation设置!</p><img src ="http://www.blogjava.net/rain1102/aggbug/214797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-07-14 19:10 <a href="http://www.blogjava.net/rain1102/archive/2008/07/14/214797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>系统编程语言和脚本语言</title><link>http://www.blogjava.net/rain1102/archive/2008/06/15/208114.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Sun, 15 Jun 2008 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/06/15/208114.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/208114.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/06/15/208114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/208114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/208114.html</trackback:ping><description><![CDATA[通常,脚本语言不会替代系统编程语言,他们相互补充(Ousterhout, 1998), 一般来说,<br />
系统编程语言应该用于如下目的:<br />
1.开发复杂的算法或者数据结构<br />
2.实现计算密集型应用<br />
3.操作大型数据集<br />
4.实现良好定义的, 缓慢变更的需求<br />
5.是大型项目的一部分<br />
而脚本语言应该用于如下目的:<br />
1.连接已有的组建<br />
2.处理经常变化的多种类型的实体<br />
3.具有图形化用户界面<br />
4.拥有快速变化的功能<br />
5.是小型或者中型项目的一部分<img src ="http://www.blogjava.net/rain1102/aggbug/208114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-06-15 17:41 <a href="http://www.blogjava.net/rain1102/archive/2008/06/15/208114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML和JSON响应</title><link>http://www.blogjava.net/rain1102/archive/2008/06/05/206078.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 05 Jun 2008 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/06/05/206078.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/206078.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/06/05/206078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/206078.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/206078.html</trackback:ping><description><![CDATA[<h4>使用render方法输出XML</h4>
<p class="paragraph">Grails支持一些不同的方法来产生XML和JSON响应。第一个是隐式的通过render方法。
<p class="paragraph"><code>render</code>方法可以传递一个代码块来执行标记生成器产生XML </p>
<div class="code">
<pre>def list = {
def results = Book.list()
render(contentType:<span class="java-quote">"text/xml"</span>) {
books {
<span class="java-keyword">for</span>(b in results) {
book(title:b.title)
}
}
}
}</pre>
</div>
<p class="paragraph">这段代码的结果将会像这样： </p>
<div class="code">
<pre><span class="xml-tag">&lt;books&gt;</span>
<span class="xml-tag">&lt;book title=<span class="xml-quote">"The Stand"</span> /&gt;</span>
<span class="xml-tag">&lt;book title=<span class="xml-quote">"The Shining"</span> /&gt;</span>
<span class="xml-tag">&lt;/books&gt;</span></pre>
</div>
<p class="paragraph">注意，当你使用标记生成器时，必须小心避免命名冲突。例如，这段代码将产生一个错误： </p>
<div class="code">
<pre>def list = {
def books = Book.list()  // naming conflict here
render(contentType:<span class="java-quote">"text/xml"</span>) {
books {
<span class="java-keyword">for</span>(b in results) {
book(title:b.title)
}
}
}
}</pre>
</div>
<p class="paragraph">原因是，这里的一个本地变量<code>books</code>企图作为方法被调用。
<p class="paragraph">
<h4>使用render方法输出JSON</h4>
<p class="paragraph"><code>render</code> 方法可以同样被用于输出JSON: </p>
<div class="code">
<pre>def list = {
def results = Book.list()
render(contentType:<span class="java-quote">"text/json"</span>) {
books {
<span class="java-keyword">for</span>(b in results) {
book(title:b.title)
}
}
}
}</pre>
</div>
<p class="paragraph">在这种情况下，结果就会是大致相同的： </p>
<div class="code">
<pre>[
{title:<span class="java-quote">"The Stand"</span>},
{title:<span class="java-quote">"The Shining"</span>}
]</pre>
</div>
<p class="paragraph">同样的命名冲突危险适用于JSON生成器。
<p class="paragraph">
<h4>自动XML列集(Marshalling)</h4>
<p class="paragraph">（译者注：在此附上对于列集(Marshalling)解释：对函数参数进行打包处理得过程，因为指针等数据，必须通过一定得转换，才能被另一组件所理解。可以说列集(Marshalling)是一种数据格式的转换方法。）
<p class="paragraph">Grails同样支持自动列集(Marshalling)领域类为XML通过特定的转换器。
<p class="paragraph">首先，导入<code>grails.converters</code> 类包到你的控制器（Controllers）中： </p>
<div class="code">
<pre><span class="java-keyword">import</span> grails.converters.*</pre>
</div>
<p class="paragraph">现在，你可以使用下列高度易读的语法来自动转换领域类成XML： </p>
<div class="code">
<pre>render Book.list() as XML</pre>
</div>
<p class="paragraph">输出结果看上去会像下列这样： </p>
<div class="code">
<pre>&lt;?xml version=<span class="java-quote">"1.0"</span> encoding=<span class="java-quote">"ISO-8859-1"</span>?&gt;
&lt;list&gt;
&lt;book id=<span class="java-quote">"1"</span>&gt;
&lt;author&gt;Stephen King&lt;/author&gt;
&lt;title&gt;The Stand&lt;/title&gt;
&lt;/book&gt;
&lt;book id=<span class="java-quote">"2"</span>&gt;
&lt;author&gt;Stephen King&lt;/author&gt;
&lt;title&gt;The Shining&lt;/title&gt;
&lt;/book&gt;
&lt;/list&gt;</pre>
</div>
<p class="paragraph">一个使用转换器的替代方法是使用Grails的codecs特性。codecs特性提供了encodeAsXML和encodeAsJSON方法: </p>
<div class="code">
<pre>def xml = Book.list().encodeAsXML()
render xml</pre>
</div>
<p class="paragraph">&nbsp;
<p class="paragraph">
<h4>自动JSON列集(Marshalling)</h4>
<p class="paragraph">Grails同样支持自动列集(Marshalling)为JSON通过同样的机制。简单替代<code>XML</code> 为<code>JSON</code> </p>
<div class="code">
<pre>render Book.list() as JSON</pre>
</div>
<p class="paragraph">输出结果看上去会像下列这样： </p>
<div class="code">
<pre>[
{<span class="java-quote">"id"</span>:1,
<span class="java-quote">"class"</span>:<span class="java-quote">"Book"</span>,
<span class="java-quote">"author"</span>:<span class="java-quote">"Stephen King"</span>,
<span class="java-quote">"title"</span>:<span class="java-quote">"The Stand"</span>},
{<span class="java-quote">"id"</span>:2,
<span class="java-quote">"class"</span>:<span class="java-quote">"Book"</span>,
<span class="java-quote">"author"</span>:<span class="java-quote">"Stephen King"</span>,
<span class="java-quote">"releaseDate"</span>:<span class="java-keyword">new</span> Date(1194127343161),
<span class="java-quote">"title"</span>:<span class="java-quote">"The Shining"</span>}
]</pre>
</div>
<p class="paragraph">再次作为一种替代，你可以使用<code>encodeAsJSON</code>达到相同的效果 </p><img src ="http://www.blogjava.net/rain1102/aggbug/206078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-06-05 16:21 <a href="http://www.blogjava.net/rain1102/archive/2008/06/05/206078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails文件上传</title><link>http://www.blogjava.net/rain1102/archive/2008/06/04/205948.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 04 Jun 2008 15:50:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/06/04/205948.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/205948.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/06/04/205948.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/205948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/205948.html</trackback:ping><description><![CDATA[在grails中实现上传文件也很简单。它可以使用spring里面的CommonsMultipartFile类来处理上传文件.<br />
可以对文件的一些属性设置，比如大小：<br />
<pre>&lt;bean class=<span class="java-quote">"org.springframework.web.multipart.commons.CommonsMultipartResolver"</span>&gt;
&lt;property name=<span class="java-quote">"maxUploadSize"</span>&gt;
&lt;value&gt;1000000&lt;/value&gt;
&lt;/property&gt;
&lt;/bean&gt;</pre>
当然gsp页面需要在form里面设置enctype=<span class="java-quote">"multipart/form-data"<br />
<pre>&lt;g:form method=<span class="java-quote">"post"</span> action=<span class="java-quote">"save"</span> enctype=<span class="java-quote">"multipart/form-data"</span>&gt;
&lt;input type=<span class="java-quote">"file"</span> name=<span class="java-quote">"file"</span>/&gt;
&lt;input type=<span class="java-quote">"submit"</span>/&gt;
&lt;/g:form&gt;</pre>
</span><br />
下面就是处理上传的文件了：<br />
<p>import org.springframework.web.multipart.MultipartHttpServletRequest<br />
import org.springframework.web.multipart.commons.CommonsMultipartFile</p>
<p>class UploadController {<br />
&nbsp;&nbsp;&nbsp; static String uploadDir = "uploadfile"<br />
&nbsp;&nbsp;&nbsp; def index = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; render(view:"upload")<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; def save = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (request instanceof MultipartHttpServletRequest) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CommonsMultipartFile orginalFile = (CommonsMultipartFile) multiRequest.getFile("file")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 判断是否上传文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (orginalFile != null &amp;&amp; !orginalFile.isEmpty()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 获取系统默认文件路径分隔符<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def separator = System.getProperty("file.separator")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; println "file separator is ${separator} "<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 获取原文件名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String originalFilename = orginalFile.getOriginalFilename()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 获取上传文件扩展名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def extension = originalFilename.substring(originalFilename.indexOf(".") + 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; println "extension is ${extension}"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def name = ".." + separator + uploadDir + separator + orginalFile.getOriginalFilename()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; println "file name is : ${name}"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 使用存放文件的绝对路径创建输出流<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red">&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataOutputStream out = new DataOutputStream(new FileOutputStream(name))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream is = null<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is = orginalFile.getInputStream()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] buffer = new byte[1024]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (is.read(buffer) &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(buffer) // 写入磁盘<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException exception) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exception.printStackTrace()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (is != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; is.close()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (out != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000">orginalFile.transferTo(new File(name))<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; render(view:"success")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; println "No multipart"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<br /><img src ="http://www.blogjava.net/rain1102/aggbug/205948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-06-04 23:50 <a href="http://www.blogjava.net/rain1102/archive/2008/06/04/205948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Eclipse开发Grails</title><link>http://www.blogjava.net/rain1102/archive/2008/06/04/205744.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 04 Jun 2008 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/06/04/205744.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/205744.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/06/04/205744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/205744.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/205744.html</trackback:ping><description><![CDATA[1. 下载<a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/europa/winter/eclipse-jee-europa-winter-win32.zip" target="_blank">eclipse-jee-europa-winter-win32.zip</a>，然后解压到磁盘上。<br />
2. 安装Groovy插件URL: <a href="http://dist.codehaus.org/groovy/distributions/updateDev/">http://dist.codehaus.org/groovy/distributions/updateDev/</a>（<span>点击</span><span> <strong><span lang="EN-US">Help &gt; Software Updates &gt; Find and Install&#8230;</span></strong></span>）<br />
3.&nbsp;把GRAILS_HOME <span>添加到</span><span> Classpath Variables</span><span>（</span><strong><span>Windows &gt; Preferences &gt; <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a> &gt; Build Path &gt; Classpath Variables</span></strong><span>）</span> <br />
4. <span>禁用</span><span lang="EN-US"> Groovy </span><span>插件的</span><span lang="EN-US"> Class auto generate </span><span>的功能，在</span><span lang="EN-US"> Contact </span><span>上</span><span> </span><strong><span>右键</span><span lang="EN-US"> &gt; Properties &gt; Groovy Project properties &gt; </span><span>选择</span><span lang="EN-US"> Disable Groovy Compiler Generating class Files &gt;</span></strong><span lang="EN-US"> </span><span>点击</span><span> <strong><span lang="EN-US">OK</span></strong></span><span>。<br />
5.配置使 Web tools 能够编辑 GSP。打开 Windows &gt; Preference &gt; General &gt; Editors &gt; File Associations，添加 *.gsp，并关联到 JSP Editor 即可配置使 Web tools 能够编辑 GSP。打开 Windows &gt; Preference &gt; General &gt; Editors &gt; File Associations，添加 *.gsp，并关联到 JSP Editor 即可。<br />
6. <span>设置</span><span lang="EN-US"> Content Types</span><span>：</span><strong><span lang="EN-US">Windows &gt; Preference &gt; General &gt; Content Types<br />
现在一切就绪了。<br />
此时如果遇到：<span><strong class="highlight">groovy</strong>.<strong class="highlight">lang</strong>.<strong class="highlight">MissingMethodException</strong>: <strong class="highlight">No</strong> <strong class="highlight">signature</strong> <strong class="highlight">of</strong> <strong class="highlight">method</strong>: <strong class="highlight">groovy</strong>.<strong class="highlight">util</strong>.<strong class="highlight">ConfigSlurper</strong>.<strong class="highlight">parse</strong>() is applicable for argument types: (DataSource) values: </span><a href="http://www.nabble.com/user/SendEmail.jtp?type=post&amp;post=14848830&amp;i=0" target="_top" rel="nofollow"><span>%7BDataSource@...</span></a><span>}</span>错误。<br />
则确认一下是否已经禁用Groovy <span>插件的</span><span lang="EN-US"> Class auto generate ，以及删除项目目录下的所有class文件。</span></span></strong></span><img src ="http://www.blogjava.net/rain1102/aggbug/205744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-06-04 11:14 <a href="http://www.blogjava.net/rain1102/archive/2008/06/04/205744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Groovy Eclipse Plugin 安装及问题解决</title><link>http://www.blogjava.net/rain1102/archive/2008/04/08/191413.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 08 Apr 2008 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/04/08/191413.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/191413.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/04/08/191413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/191413.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/191413.html</trackback:ping><description><![CDATA[安装参考链接:<a href="http://groovy.codehaus.org/Eclipse+Plugin" target="_blank">http://<span class="hilite1">groovy</span>.codehaus.org/<span class="hilite2">Eclipse</span>+<span class="hilite3">Plugin</span></a> <br />
按照步骤安装即可. <br />
问题1. <br />
使用<span class="hilite2">Eclipse</span>的Software Updates进行更新安装时报错 configure错误,缺少一些plug <br />
解决方法: <br />
重新安装<span class="hilite2">Eclipse</span>,如果安装有Myclipse,可能是Myclipse的问题,覆盖安装还有问题,最好删除后重新安装. <br />
<br />
问题2:<span class="hilite1">Groovy</span> TestNG feature 不能安装 <br />
解决方法: <br />
如果使用<span class="hilite1">Groovy</span> TestNG feature, <br />
则应先到TestNG update site <br />
(<a href="http://testng.org/doc/download.html" target="_blank">http://testng.org/doc/download.html</a>) <br />
首先安装 TestNG <span class="hilite2">Eclipse</span> plug-in <br />
如果不用<span class="hilite1">Groovy</span> TestNG feature,则取消<span class="hilite1">Groovy</span> TestNG feature选择即可. <br /><img src ="http://www.blogjava.net/rain1102/aggbug/191413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-04-08 11:28 <a href="http://www.blogjava.net/rain1102/archive/2008/04/08/191413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails自定义标签</title><link>http://www.blogjava.net/rain1102/archive/2008/04/02/190236.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 01 Apr 2008 16:28:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/04/02/190236.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/190236.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/04/02/190236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/190236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/190236.html</trackback:ping><description><![CDATA[<p><span style="color: #008000">RaceTrackTagLib.groovy（放到grails-app\taglib目录下）</span><br />
class RaceTrackTagLib {<br />
&nbsp;def formatDate = { attrs -&gt;<br />
&nbsp;&nbsp;def date = attrs.get('date')<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;if (!date) {<br />
&nbsp;&nbsp;&nbsp;date = new Date()<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;def format = attrs.get('format')<br />
&nbsp;&nbsp;if (!format) {<br />
&nbsp;&nbsp;&nbsp;format = "yyyy-MM-dd HH:mm:ss z"<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;out &lt;&lt; new <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.text.SimpleDateFormat(format).format(date)<br />
&nbsp;}</p>
<p>&nbsp;def formatNumber = { attrs -&gt;<br />
&nbsp;&nbsp;def number = attrs.get('number')<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;if (!number) {<br />
&nbsp;&nbsp;&nbsp;number = new Double(0)<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;def format = attrs.get('format')<br />
&nbsp;&nbsp;if (!format) {<br />
&nbsp;&nbsp;&nbsp;format = "0"<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;out &lt;&lt; new <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.text.DecimalFormat(format).format((Double)number)<br />
&nbsp;}<br />
}<br />
</p>
<br />
<span style="color: #008000">页面中使用</span><br />
&lt;g:formatDate date="${race.startDateTime}" format="yyyy-MMM-dd HH:mm"/&gt;<br />
<br />
&lt;g:formatNumber number="${race.distance}" format="##0.00 mi"/&gt;<br />
<br /><img src ="http://www.blogjava.net/rain1102/aggbug/190236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-04-02 00:28 <a href="http://www.blogjava.net/rain1102/archive/2008/04/02/190236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails--Quick Start</title><link>http://www.blogjava.net/rain1102/archive/2008/04/01/189897.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 31 Mar 2008 16:02:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/04/01/189897.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/189897.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/04/01/189897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/189897.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/189897.html</trackback:ping><description><![CDATA[下面将开始一个简单的GRAILS项目.同样也演示了如何创建一个小应用的步骤.<br />
创建Grails项目<br />
一旦你安装过Grails之后,你就可以使用内置的命令来创建新的项目了:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 77.45%; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 25px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">grails&nbsp;create</span><span style="color: #000000">-</span><span style="color: #000000">app</span></div>
之后会提示您,让您输入项目名称.<br />
也可以直接在命令后输入项目的名称.<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 77.53%; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 25px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">grails&nbsp;create</span><span style="color: #000000">-</span><span style="color: #000000">app&nbsp;puras_app</span></div>
命令执行完之后,会生成一个以你输入的项目名为名的目录,里面则是自动生成的目录结构和一些基础代码了,结构如下:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 77.49%; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 307px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">%</span><span style="color: #000000">PROJECT_HOME</span><span style="color: #000000">%</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;grails</span><span style="color: #000000">-</span><span style="color: #000000">app<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;conf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">---&gt;</span><span style="color: #000000">&nbsp;本地配置文件,像是数据源<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;controllers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">---&gt;</span><span style="color: #000000">&nbsp;这个文件夹里存有Controller类<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;domain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">---&gt;</span><span style="color: #000000">&nbsp;这个文件夹里存有domain类<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;i18n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">---&gt;</span><span style="color: #000000">&nbsp;国际化信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;services&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">---&gt;</span><span style="color: #000000">&nbsp;location&nbsp;of&nbsp;services<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;taglib&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">---&gt;</span><span style="color: #000000">&nbsp;标签库<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;util&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">---&gt;</span><span style="color: #000000">&nbsp;工具库<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;views&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">---&gt;</span><span style="color: #000000">&nbsp;视图<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;layouts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">---&gt;</span><span style="color: #000000">&nbsp;布局<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;hibernate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">---&gt;</span><span style="color: #000000">&nbsp;可选择的Hibernate的配置<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;lib<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;spring&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">---&gt;</span><span style="color: #000000">&nbsp;可选择的Spring配置<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;src<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;groovy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">---&gt;</span><span style="color: #000000">&nbsp;可选择的,groovy源代码<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;java&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">---&gt;</span><span style="color: #000000">&nbsp;可选择的,java源代码<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;war<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;WEB</span><span style="color: #000000">-</span><span style="color: #000000">INF</span></div>
接下来,可以选择配置一个数据源,在执行"create-app"时,grails就创建了几个数据源在你的%PROJECT_HOME%/grails-app/conf目录里,它们都是标准的环境:DevelopmentDataSource(开发数据源),TestDataSource(测试数据源),和ProductionDataSource(产品数据源).所有的例子都是操作在开发环境之下.<br />
在执行应用的时候可以选择所属的环境(以后有介绍).<br />
默认的,每个数据源都配置的是内嵌的HSQLDB数据库(可以很方便的测试,但是现实的环境中大概没什么用处),所以此步骤是可选的:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 78.17%; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 145px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">DevelopmentDataSource.groovy<br />
</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;DevelopmentDataSource&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;pooling&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;String&nbsp;dbCreate&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">create-drop</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;one&nbsp;of&nbsp;'create',&nbsp;'create-drop','update'</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">jdbc:hsqldb:mem:testDB</span><span style="color: #000000">"</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;String&nbsp;driverClassName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">org.hsqldb.jdbcDriver</span><span style="color: #000000">"</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;String&nbsp;username&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">sa</span><span style="color: #000000">"</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;String&nbsp;password&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000"><br />
}</span></div>
配置这个数据库,就是简单的替换上所希望使用数据库的值,再将其所用的驱动包拷贝到%PROJECT_HOME%/lib目录下.<br />
创建一个实体类<br />
确认你现在所在的目录是你的项目的主目录,之后输入以下命令<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 78.08%; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 25px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">grails&nbsp;create</span><span style="color: #000000">-</span><span style="color: #000000">domain</span><span style="color: #000000">-</span><span style="color: #0000ff">class</span></div>
之后命令会提示你输入要创建的类名,你也可以直接在命令后直接输入类名,如:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 78.27%; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 25px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">grails&nbsp;create</span><span style="color: #000000">-</span><span style="color: #000000">domain</span><span style="color: #000000">-</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Book</span></div>
向类里添加两个属性:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 78.26%; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 85px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">Book.groovy<br />
</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Book&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;title<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;author<br />
}</span></div>
你可能想要创建一些测试数据.一个简单的方法就是在%PROJECT_HOME%/grails-app/conf/ApplicationBootStrap.groovy这个Grails应用的启动类的"init"闭包里创建并保存测试数据.<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 78.46%; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 160px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ApplicationBootStrap&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;init&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{&nbsp;servletContext&nbsp;</span><span style="color: #000000">-&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Create&nbsp;some&nbsp;test&nbsp;data</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Book(author:</span><span style="color: #000000">"</span><span style="color: #000000">Stephen&nbsp;King</span><span style="color: #000000">"</span><span style="color: #000000">,title:</span><span style="color: #000000">"</span><span style="color: #000000">The&nbsp;Shining</span><span style="color: #000000">"</span><span style="color: #000000">).save()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Book(author:</span><span style="color: #000000">"</span><span style="color: #000000">James&nbsp;Patterson</span><span style="color: #000000">"</span><span style="color: #000000">,title:</span><span style="color: #000000">"</span><span style="color: #000000">Along&nbsp;Came&nbsp;a&nbsp;Spider</span><span style="color: #000000">"</span><span style="color: #000000">).save()<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;destroy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
创建Controller<br />
Controllers是Grails应用的中心,它们处理WEB请求和请求的URLs,将请求和请求参数映射到控制器类和它里面的一个闭包.<br />
执行"grails generate-all"命令,并输入控制器的名称.在我们的例子中,我们在生成控制器类的时候输入"Book",将会在%PROJECT_HOME%/grails-app/controllers下生成一个名叫BookController.groovy的文件.也可以直接在命令后直接加上控制器类的名称.<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 78.57%; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 40px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">grails&nbsp;generate</span><span style="color: #000000">-</span><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">all&nbsp;Book<br />
</span></div>
<span style="color: #000000">打开这个文件,并把里面的内容替换成下面所示的代码,使用在你的程序运行的时候动态生成的动态脚手架.<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 78.64%; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 55px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;BookController&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;scaffold&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Book<br />
}</span></div>
要注意你输入的"Book"是大写的B开头.<br />
<br />
当然,你同样可以不替换而使用默认生成的代码.它可是有学习的价值哦.<br />
<br />
要开始你的Grails应用,执行下面的命令<br />
grails run-app<br />
<br />
这个命令将启动一个Jetty应用服务器的一个实例运行在8080端口上.为了启动一个运行在不同端口上,比如说9090,使用grails -Dserver.port=9090 run-app.要访问books的例表,打开浏览器,并输入:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 78.81%; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 25px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">http:</span><span style="color: #008000">//</span><span style="color: #008000">localhost:8080/puras_app/book/list</span></div>
<br />
简单的小应用到此结束.参照它,举一返三,做一些简单的小应用还是可以的!<br />
</span><img src ="http://www.blogjava.net/rain1102/aggbug/189897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-04-01 00:02 <a href="http://www.blogjava.net/rain1102/archive/2008/04/01/189897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装Grails </title><link>http://www.blogjava.net/rain1102/archive/2008/03/31/189891.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 31 Mar 2008 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/03/31/189891.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/189891.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/03/31/189891.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/189891.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/189891.html</trackback:ping><description><![CDATA[<p>1、需求</p>
<ul>
    <li>要求安装JDK1.4或以上版本
    <li>设置JAVA_HOME环境变量，指向JDK安装位置 </li>
</ul>
<p>2、安装Grails</p>
<ul>
    <li><a href="http://grails.codehaus.org/" target="_blank">http://grails.codehaus.org/</a>下载最新的Grails版本&nbsp;
    <li>将压缩包解压到合适的位置
    <li>&nbsp;设置GRAILS_HOME环境变量，指向Grails安装位置
    <li>将%GRAILS_HOME%\bin追加到PATH环境变量中
    <li>在命令行执行grails，如果显示Grails的版本信息，表示安装成功！</li>
</ul><img src ="http://www.blogjava.net/rain1102/aggbug/189891.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-03-31 22:49 <a href="http://www.blogjava.net/rain1102/archive/2008/03/31/189891.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>