我做了一个简单的测试,并在下面从不同的浏览器和命令行工具执行我的测试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();
}
}
答案 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