我有一个简单的自定义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暴露给标记体。
标记是由容器重用(缓存/池化)还是由多个线程访问?我是否需要在标签设计中格外小心?
如果它太基本我道歉。我的搜索失败了。提前谢谢。
答案 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记录到日志文件中并执行多个请求以了解其行为?