快速业务通道

精通Grails: 用Groovy服务器页面(GSP)改变视图 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
)公开表示,“自定义 TagLib 是合适的架构性解决方案。”,然后却偷偷地编写 scriptlet,以为别人看不到。编写自定义 JSP TagLib 需要的工作太多,所以难以抵抗 scriptlet 的诱 惑。scriptlet 并不是正确的方法,但不幸的是,它是一种容易实现的方法。

Scriptlet 破坏了 HTML 基于标记的范式,将原始代码直接引入视图。错误的并不是代码本身,而是 它们缺少封装和重用的潜力。重用 Scriptlet 的惟一方式就是 “复制-粘贴”。这导致 bug、代码膨胀 ,并严重违背了 DRY 原则。更不用说 Scriptlet 在可测试性方面的匮乏了。

这就是说,我必须坦白,随着开发期限越来越紧迫,我写的 JSP scriptlet 的比例也相当大。JPS 标 准标记库(JSP Standard Tag Library,JSTL)在这方面帮助了我很多,但是编写我自己的自定义 JSP 标记则完全是另一回事。在我用 Java 代码编写自定义 JSP 标记、编译标记,并将大量时间浪费在将标 记库描述符(Tag Library Descriptor,TLD)设置为正确的格式和位置时,我已经完全忘记了当初编写 这个标记的理由是什么。编写测试来验证我的新 JSP 标记是否正确也同样麻烦 — 只能说我的出发点是 好的。

对比之下,用 Grails 编写自定义 TagLibs 简直就是举手之劳。Grails 框架使得做正确的事(包括 编写测试)变得很容易。例如,我经常需要在 Web 页面底部加上标准的版权声明。版权声明应该是这样 的: © 2002 - 2008, FakeCo Inc. All Rights Reserved.。问题在于,我希望第二个年份总是当 前的年份。清单 6 显示了用 scriptlet 如何完成这个任务:

清单 6. 用 scriptlet 完成的版 权声明

<div id="copyright"> &copy; 2002 - ${Calendar.getInstance().get(Calendar.YEAR)},   FakeCo Inc. All Rights Reserved. </div>

精通Grails: 用Groovy服务器页面(GSP)改变视图(4)

时间:2011-08-02 IBM Scott Davis

既然知道了如何处理当前年份,那么下面就要创建一个执行同样任务的自 定义标记。请输入 grails create-tag-lib Date,这会创建两个文件:grails- app/taglib/DateTagLib.groovy(TagLib)和 grails-app/test/integration/DateTagLibTests.groovy (测试)。将清单 7 中的代码添加到 DateTagLib.groovy:

清单 7.简单的自定义 Grails 标记

class DateTagLib {  def thisYear = {   out << Calendar.getInstance().get(Calendar.YEAR)  } }

清单 7 创建一个 <g:thisYear> 标记。可以看到,年份直接写入输出流。清单 8 显示了新标记的效用:

清 单 8.使用自定义标记的版权声明

<div id="copyright"> &copy; 2002 - <thisYear />, FakeCo Inc. All Rights Reserved. </div>

您可能以为这就完成了。非常抱歉,这只完成了一半。

测试 TagLibs

即使现在看起来一切正常,还是应该编写一个测试,确保这个标记日后不会出错。 Working Effectively with Legacy Code 的作者 Michael Feathers 说过,任何没有测试的代码都是遗 留代码。为了防止 Feathers 先生大发雷霆,请将清单 9 的代码添加到 DateTagLibTests.groovy:

清单 9.自定义标记的测试

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())   } }

GroovyTestCase 是在 JUnit 3.x TestCase 之上一层薄薄的 Groovy 层。为只有一行代码的标记编写 测试看起来

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号