我知道这很奇怪,但是我试图在taglib中提供一个直通接口(interface),该接口(interface)允许调用者传递任何其他标签以在容器中显示,并进行其他处理。

为此,我试图在任意 namespace 中动态调用任意标签。例如,这可能会更清楚。

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中与它进行交互。

最佳答案

我相信以下方法可以解决问题,但我不确定这是否是最好的答案,因此请允许其他人提出建议。

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)

10-02 23:42