Grails 自定义标签、标签作为方法调用
只要在taglib目录下建立一个Groovy类,在Groovy类里面用闭包就可以定义标签了。比如你要建立一个和HTML有关的自定义标签,那么你可以建立一个HTMLTag.groovy类,然后在里面编写自定义标签。一个闭包就代表一个标签,闭包接收一个Map做为参数,标签属性就放在里面。写完就可以直接调用,不用像JSP那样还要写TLD文件,并且在web.xml文件中引用标签。而且Grails本身也提供了丰富的标签,一般不用写自定义标签。
当Grails在显示模板中遇到一个标签的时候,它会去查找grails-app/taglib/这个地方.Grails会找到每个标签的闭包并执行它们.
eg:
class RaceTrackTagLib {
def formatDate = {
attrs ->
def date = attrs.get('date')
if (!date){
date = new Date()
}
def format = attrs.get('format')
if (!format) {
format = "yyyy-MM-dd HH:mm:ss z"
}
out << new java.text.SimpleDateFormat(format).format(date)
}
}
上面使用了Java的SimpleDateFormat
类来格式化一个date,然后把它写入响应。随后,这个标签能像下列这样在GSP中使用:
<g:formatDate format="dd-MM-yyyy" date="${new Date()}" />
6.2.2.6 标签作为方法调用
GSP标签和其他标签技术一个主要不同在于,来自 controllers(控制器) , 标签库 或者GSP 视图中的GPS标签可以被当作任意的正规标签或者当作方法被调用.
来自GSPs中的标签当作方法调用
当作为方法被调用时,标签的返回值被当作String实体直接被写入响应中。 因此,示例中的createLinkTo能等同的看做方法调用:
Static Resource: ${createLinkTo(dir:"images" , file:"logo.jpg" )}
当你必须在一个属性内使用一个标签时是特别有用的:
<img src="${createLinkTo(dir:'images', file:'logo.jpg')}" />
I在视图技术中,标签内嵌套标签的特性是不被支持的,这样变得十分混乱,往往使得像Dreamweaver这样WYSWIG的工具产生不利的效果以至于在渲染标签时:
<img src="<g:createLinkTo dir=" images" file=" logo.jpg" /> " />
来自控制器(Controllers)和标签库的标签作为方法调用
你同样可以调用来自控制器和标签库的标签。标签可以不需要内部默认的g:
namespace前缀来调用,并返回String结果:
def imageLocation = createLinkTo(dir:"images" , file:"logo.jpg" )
然而,你同样可以用命名空间前缀来避免命名冲突:
def imageLocation = g.createLinkTo(dir:"images" , file:"logo.jpg" )
假如你有一个自定义命名空间,,你可以使用它的前缀来替换(例如,使用 FCK Editor plugin:
def editor = fck.editor()
6.3.5 标签命名空间
默认情况下,标签被添加到默认的Grails命名空间,并在GSP页面中和 g:
前缀一起使用。然而,你可以指定一个不同的命名空间,通过在你的 TagLib
类中添加一个静态属性:
class SimpleTagLib { static namespace = "my" def example = { attrs -> … } }
这里,我们指定了一个命名空间
my
,因此,稍后在GPS页面中标签库中的标签引用会像这样:
<my:example name="..." />
前缀和静态的命名空间
属性值一样.命名空间对于插件特别有用.
命名空间内的标签可以作为方法调用,使用命名空间作为前缀来执行方法调用:
out << my.example(name:"foo" )
可用于GSP,控制器或者标签库.