[英]Is there only one servlet object per tomcat server?
我做了一个简单的测试,然后从不同的浏览器和命令行工具执行了我的测试servlet。 无论我在哪里执行,它都会显示相同的“ hohoho time”。 我对此绝对满意,我只想知道两件事:
a)如果我可以依靠不同版本的tomcat(今天我使用7.54版)
b)这是否意味着一个servlet永远不会在不同的线程中并行执行(即,两个用户在同一时间请求同一个servlet)
@WebServlet(name="test servlet 2", urlPatterns={"/test2"}, loadOnStartup=1)
public class Test2 extends HttpServlet {
private String test = "baaa .. :-(";
@Override
public void init(ServletConfig config) throws ServletException {
DEBUG("Server starts");
this.test = "hohoho " + System.currentTimeMillis();
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletOutputStream out = resp.getOutputStream();
out.write(test.getBytes());
out.flush();
out.close();
}
}
实际上,servlet容器仅为每个servlet创建一个实例。 这有助于您将状态保存在servlet成员变量中。 但是,这并不意味着servlet容器不能使用同一servlet实例同时处理服务器请求。 这就是servlet包含的内容(包括Tomcat)。 因此,您的servlet必须是线程安全的。 请参考本文以获取详细信息: http : //tutorials.jenkov.com/java-servlets/servlet-concurrency.html
每个HttpServlet仅有一个实例,并且在构造HttpServlet时,其init()方法仅被调用一次。 但是,对于每个请求,doGet()在不同的线程中调用,并且可以并行发生。
我对您的问题有以下看法。
a )是,至少从tomcat 7开始。对于tomcat 6( annotation support
),您必须检查规格。
b )关于在并行线程中执行,默认情况下,servlet不是线程安全的,以确保线程安全,Servlet service()方法不应访问任何成员变量,除非这些成员变量本身是线程安全的。
有关线程安全的更多信息: Servlet线程安全
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.