grails反射 - 调用动态标签

时间:2015-12-01 18:47:24

标签: grails reflection

我知道这很奇怪,但我试图在taglib中提供一个pass through接口,允许调用者传入任何其他标记,以便在容器中显示并进行额外处理。

为此,我尝试动态调用任意命名空间中的任意标记。这可能更清楚。

GSP:

<myLib:myTag someProp="blah" anotherProp="blah2" size="80" namespace="g" tag="textField">

在我的taglib中,我试图显示他们传递的标记。

标签库:

def myTag = {
  String id = //some processing, not specified by caller
  attrs.put("id", id)
  def namespace = attrs.remove("namespace")
  def tag = attrs.remove("tag")
  out << ?????
}

问题出现在外面......我在调用标签时遇到问题。我已经尝试了以下错误

namespace.tag(attrs) //No signature of method: java.lang.String.tag()
namespace."${tag}"(attrs) //No signature of method: java.lang.String.textField()
"${namespace}"."${tag}"(attrs) //No signature of method: java.lang.String.textField()

这似乎有效,但该方法需要支持其他命名空间中的标记

g."${tag}"(attrs)

所以问题是如何使用反射来使用动态定义的taglib?

我没有让它们在body()中传递完全形成的标记,因为我需要在taglib中与它进行交互。

1 个答案:

答案 0 :(得分:0)

我相信以下工作,我不完全确定这是最好的答案,因此会将问题留给其他人提出建议。

String namespace = attrs.remove("namespace")
String tag = attrs.remove("tag")
GrailsTagLibClass tagLibClass = grailsApplication.getTagLibClasses().find { it.namespace == namespace && it.hasTag(tag)}
def tagLibBean = grailsApplication.mainContext.getBean(tagLibClass.getFullName())
out << tagLibBean."${tag}"(attrs)