我知道这很奇怪,但是我试图在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)