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

Multithreading 自定义JSP标记是否由多个线程访问,multithreading,jsp,jsp-tags,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 getVa

我定义了简单的自定义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
    }
}
公共类SimpleTag扩展了标记支持{
私有静态最终长serialVersionUID=1L;
私有字符串变量;
私有映射数据=新HashMap();
公共字符串getVar(){
收益var;
}
公共void setVar(字符串变量){
this.var=var;
}
@凌驾
public int doStartTag()抛出JSPEException{
填充数据();
setAttribute(变量,数据);
返回评估主体,包括:;
}
@凌驾
public int doEndTag()抛出JspException{
setAttribute(var,null);
返回评估页面;
}
私有void populateData(){
//向“数据”地图添加数据
}
}
我将hashmap公开给标记体

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


如果太简单,我道歉。我的搜索一直没有成功。提前感谢。

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

根据容器的不同,经典标记处理程序可以合并或不合并
无法将简单标记处理程序与规范()合并

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

说明标记处理程序实例在同一时间仅在积极处理一个请求 时间这是自然发生的 如果通过重新实例化标记处理程序 new()调用,但一旦标记处理程序池启用,它就需要拼写 介绍。这一澄清影响了第JSP.13章

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

user3714601给出了一个很好的答案——事实上,标记的使用是线程绑定的,所以您发布的设计不应该有任何并发性问题

容器是否会重用标记(缓存/池)

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

在开始使用之前,请清除标记实例中以前使用时留下的任何内容。在某些环境中,这将没有任何效果,但我建议类似于

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