﻿<?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-open source field-随笔分类-grails</title><link>http://www.blogjava.net/yangxc/category/43286.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 28 Jan 2010 20:31:40 GMT</lastBuildDate><pubDate>Thu, 28 Jan 2010 20:31:40 GMT</pubDate><ttl>60</ttl><item><title>GSP在Grails中的使用</title><link>http://www.blogjava.net/yangxc/archive/2009/12/29/307632.html</link><dc:creator>杨晓晨</dc:creator><author>杨晓晨</author><pubDate>Tue, 29 Dec 2009 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/yangxc/archive/2009/12/29/307632.html</guid><wfw:comment>http://www.blogjava.net/yangxc/comments/307632.html</wfw:comment><comments>http://www.blogjava.net/yangxc/archive/2009/12/29/307632.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangxc/comments/commentRss/307632.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangxc/services/trackbacks/307632.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" />
<link rel="themeData" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
a:link, span.MsoHyperlink
{
color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{
color:purple;
text-decoration:underline;
text-underline:single;}
.MsoChpDefault
{
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";}
</style>
<![endif]-->
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">视图存储在grails-app/views directory目录下。主要想学习如何创建Taglib和如何利用模板技术。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Grails</span><span style="font-size: 12pt; font-family: 宋体;">使用GSP作为表现层，在GSP中groovy不只是表明GSP是基于什么技术的，而且还可以利用Groovy来创建一些脚本来在GSP中执行。在这点上说GSP和JSP很相像。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">当然内嵌的脚本并不利于代码的重用。Grails中的Taglib和模板给你提供了一个很好的重用代码的途径。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">GSP </span><span style="font-size: 12pt; font-family: 宋体;">是Grails的视图的基础。List页面提供到Show页面的连接，Show页面允许你导航到Edit页面。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">MVC</span><span style="font-size: 12pt; font-family: 宋体;">的分离策略主要是可以给应用程序不同的视图，Grails通过不同的插件来支持不同的表现层技术。可以通过命令</span><span style="font-size: 12pt; font-family: 宋体;">grails install-plugin </span><span style="font-size: 12pt; font-family: 宋体;">来查看现在安装的插件。</span><span style="font-size: 12pt; font-family: 宋体;"> 或使用</span><span style="font-size: 12pt; font-family: 宋体;">grails list-plugins</span><span style="font-size: 12pt; font-family: 宋体;">来获得当前可用的插件。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">虽然Grails 并不支持 native和<span>
JSF</span>，但是你还是可以使用他们。一个Grails程序就是一个标准的Java EE程序，因此只要你在lib目录中放置了正确的Jar文件，并在WEB-INF/web.xml文件中进行了正确的配置，就可以正常的使用了。Grails实在一个标准的servlet容器中开发的，所以Grails程序也支持JSP。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">类似的增加Ajax框架也同样的简单，拷贝JavaScript库到web-app/js目录下。 Prototype和Scriptaculous是Grails默认安装的。RichUI插件可以很好的从Ajax库中选择正确的UI。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">当查看插件列表时，可以看到对富客户端，如：Flex，OpenLazlo，GWT和ZK的支持。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">在GSP文件中有许多有用的以</span><span style="font-size: 12pt; font-family: 宋体;">&lt;g:</span><span style="font-size: 12pt; font-family: 宋体;">开头的标签。GSP文件就是Html和Grails标签的混合体。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">在控制器中使用</span><span style="font-size: 12pt; font-family: 宋体;">def scaffold </span><span style="font-size: 12pt; font-family: 宋体;">的作用是指示Grails动态的在运行的时候产生GSP文件。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">输入命令 </span><span style="font-size: 12pt; font-family: 宋体;">grails generate-all Trip</span><span style="font-size: 12pt; font-family: 宋体;">会产生控制器和相关的GSP文件</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">当访问 <a href="http://localhost:9090/trip-planner/trip/list">http://localhost:9090/trip-planner/trip/list</a>时，会先调用TripController来返回Trip的列表，并传递给list.gsp来显示。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">下面介绍一些常用的Grails的标签，包括</span><span style="font-size: 12pt; font-family: 宋体;">&lt;g:each&gt;</span><span style="font-size: 12pt; font-family: 宋体;">。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&lt;g:each&gt;</span><span style="font-size: 12pt; font-family: 宋体;">是个非常常用的Grails标签。它遍历列表中的每个元素，打开文件/trip/list.gsp 就可以看到如何使用这个标签：</span></p>
<table style="width: 100%;" width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&lt;g:each in="${tripList}"
            status="i" var="trip"&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&lt;tr
            class="${(i % 2) == 0 ? 'even' : 'odd'}"&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;
            </span>&lt;td&gt;&lt;link action="show"
            id="${trip.id}"&gt;${trip.id?.encodeAsHTML()}&lt;/g:link&gt;&lt;/td&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;
            </span>&lt;td&gt;${trip.airline?.encodeAsHTML()}&lt;/td&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;
            </span>&lt;td&gt;${trip.name?.encodeAsHTML()}&lt;/td&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;
            </span>&lt;td&gt;${trip.city?.encodeAsHTML()}&lt;/td&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;
            </span>&lt;td&gt;${trip.startDate?.encodeAsHTML()}&lt;/td&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;
            </span>&lt;td&gt;${trip.endDate?.encodeAsHTML()}&lt;/td&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&lt;/tr&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&lt;/g:each&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">The </span><span style="font-size: 12pt; font-family: 宋体;">status</span><span style="font-size: 12pt; font-family: 宋体;"> attribute in the</span><span style="font-size: 12pt; font-family: 宋体;">在 </span><span style="font-size: 12pt; font-family: 宋体;">&lt;g:each&gt;</span><span style="font-size: 12pt; font-family: 宋体;">中，status就是一个简单的计数器。Var属性允许你定义一个当前元素的名字。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">另一个Grails 标签是 </span><span style="font-size: 12pt; font-family: 宋体;">&lt;g:link&gt;</span><span style="font-size: 12pt; font-family: 宋体;">，它建立一个HTML的&lt;a href&gt;连接。&lt;g:createLink&gt;标签会创建一个真正的URL字符串。在</span><span style="font-size: 12pt; font-family: 宋体;">list.gsp</span><span style="font-size: 12pt; font-family: 宋体;">上部，你可以看到另一个和连接相关的标签</span><span style="font-size: 12pt; font-family: 宋体;">&lt;g:createLinkTo&gt;</span><span style="font-size: 12pt; font-family: 宋体;">，这个标签接受一个dir</span><span style="font-size: 12pt; font-family: 宋体;">和 </span><span style="font-size: 12pt; font-family: 宋体;">file</span><span style="font-size: 12pt; font-family: 宋体;">属性：</span></p>
<table style="width: 100%;" width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&lt;div class="nav"&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&lt;span
            class="menuButton"&gt;&lt;a class="home"
            href="${createLinkTo(dir:'')}"&gt;Home&lt;/a&gt;&lt;/span&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&lt;span
            class="menuButton"&gt;&lt;link class="create"
            action="create"&gt;New Trip&lt;/g:link&gt;&lt;/span&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&lt;/div&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">在list.gsp中还可以看到</span><span style="font-size: 12pt; font-family: 宋体;">&lt;g:if&gt;</span><span style="font-size: 12pt; font-family: 宋体;">标签：</span></p>
<table style="width: 100%;" width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&lt;h1&gt;Trip List&lt;/h1&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&lt;if test="${flash.message}"&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&lt;div
            class="message"&gt;${flash.message}&lt;/div&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&lt;/g:if&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&lt;g:paginate&gt;</span><span style="font-size: 12pt; font-family: 宋体;">标签显示的是相关的分页逻辑；&lt;g:sortable&gt;</span><span style="font-size: 12pt; font-family: 宋体;">把列的标题变成可点击的，用来进行排序。其他的一些标签，如：</span><span style="font-size: 12pt; font-family: 宋体;">&lt;g:form&gt;</span><span style="font-size: 12pt; font-family: 宋体;">和 </span><span style="font-size: 12pt; font-family: 宋体;">&lt;g:submit&gt;</span><span style="font-size: 12pt; font-family: 宋体;">指示显示相对应的html元素。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">自定义标签库</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">虽然标准的Grails标签非常有用，但是最终你还是需要自己的标签。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">在Grails中创建标签库要比在JSP中创建标签库方便。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">在Grails中创建标签库的第一步是输入命令</span><span style="font-size: 12pt; font-family: 宋体;">grails create-tag-lib Date</span><span style="font-size: 12pt; font-family: 宋体;">。这样就会创建两个文件： grails-app/taglib/DateTagLib.groovy (标签库)和<span>
grails-app/test/integration/DateTagLibTests.groovy (</span>测试文件)向文件DateTagLib.groovy中添加以下的代码： </span></p>
<table style="width: 100%;" width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">class DateTagLib {</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;def thisYear =
            {</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; out &lt;&lt;
            Calendar.getInstance().get(Calendar.YEAR)</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;}</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">}</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">这样就创建了</span><span style="font-size: 12pt; font-family: 宋体;">&lt;g:thisYear&gt;</span><span style="font-size: 12pt; font-family: 宋体;">标签，年的属性直接输出到输出流中。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">测试标签库</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">在文件DateTagLibTests.groovy里添加如下的测试代码： </span></p>
<table style="width: 100%;" width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">class DateTagLibTests extends GroovyTestCase {</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;def dateTagLib</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;void setUp(){</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; dateTagLib =
            new DateTagLib()</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;}</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;void
            testThisYear() {</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; String
            expected = Calendar.getInstance().get(Calendar.YEAR)</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><span>&nbsp;&nbsp;&nbsp;
            </span>assertEquals("the years don't match", expected,
            dateTagLib.thisYear())</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;}</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">}</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">输入命令</span><span style="font-size: 12pt; font-family: 宋体;">grails test-app</span><span style="font-size: 12pt; font-family: 宋体;">来进行测试</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">命令</span><span style="font-size: 12pt; font-family: 宋体;">grails test-app</span><span style="font-size: 12pt; font-family: 宋体;">除了运行测试用例外，还会生成测试报告。打开文件test/reports/html/index.html可以进行查看。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">这样这个标签就测试开发完了。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">自定义标签的高级话题</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">大部分标签可以有body和属性。</span></p>
<table style="width: 100%;" width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">class DateTagLib {</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;def thisYear =
            {</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; out &lt;&lt;
            Calendar.getInstance().get(Calendar.YEAR)</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;}</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;def copyright =
            { attrs, body -&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; out &lt;&lt;
            "&lt;div id='copyright'&gt;"</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; out &lt;&lt;
            "&amp;copy; ${attrs['startYear']} - ${thisYear()}, ${body()}"</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; out &lt;&lt;
            " All Rights Reserved."</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; out &lt;&lt;
            "&lt;/div&gt;"</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;}</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">}</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">注意</span><span style="font-size: 12pt; font-family: 宋体;">attrs</span><span style="font-size: 12pt; font-family: 宋体;">是一个包含标签属性的</span><span style="font-size: 12pt; font-family: 宋体;">HashMap</span><span style="font-size: 12pt; font-family: 宋体;">。可以通过这个HashMap来得到startYear属性。</span><span style="font-size: 12pt; font-family: 宋体;">类似的body是作为一个Closure传递进来的。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">默认的自定义的标签都放在g:命名空间下，如果想修改这个行为的话，需要在DateTagLib.groovy 中添加</span><span style="font-size: 12pt; font-family: 宋体;">static namespace = 'trip'</span><span style="font-size: 12pt; font-family: 宋体;">。这样在GSP中就可以使用以下的方式进行调用：<span>&lt;trip:copyright startYear="2002"&gt;FakeCo
Inc.&lt;/trip:copyright&gt;</span></span><span style="font-size: 12pt; font-family: 宋体;">。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">模板</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">自定义标签库是重用代码的一个好的办法，但是大段的代码的好的重用方式是使用模板。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">一个模板就是可以在多个GSP文件中共享的一段GSP代码。在<span>the
grails-app/views/trip </span>目录下创建的文件，只有Trip的视图才能访问。只有在grails-app/views 目录下创建的文件才能全局共享。创建如下的全局模板：</span></p>
<table style="width: 100%;" width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&lt;div id="footer"&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&lt;g:copyright
            startYear='2002'&gt;FakeCo, Inc.&lt;/g:copyright&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&lt;div
            id="powered-by"&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; &lt;img
            src="${createLinkTo(dir:'images', file:'grails-powered.jpg')}"
            /&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&lt;/div&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&lt;/div&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">下面来在相应的视图中引入这个模板：</span></p>
<table style="width: 100%;" width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm;">
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&lt;html&gt;&lt;body&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">...</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&lt;g:render template="/footer" /&gt;</span></p>
            <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">&lt;/body&gt;&lt;/html&gt;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="text-align: left;" align="left"><a name="N10388"><span style="font-size: 12pt; font-family: 宋体;">自定义scaffolding</span></a></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">为了自定义 scaffolding，需要使用命令</span><span style="font-size: 12pt; font-family: 宋体;">grails install-templates</span><span style="font-size: 12pt; font-family: 宋体;">。这个命令会向项目添加一个新的目录src/templates。在这个目录下会有三个子目录artifacts、scaffolding和war。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">artifacts </span><span style="font-size: 12pt; font-family: 宋体;">目录中保存的是生成</span><span style="font-size: 12pt; font-family: 宋体;">Controller</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt; font-family: 宋体;">DomainClass</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt; font-family: 宋体;">TagLib</span><span style="font-size: 12pt; font-family: 宋体;">时需要使用的模板。比如：如果想要所有的控制器都扩展一个相同的抽象类。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">war </span><span style="font-size: 12pt; font-family: 宋体;">目录包含一个web.xml文件。如果需要添加自定义的参数，如：filters 或者 servlets，都可以在这个文件中进行。但你使用grails war命令时，这个文件就会被包含在生成的war文件中。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">scaffolding </span><span style="font-size: 12pt; font-family: 宋体;">目录中包含的是生成视图时，需要指定的信息。打开 list.gsp 然后添加 </span><span style="font-size: 12pt; font-family: 宋体;">&lt;g:render template="/footer" /&gt;</span><span style="font-size: 12pt; font-family: 宋体;">到文件的底部。</span></p>
<img src ="http://www.blogjava.net/yangxc/aggbug/307632.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangxc/" target="_blank">杨晓晨</a> 2009-12-29 14:21 <a href="http://www.blogjava.net/yangxc/archive/2009/12/29/307632.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GORM相关的知识</title><link>http://www.blogjava.net/yangxc/archive/2009/12/28/307523.html</link><dc:creator>杨晓晨</dc:creator><author>杨晓晨</author><pubDate>Mon, 28 Dec 2009 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/yangxc/archive/2009/12/28/307523.html</guid><wfw:comment>http://www.blogjava.net/yangxc/comments/307523.html</wfw:comment><comments>http://www.blogjava.net/yangxc/archive/2009/12/28/307523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangxc/comments/commentRss/307523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangxc/services/trackbacks/307523.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Normal07.8 磅02falsefalsefalseEN-USZH-CNX-NONEMicrosoftInternetExplorer4...&nbsp;&nbsp;<a href='http://www.blogjava.net/yangxc/archive/2009/12/28/307523.html'>阅读全文</a><img src ="http://www.blogjava.net/yangxc/aggbug/307523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangxc/" target="_blank">杨晓晨</a> 2009-12-28 15:33 <a href="http://www.blogjava.net/yangxc/archive/2009/12/28/307523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>