欧美精品一区二区三区在线四季,成人亚洲欧美,欧美黑人xxxhttp://www.aygfsteel.com/yangxc/zh-cnThu, 19 Jun 2025 14:33:49 GMTThu, 19 Jun 2025 14:33:49 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#Feedback1http://www.aygfsteel.com/yangxc/comments/commentRss/307632.htmlhttp://www.aygfsteel.com/yangxc/services/trackbacks/307632.html

視圖存儲(chǔ)在grails-app/views directory目錄下。主要想學(xué)習(xí)如何創(chuàng)建Taglib和如何利用模板技術(shù)。

Grails使用GSP作為表現(xiàn)層,在GSP中g(shù)roovy不只是表明GSP是基于什么技術(shù)的,而且還可以利用Groovy來(lái)創(chuàng)建一些腳本來(lái)在GSP中執(zhí)行。在這點(diǎn)上說(shuō)GSP和JSP很相像。

當(dāng)然內(nèi)嵌的腳本并不利于代碼的重用。Grails中的Taglib和模板給你提供了一個(gè)很好的重用代碼的途徑。

GSP 是Grails的視圖的基礎(chǔ)。List頁(yè)面提供到Show頁(yè)面的連接,Show頁(yè)面允許你導(dǎo)航到Edit頁(yè)面。

MVC的分離策略主要是可以給應(yīng)用程序不同的視圖,Grails通過(guò)不同的插件來(lái)支持不同的表現(xiàn)層技術(shù)。可以通過(guò)命令grails install-plugin 來(lái)查看現(xiàn)在安裝的插件。 或使用grails list-plugins來(lái)獲得當(dāng)前可用的插件。

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

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

當(dāng)查看插件列表時(shí),可以看到對(duì)富客戶端,如:Flex,OpenLazlo,GWT和ZK的支持。

在GSP文件中有許多有用的以<g:開(kāi)頭的標(biāo)簽。GSP文件就是Html和Grails標(biāo)簽的混合體。

在控制器中使用def scaffold 的作用是指示Grails動(dòng)態(tài)的在運(yùn)行的時(shí)候產(chǎn)生GSP文件。

輸入命令 grails generate-all Trip會(huì)產(chǎn)生控制器和相關(guān)的GSP文件

當(dāng)訪問(wèn) http://localhost:9090/trip-planner/trip/list時(shí),會(huì)先調(diào)用TripController來(lái)返回Trip的列表,并傳遞給list.gsp來(lái)顯示。

下面介紹一些常用的Grails的標(biāo)簽,包括<g:each>。

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

<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就是一個(gè)簡(jiǎn)單的計(jì)數(shù)器。Var屬性允許你定義一個(gè)當(dāng)前元素的名字。

另一個(gè)Grails 標(biāo)簽是 <g:link>,它建立一個(gè)HTML的<a href>連接。<g:createLink>標(biāo)簽會(huì)創(chuàng)建一個(gè)真正的URL字符串。在list.gsp上部,你可以看到另一個(gè)和連接相關(guān)的標(biāo)簽<g:createLinkTo>,這個(gè)標(biāo)簽接受一個(gè)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>標(biāo)簽:

<h1>Trip List</h1>

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

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

</g:if>

<g:paginate>標(biāo)簽顯示的是相關(guān)的分頁(yè)邏輯;<g:sortable>把列的標(biāo)題變成可點(diǎn)擊的,用來(lái)進(jìn)行排序。其他的一些標(biāo)簽,如:<g:form><g:submit>指示顯示相對(duì)應(yīng)的html元素。

自定義標(biāo)簽庫(kù)

雖然標(biāo)準(zhǔn)的Grails標(biāo)簽非常有用,但是最終你還是需要自己的標(biāo)簽。

在Grails中創(chuàng)建標(biāo)簽庫(kù)要比在JSP中創(chuàng)建標(biāo)簽庫(kù)方便。

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

class DateTagLib {

 def thisYear = {

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

 }

}

這樣就創(chuàng)建了<g:thisYear>標(biāo)簽,年的屬性直接輸出到輸出流中。

測(cè)試標(biāo)簽庫(kù)

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

               

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來(lái)進(jìn)行測(cè)試

命令grails test-app除了運(yùn)行測(cè)試用例外,還會(huì)生成測(cè)試報(bào)告。打開(kāi)文件test/reports/html/index.html可以進(jìn)行查看。

這樣這個(gè)標(biāo)簽就測(cè)試開(kāi)發(fā)完了。

自定義標(biāo)簽的高級(jí)話題

大部分標(biāo)簽可以有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是一個(gè)包含標(biāo)簽屬性的HashMap??梢酝ㄟ^(guò)這個(gè)HashMap來(lái)得到startYear屬性。類似的body是作為一個(gè)Closure傳遞進(jìn)來(lái)的。

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

模板

自定義標(biāo)簽庫(kù)是重用代碼的一個(gè)好的辦法,但是大段的代碼的好的重用方式是使用模板。

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

<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>

下面來(lái)在相應(yīng)的視圖中引入這個(gè)模板:

               

<html><body>

...

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

</body></html>

自定義scaffolding

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

