我无法理解该字段是如何保存的(代码有效)

时间:2014-08-07 15:36:41

标签: java servlets

我复制了一些代码(示例来自于     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);


 }
}

3 个答案:

答案 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时被删除并重新初始化。