我怀疑servlet是如何实例化的。 实际上我有理由认为它只在应用程序加载或收到第一个请求时才会实例化一次。并且它收到的每个请求都没有一个实例。 任何人都可以清除这个疑问吗?
这样思考的原因是servlet类有一个“String var = null”成员,它似乎只在第一次收到请求时才有空值。
非常感谢
答案 0 :(得分:3)
只创建了一个servlet实例。这就是为什么不在get
和post
方法中使用servlet中包含字段的重要性。 servlet中的类实例变量(字段)不是线程安全的,可能会被多个请求修改,从而导致意外行为。
考虑以下示例:
<强> ServletTest.java 强>
@WebServlet("/ServletTest")
public class ServletTest extends HttpServlet {
private static final long serialVersionUID = 1L;
private Integer increment = 0;
public ServletTest() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(increment++);
}
}
<强> test.jsp的强>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="ServletTest" method="post">
<button type="submit">Submit</button>
</form>
</body>
</html>
如果您运行此示例并点击提交按钮,它将向控制台输出0。随后提交的表单将打印1,然后打印2,等等......这证明servlet是同一个实例。
答案 1 :(得分:1)
自从我玩servlet以来已经有一段时间了。 但这是一种实验方法。 你为什么不在你的方法中创建一个方法 servlet(比如覆盖doGet)。
在这个方法中这样做: 的System.out.println(this.hashCode()); 甚至更好 的System.out.println(本);
然后向它发出GET请求并观察打印出来的内容。
How do servlets work? Instantiation, sessions, shared variables and multithreading
这似乎也很有用。