posts - 2, comments - 3, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2009年4月2日

视图存储在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" />到文件的底部。

posted @ 2009-12-29 14:21 杨晓晨 阅读(5713) | 评论 (1)编辑 收藏

     摘要: Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 ...  阅读全文

posted @ 2009-12-28 15:33 杨晓晨 阅读(246) | 评论 (0)编辑 收藏

    现在在工作中开始有一部分的需要使用perl来完成,在使用了一些ide后。发现这些ide主要有这么几种:
(一)ide上安装插件,如eclipse和netbeans等;
(二)vi和emacs类型这些传统意义上的文本编辑器,也是加上一些插件来完成相关的工作。
(三)一些专门的开发商开发的专门的perl开发工具(当然是收费的,所以不做考虑)。
第一种当然简单,功能齐全,而且很容易上手,但是我的感觉是有许多的功能实际上用处不大,而且相当耗费系统资源。第二种呢,相信所有人在论坛上提出“开发perl用什么工具好?”这样的问题时,emacs和Vim都是必有的回答。emacs和Vim当然不错,但是不可回避的就是配置的出错率比较高,按键的组合繁多而且凌乱,常常会对一些新的程序员造成一些不必要的麻烦,毕竟还是有许多的组合键需要记忆,如果想发挥emacs这类编辑器的优点的话。
    所以基于现在的这个现实,我想使用swing来开发一个简便,只有必须的功能的ide。这样做有两个目的:一个可以更好的开发perl程序,另一方面可以好好的研究一下Swing。
    我的想法是这个ide只提供这么几种功能:
    (1)语法高亮(这个是当然的)。
    (2)书签(包括设置、删除,上下移动和书签查找)。
    (3)代码的自动补齐。
    (4)自动格式化(基于模板)。
    (5)基本的编辑命令(拷贝,粘贴,剪切,撤销和重做----我想足够了)。
    (6)括号的自动匹配。
    (7)代码的浏览和跳转(包括显示当前文件的函数名,包名,类名;函数调用和函数定义之间的跳转----好像有点复杂了)。
    (8)简单的调试(上一步,下一步,跳进,跳出,显示变量和表达式的值)。    

    这样我想作为一个Ide功能就应该差不多了,虽然会很简陋,但是我想这个应该可以满足我的需求了。
    下一步就要开始调查实现的手段了,希望可以一步一步的实现我的梦想。
     加油!!!!!!!!!!

posted @ 2009-04-02 22:04 杨晓晨 阅读(1180) | 评论 (2)编辑 收藏