artifacts 目錄中保存的是生成Controller、DomainClassTagLib時(shí)需要使用的模板。比如:如果想要所有的控制器都擴(kuò)展一個(gè)相同的抽象類。

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

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



]]>
GORM相關(guān)的知識(shí)http://www.aygfsteel.com/yangxc/archive/2009/12/28/307523.html楊曉晨楊曉晨Mon, 28 Dec 2009 07:33:00 GMThttp://www.aygfsteel.com/yangxc/archive/2009/12/28/307523.htmlhttp://www.aygfsteel.com/yangxc/comments/307523.htmlhttp://www.aygfsteel.com/yangxc/archive/2009/12/28/307523.html#Feedback0http://www.aygfsteel.com/yangxc/comments/commentRss/307523.htmlhttp://www.aygfsteel.com/yangxc/services/trackbacks/307523.html閱讀全文

]]>
perl editor的開(kāi)發(fā)歷程(一)想法http://www.aygfsteel.com/yangxc/archive/2009/04/02/263621.html楊曉晨楊曉晨Thu, 02 Apr 2009 14:04:00 GMThttp://www.aygfsteel.com/yangxc/archive/2009/04/02/263621.htmlhttp://www.aygfsteel.com/yangxc/comments/263621.htmlhttp://www.aygfsteel.com/yangxc/archive/2009/04/02/263621.html#Feedback2http://www.aygfsteel.com/yangxc/comments/commentRss/263621.htmlhttp://www.aygfsteel.com/yangxc/services/trackbacks/263621.html (一)ide上安裝插件,如eclipse和netbeans等;
(二)vi和emacs類型這些傳統(tǒng)意義上的文本編輯器,也是加上一些插件來(lái)完成相關(guān)的工作。
(三)一些專門的開(kāi)發(fā)商開(kāi)發(fā)的專門的perl開(kāi)發(fā)工具(當(dāng)然是收費(fèi)的,所以不做考慮)。
第一種當(dāng)然簡(jiǎn)單,功能齊全,而且很容易上手,但是我的感覺(jué)是有許多的功能實(shí)際上用處不大,而且相當(dāng)耗費(fèi)系統(tǒng)資源。第二種呢,相信所有人在論壇上提出“開(kāi)發(fā)perl用什么工具好?”這樣的問(wèn)題時(shí),emacs和Vim都是必有的回答。emacs和Vim當(dāng)然不錯(cuò),但是不可回避的就是配置的出錯(cuò)率比較高,按鍵的組合繁多而且凌亂,常常會(huì)對(duì)一些新的程序員造成一些不必要的麻煩,畢竟還是有許多的組合鍵需要記憶,如果想發(fā)揮emacs這類編輯器的優(yōu)點(diǎn)的話。
    所以基于現(xiàn)在的這個(gè)現(xiàn)實(shí),我想使用swing來(lái)開(kāi)發(fā)一個(gè)簡(jiǎn)便,只有必須的功能的ide。這樣做有兩個(gè)目的:一個(gè)可以更好的開(kāi)發(fā)perl程序,另一方面可以好好的研究一下Swing。
    我的想法是這個(gè)ide只提供這么幾種功能:
    (1)語(yǔ)法高亮(這個(gè)是當(dāng)然的)。
    (2)書簽(包括設(shè)置、刪除,上下移動(dòng)和書簽查找)。
    (3)代碼的自動(dòng)補(bǔ)齊。
    (4)自動(dòng)格式化(基于模板)。
    (5)基本的編輯命令(拷貝,粘貼,剪切,撤銷和重做----我想足夠了)。
    (6)括號(hào)的自動(dòng)匹配。
    (7)代碼的瀏覽和跳轉(zhuǎn)(包括顯示當(dāng)前文件的函數(shù)名,包名,類名;函數(shù)調(diào)用和函數(shù)定義之間的跳轉(zhuǎn)----好像有點(diǎn)復(fù)雜了)。
    (8)簡(jiǎn)單的調(diào)試(上一步,下一步,跳進(jìn),跳出,顯示變量和表達(dá)式的值)。    

    這樣我想作為一個(gè)Ide功能就應(yīng)該差不多了,雖然會(huì)很簡(jiǎn)陋,但是我想這個(gè)應(yīng)該可以滿足我的需求了。
    下一步就要開(kāi)始調(diào)查實(shí)現(xiàn)的手段了,希望可以一步一步的實(shí)現(xiàn)我的夢(mèng)想。
     加油?。。。。。。。。。?br />


]]>
主站蜘蛛池模板: 长阳| 新安县| 巴林右旗| 揭西县| 万荣县| 淳化县| 宁夏| 吴忠市| 鄱阳县| 惠水县| 七台河市| 梁河县| 大足县| 吕梁市| 鄱阳县| 上虞市| 南平市| 磴口县| 庆安县| 科技| 安新县| 台北市| 府谷县| 卫辉市| 桓仁| 内黄县| 神池县| 蓝田县| 兴业县| 深水埗区| 垦利县| 石渠县| 辽宁省| 罗甸县| 尉犁县| 乌拉特中旗| 文安县| 镶黄旗| 虹口区| 南昌市| 灌南县|