久热精品视频在线免费观看,91久久精品www人人做人人爽,蜜臀久久99精品久久久久久9http://www.aygfsteel.com/yangxc/category/42286.htmlzh-cnTue, 29 Dec 2009 20:13:27 GMTTue, 29 Dec 2009 20:13:27 GMT60GSP在Grails中的使用http://www.aygfsteel.com/yangxc/archive/2009/12/29/307632.html楊曉晨楊曉晨Tue, 29 Dec 2009 06:21:00 GMThttp://www.aygfsteel.com/yangxc/archive/2009/12/29/307632.htmlhttp://www.aygfsteel.com/yangxc/comments/307632.htmlhttp://www.aygfsteel.com/yangxc/archive/2009/12/29/307632.html#Feedback0http://www.aygfsteel.com/yangxc/comments/commentRss/307632.htmlhttp://www.aygfsteel.com/yangxc/services/trackbacks/307632.html

視圖存儲在grails-app/views directory目錄下。主要想學習如何創建Taglib和如何利用模板技術。

Grails使用GSP作為表現層,在GSP中groovy不只是表明GSP是基于什么技術的,而且還可以利用Groovy來創建一些腳本來在GSP中執行。在這點上說GSP和JSP很相像。

當然內嵌的腳本并不利于代碼的重用。Grails中的Taglib和模板給你提供了一個很好的重用代碼的途徑。

GSP 是Grails的視圖的基礎。List頁面提供到Show頁面的連接,Show頁面允許你導航到Edit頁面。

MVC的分離策略主要是可以給應用程序不同的視圖,Grails通過不同的插件來支持不同的表現層技術。可以通過命令grails install-plugin 來查看現在安裝的插件。 或使用grails list-plugins來獲得當前可用的插件。

雖然Grails 并不支持 native和 JSF,但是你還是可以使用他們。一個Grails程序就是一個標準的Java EE程序,因此只要你在lib目錄中放置了正確的Jar文件,并在WEB-INF/web.xml文件中進行了正確的配置,就可以正常的使用了。Grails實在一個標準的servlet容器中開發的,所以Grails程序也支持JSP。

類似的增加Ajax框架也同樣的簡單,拷貝JavaScript庫到web-app/js目錄下。 Prototype和Scriptaculous是Grails默認安裝的。RichUI插件可以很好的從Ajax庫中選擇正確的UI。

當查看插件列表時,可以看到對富客戶端,如:Flex,OpenLazlo,GWT和ZK的支持。

在GSP文件中有許多有用的以<g:開頭的標簽。GSP文件就是Html和Grails標簽的混合體。

在控制器中使用def scaffold 的作用是指示Grails動態的在運行的時候產生GSP文件。

輸入命令 grails generate-all Trip會產生控制器和相關的GSP文件

當訪問 http://localhost:9090/trip-planner/trip/list時,會先調用TripController來返回Trip的列表,并傳遞給list.gsp來顯示。

下面介紹一些常用的Grails的標簽,包括<g:each>

<g:each>是個非常常用的Grails標簽。它遍歷列表中的每個元素,打開文件/trip/list.gsp 就可以看到如何使用這個標簽:

<g:each in="${tripList}" status="i" var="trip">

 <tr class="${(i % 2) == 0 ? 'even' : 'odd'}">

    <td><link action="show" id="${trip.id}">${trip.id?.encodeAsHTML()}</g:link></td>

    <td>${trip.airline?.encodeAsHTML()}</td>

    <td>${trip.name?.encodeAsHTML()}</td>

    <td>${trip.city?.encodeAsHTML()}</td>

    <td>${trip.startDate?.encodeAsHTML()}</td>

    <td>${trip.endDate?.encodeAsHTML()}</td>

 </tr>

</g:each>

The status attribute in the<g:each>中,status就是一個簡單的計數器。Var屬性允許你定義一個當前元素的名字。

另一個Grails 標簽是 <g:link>,它建立一個HTML的<a href>連接。<g:createLink>標簽會創建一個真正的URL字符串。在list.gsp上部,你可以看到另一個和連接相關的標簽<g:createLinkTo>,這個標簽接受一個dirfile屬性:

<div class="nav">

 <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>

 <span class="menuButton"><link class="create" action="create">New Trip</g:link></span>

</div>

在list.gsp中還可以看到<g:if>標簽:

<h1>Trip List</h1>

<if test="${flash.message}">

 <div class="message">${flash.message}</div>

</g:if>

