是否由多个线程访问自定义JSP标记

时间:2017-07-10 17:57:06

标签: multithreading jsp jsp-tags

我有一个简单的自定义JSP标记定义如下:

public class SimpleTag extends TagSupport {
    private static final long serialVersionUID = 1L;

    private String var;
    private Map<String, String> data = new HashMap<String, String>();

    public String getVar() {
        return var;
    }

    public void setVar(String var) {
        this.var = var;
    }

    @Override
    public int doStartTag() throws JspException {
        populateData();
        pageContext.setAttribute(var, data);
        return EVAL_BODY_INCLUDE;
    }

    @Override
    public int doEndTag() throws JspException {
        pageContext.setAttribute(var, null);
        return EVAL_PAGE;
    }

    private void populateData() {
        // add data to "data" map
    }
}

我将hashmap暴露给标记体。

标记是由容器重用(缓存/池化)还是由多个线程访问?我是否需要在标签设计中格外小心?

如果它太基本我道歉。我的搜索失败了。提前谢谢。

3 个答案:

答案 0 :(得分:3)

经典标签处理程序可以合并与否,具体取决于容器;
无法汇总简单标记处理程序,因此使用规范(http://download.oracle.com/otn-pub/jcp/jsp-2_3-mrel2-eval-spec/JSP2.3MR.pdf

但无论如何,应该没有任何线程问题,因为处理程序应该一次只提供一个请求:

  

澄清标记处理程序实例正在主动处理a处的一个请求   时间;这自然发生了    如果标签处理程序重新实例化   new()调用,但是一旦标记处理程序池化,它就需要拼写   介绍。这一澄清影响了第JSP.13章。

答案 1 :(得分:2)

  

多个线程访问自定义JSP标记

user3714601的答案很好 - 事实上标签使用是线程绑定的,所以你不应该对你发布的设计产生任何并发问题。

  

容器是否可以重用标签(缓存/池)

假设这是可能的。这对我几年前从WebSphere迁移到tomcat的应用程序造成了一些“有趣”的影响。

在开始使用之前,清除标记实例中可能遗留的任何内容。在某些环境中,这将没有任何效果,但我会建议类似的东西;

private void populateData() {
    data.clear();
    // clear anything else you have
    // add data to "data" map
}

答案 2 :(得分:0)

标签应该在每页的jsp页面呈现上实例化。它们应该是请求作用域并且可以包含它们自己的状态,除非你做了一些奇怪的事情,否则不应该有任何线程问题。但是要确定它,为什么要'您是否将标记类实例ID记录到日志文件中并执行多个请求以了解其行为?