每个tomcat服务器只有一个servlet对象吗?

时间:2015-01-22 16:36:02

标签: java tomcat servlets

我做了一个简单的测试,并在下面从不同的浏览器和命令行工具执行我的测试servlet。无论我在哪里执行它,它都会显示相同的时间"。我对此绝对不错,我只想知道两件事:

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();
    }
}

3 个答案:

答案 0 :(得分:1)

确实,servlet容器只创建每个servlet的一个实例。这有助于您在servlet成员变量中保存状态。但是,这并不意味着servlet容器不能使用相同的servlet实例同时处理多个请求。这就是servlet包含的内容(包括Tomcat)。因此,您的servlet必须是线程安全的。有关详细信息,请参阅此文章:http://tutorials.jenkov.com/java-servlets/servlet-concurrency.html

答案 1 :(得分:0)

每个HttpServlet只有一个实例,它的init()方法只在构造HttpServlet时调用一次。但是,doGet()在每个请求的不同线程中调用,并且可以并行发生。

答案 2 :(得分:0)

我对你的问题有以下看法。

a )是的,至少从tomcat 7开始。对于tomcat 6(annotation support),你必须检查规格。

b )关于并行线程中的执行,默认情况下servlet不是线程安全的,为了确保线程安全,Servlet service()方法不应该访问任何成员变量,除非这些成员变量本身是线程安全的。

有关线程安全的更多信息:Servlet Thread Safety