我有以下问题。我创建了一个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中显示的标题”。我尝试了构造函数,但此类在编译时仅构造一次。解决方案是什么?每次调用此标记库时,如何重置这些值?
顺便说一句
columnHeaders = "";

在listTable闭包的开始或结尾处删除所有columnHeaders,并且不打印任何标题。

最佳答案

Taglib是单例,因此所有请求都共享类范围字段(如currentDatacolumnHeaderswrittenHeaders)。 Spring bean默认为单例,在Grails中就是这种情况,除了 Controller 是根据请求创建的,并且可以具有状态(但不应如此)。

解决方法是将这些字段作为变量移动到标签主体中,并根据需要将它们作为参数传递给辅助方法,而不是将它们称为类字段。

ps。失去分号:)

10-04 18:18