代码之家  ›  专栏  ›  技术社区  ›  Esko

如何将新标记插入标记库?

  •  4
  • Esko  · 技术社区  · 14 年前

    conf/InjectionConfig.groovy 文件:

    x {
        a = { attrs, body -> out << "hello" }
        b = { attrs, body ->  out << "goodbye" }
    }
    

    我有一个简单的taglib,比如

    class XTagLib {
        static namespace = "x"
    }
    

    我想做的是当我打字的时候 <x:a /> hello . 我已经尝试将它们作为属性和方法注入到taglib的元类中,但似乎都不起作用。举个例子,我现在做的基本上是服务:

    public void afterPropertiesSet() throws Exception {
        GroovyClassLoader classLoader = new GroovyClassLoader(getClass().classLoader)
        def slurper = new ConfigSlurper(GrailsUtil.environment)
        ConfigObject xConfig
        try {
            xConfig = slurper.parse(classLoader.loadClass('InjectionConfig'))
        }
        catch (e) {
            e.printStackTrace()
        }
        xConfig.x.each({
            if ( !XTagLib.metaClass.hasMetaProperty(it.key) ) {
                XTagLib.metaClass.registerBeanProperty(it.key, { args ->
                    def attrs = args[0], body = args[1]
                    it.value.call(attrs, body)
                }
            }
        })
    }
    

    我是做错了还是现在可能?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Victor Sergienko    14 年前

    嗯,这个

        def shell = new GroovyShell() // or get a GroovyClassLoader
        Class yTagLibClass = shell.evaluate("class YTagLib { static namespace = 'x' }; return YTagLib")
    
        yTagLibClass.metaClass.a = { attrs, body -> delegate.out << 'blabla' }
        grailsApplication.addArtefact(TagLibArtefactHandler.TYPE, yTagLibClass)
    

    <x: a/>几乎对我起作用-注册了一个标记,只是它没有输出任何内容。你仍然需要解决这个问题 out 反对Grails的taglib 财产。

    我看不出一个很好的方法,因为没有访问实例变量的权限,而且 是一个实例变量。请参阅Grails source,JspInvokeGrailsTagLibTag.doStartTagInternal()-您可能会找到方法。

    编辑 :我添加了 delegate. 应该解析的前缀 外面的

        2
  •  1
  •   Hoàng Long    14 年前

    我想做的是当我打字的时候 对我的任何观点来说 打印“你好”

    我认为还有一种方法可以实现您的意图:组合模板和标记库。首先,创建一个模板,然后将其添加到TagLib中(没有复杂的配置)。

    在我看来,这比你的方法简单。

    http://jan-so.blogspot.com/2008/02/example-of-template-and-taglib-with.html