我有以下问题。我创建了一个TagLibrary,如果数据如下,则列出给定的集合
class LisTagLib {
static final CONTEXT = this.class.name
/**
* Current data from collection
*/
def currentData;
String columnHeaders = "";
List writtenHeaders = [];
// draw main table
Closure listTable = { attrs, body ->
def writer = getOut()
writer << "<table>";
writer << "<thead>"
writer << "<tr>"
writer << columnHeaders
writer << "</tr>"
writer << "</thead>"
writer << "<tbody>"
if(attrs.source){
attrs.source.each() { value ->
writer << "<tr>";
writer << body()
writer << "</tr>";
}
}
// output the body
writer << "</tbody>";
writer << "</table>";
}
.
.
.
}
我的问题是每次调用此taglib时都不会创建“columnHeaders”属性。如果我在页面X中然后在页面Y中调用它,则页面Y的标题为“页面X中显示的页眉+页面Y中显示的页眉”。我尝试了构造函数,但是这个类在编译时只构造了一次。这是什么解决方案。每次调用此taglib时,如何重置这些值? 顺便说一下像
这样的东西columnHeaders = "";
在listTable闭包的开头或末尾删除all columnHeaders并且不打印标题。
答案 0 :(得分:3)
Taglib是单例,因此所有请求都会共享currentData
,columnHeaders
和writtenHeaders
等类范围字段。 Spring bean默认为单例,Grails就是这种情况,除了每个请求创建的控制器,并且可以有状态(但不应该)。
修复方法是将这些字段作为变量移动到标记主体中,并在需要时将它们作为参数传递给辅助方法,而不是将它们称为类字段。
P.S。丢失分号:)