我有一个自定义标签,因为我想包装 g:each
def myEach = { attrs, body ->
out << "${g.each(in:attrs.in, var:attrs.var, status:attrs.status) { 'test' }}"
}
但是每个标签都会出错,因为它与每个标签都混淆了。我有什么办法可以做到这一点?最坏的情况是我将输出一个包含每个标签的 gsp 页面。
我有一个自定义标签,因为我想包装 g:each
def myEach = { attrs, body ->
out << "${g.each(in:attrs.in, var:attrs.var, status:attrs.status) { 'test' }}"
}
但是每个标签都会出错,因为它与每个标签都混淆了。我有什么办法可以做到这一点?最坏的情况是我将输出一个包含每个标签的 gsp 页面。
我可能遗漏了一些东西,但单引号没有帮助,例如:
def myEach = { attrs, body ->
out << "${g.'each'(in:attrs.in, var:attrs.var, status:attrs.status) { 'test' }}"
}
这样你会得到同样的错误......
我的解决方案是使用groovyPagesTemplateEngine
bean。有了它,您可以解析字符串模板:
def myEach = { attrs, body ->
attrs.content = "test"
String template = "<g:each in='${attrs.in}'>${attrs.content}</g:each>"
groovyPagesTemplateEngine.createTemplate(template, 'mytemplate').make([attrs:attrs]).writeTo(out)
}
更新如果您想调用标准标签,只需尝试调用它,例如:
//ApplicationTagLib g
def myEach = { attrs, body ->
out << g.each([in:attrs.in, var:attrs.var, status:attrs.status]) {
'test'
}
}
老的
如果要将字符串放入输出,请尝试使用标准字符串,而不是 GroovyString。不是"${g.each....}"
,而是'${g.each....}'
:
out << '${g.each(in:attrs.in, var:attrs.var, status:attrs.status) { \'test\' }}'
或者只是逃避$
:
out << "\${g.each(in:attrs.in, var:attrs.var, status:attrs.status) { 'test' }}"
你完全可以像 Grails 一样注册你自己的标签:
import org.apache.commons.lang.StringUtils;
import org.codehaus.groovy.grails.web.taglib.GroovySyntaxTag;
import org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException;
public class Whatever extends GroovySyntaxTag {
public static final String TAG_NAME = "youreach";
public void doStartTag() {
String in = attributes.get(ATTRIBUTE_IN);
if (StringUtils.isBlank(in)) {
throw new GrailsTagException("Tag [" + TAG_NAME + "] missing required attribute [" + ATTRIBUTE_IN + "]", parser.getPageName(), parser.getCurrentOutputLineNumber());
}
doEachMethod(in);
}
public void doEndTag() {
endEachMethod();
}
public String getName() {
return TAG_NAME;
}
@Override
public boolean isKeepPrecedingWhiteSpace() {
return true;
}
@Override
public boolean isAllowPrecedingContent() {
return true;
}
}
然后在 中Bootstrap.groovy
,将这个类注册为一个标签。
GrailsTagRegistry.instance.registerTag(Whatever.TAG_NAME, Whatever.class)
您可以创建自己的类,该类可以扩展GroovySyntaxTag
以操作那里的任何方法。然后让这个类扩展它。