我复制了一些代码(示例来自于 http://hmkcode.com/java-servlet-send-receive-json-using-jquery-ajax/
它有效但有些东西我不明白: 我无法理解"文章"保留了不确定的价值观 是否每次调用servlet都不会重新初始化?
public class JSONServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// This will store all received articles
List<Article> articles = new LinkedList<Article>();
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
// 1. get received JSON data from request
BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
String jsonString = "";
if (br != null){
jsonString = br.readLine();
}
ObjectMapper mapper = new ObjectMapper();
Article article = mapper.readValue(jsonString, Article.class);
response.setContentType("application/json");
articles.add(article);
mapper.writeValue(response.getOutputStream(), articles);
}
}
答案 0 :(得分:1)
应用程序服务器通常维护一个servlet的单个实例,因此在servlet类中声明List<Article> articles
as属性将作为文章的整个应用程序的容器。
请注意,此方法应仅用于测试目的。设计为这样的真实应用程序将失败,因为多个线程同时访问了一个servlet,并且同一个URL上有多个请求尝试将数据添加到此未同步列表中的servlet将引发ConcurrentModificationException
。
如果您希望/需要为每个客户端(浏览器)存储数据,请使用会话范围。如果您希望/需要按应用程序存储数据(可供应用程序的所有客户端使用),请使用应用程序范围。
更多信息:
答案 1 :(得分:1)
在Web应用程序中的任何给定时间只创建一个servlet实例。因为articles
字段存储为成员变量(不是方法本地),所以它在所有请求(以及所有线程)之间共享。这通常是一种非常糟糕的做法,因为您可能遇到并发问题,多个线程试图同时访问相同的数据结构,并且用户能够访问他们可能无法访问的数据的安全问题。
执行此操作的正确方法是使用session
存储应该对每个用户都是私有的数据,或使用类似Spring的SessionScopedProxy支持。
答案 2 :(得分:1)
我不是Java servlet的专家,但是一旦初始化了servlet(也就是你的JSONServlet类),就会初始化文章List,并且后续通过客户端调用doPost会附加到文章列表中,而不是re - 每次调用POST时都初始化。它只会在重新启动servlet时被删除并重新初始化。