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,控制器或者标签库.

相关推荐