<g:paginate>標簽顯示的是相關的分頁邏輯;<g:sortable>把列的標題變成可點擊的,用來進行排序。其他的一些標簽,如:<g:form><g:submit>指示顯示相對應的html元素。

自定義標簽庫

雖然標準的Grails標簽非常有用,但是最終你還是需要自己的標簽。

在Grails中創建標簽庫要比在JSP中創建標簽庫方便。

在Grails中創建標簽庫的第一步是輸入命令grails create-tag-lib Date。這樣就會創建兩個文件: grails-app/taglib/DateTagLib.groovy (標簽庫)和 grails-app/test/integration/DateTagLibTests.groovy (測試文件)向文件DateTagLib.groovy中添加以下的代碼:

class DateTagLib {

 def thisYear = {

    out << Calendar.getInstance().get(Calendar.YEAR)

 }

}

這樣就創建了<g:thisYear>標簽,年的屬性直接輸出到輸出流中。

測試標簽庫

在文件DateTagLibTests.groovy里添加如下的測試代碼:

               

class DateTagLibTests extends GroovyTestCase {

 def dateTagLib

 void setUp(){

    dateTagLib = new DateTagLib()

 }

 void testThisYear() {

    String expected = Calendar.getInstance().get(Calendar.YEAR)

    assertEquals("the years don't match", expected, dateTagLib.thisYear())

 }

}

輸入命令grails test-app來進行測試

命令grails test-app除了運行測試用例外,還會生成測試報告。打開文件test/reports/html/index.html可以進行查看。

這樣這個標簽就測試開發完了。

自定義標簽的高級話題

大部分標簽可以有body和屬性。

               

class DateTagLib {

 def thisYear = {

    out << Calendar.getInstance().get(Calendar.YEAR)

 }

 def copyright = { attrs, body ->

    out << "<div id='copyright'>"

    out << "&copy; ${attrs['startYear']} - ${thisYear()}, ${body()}"

    out << " All Rights Reserved."

    out << "</div>"

 }

}

注意attrs是一個包含標簽屬性的HashMap。可以通過這個HashMap來得到startYear屬性。類似的body是作為一個Closure傳遞進來的。

默認的自定義的標簽都放在g:命名空間下,如果想修改這個行為的話,需要在DateTagLib.groovy 中添加static namespace = 'trip'。這樣在GSP中就可以使用以下的方式進行調用:<trip:copyright startYear="2002">FakeCo Inc.</trip:copyright>

模板

自定義標簽庫是重用代碼的一個好的辦法,但是大段的代碼的好的重用方式是使用模板。

一個模板就是可以在多個GSP文件中共享的一段GSP代碼。在the grails-app/views/trip 目錄下創建的文件,只有Trip的視圖才能訪問。只有在grails-app/views 目錄下創建的文件才能全局共享。創建如下的全局模板:

<div id="footer">

 <g:copyright startYear='2002'>FakeCo, Inc.</g:copyright>

 <div id="powered-by">

    <img src="${createLinkTo(dir:'images', file:'grails-powered.jpg')}" />

 </div>

</div>

下面來在相應的視圖中引入這個模板:

               

<html><body>

...

<g:render template="/footer" />

</body></html>

自定義scaffolding

為了自定義 scaffolding,需要使用命令grails install-templates。這個命令會向項目添加一個新的目錄src/templates。在這個目錄下會有三個子目錄artifacts、scaffolding和war。

artifacts 目錄中保存的是生成ControllerDomainClassTagLib時需要使用的模板。比如:如果想要所有的控制器都擴展一個相同的抽象類。

war 目錄包含一個web.xml文件。如果需要添加自定義的參數,如:filters 或者 servlets,都可以在這個文件中進行。但你使用grails war命令時,這個文件就會被包含在生成的war文件中。

scaffolding 目錄中包含的是生成視圖時,需要指定的信息。打開 list.gsp 然后添加 <g:render template="/footer" />到文件的底部。



楊曉晨 2009-12-29 14:21 發表評論
]]>
主站蜘蛛池模板: 临澧县| 通山县| 巫溪县| 金川县| 合作市| 迁安市| 长兴县| 固阳县| 遂平县| 景宁| 漯河市| 梁平县| 山阳县| 巴林右旗| 新宾| 廊坊市| 棋牌| 阿勒泰市| 赣州市| 北川| 砚山县| 白玉县| 新龙县| 木兰县| 承德市| 商城县| 崇礼县| 偃师市| 盐津县| 邛崃市| 岱山县| 海林市| 聂荣县| 红河县| 武平县| 喜德县| 凌源市| 海林市| 乌审旗| 毕节市| 新和县|