在多个请求的HTTP会话中未保存属性

时间:2017-11-28 22:13:27

标签: java html session servlets

我想在servlet中创建一个会话,我可以在多个请求进入时添加数据。我首先检查会话是否为空,如果是,我得到会话并在其中存储初始属性。这是我在第一次请求servlet时所希望的。对于进一步的请求,会话应该存在,我将数据修改为会话中的属性。但在我的其他情况下,我的属性不存在。如何让会话通过多个请求持续存在?谢谢

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
        int quantity = 0;
        Item[] item = new Item[9];
        int currRow = Integer.parseInt(request.getParameter("rowNum"));

        HttpSession session = request.getSession(false);
        if (session == null) {
            session = request.getSession();
            for (int i = 0; i < 9; i++) {
                item[i] = new Item();
                item[i].setID(request.getParameter("ID" + (i + 1)));
                item[i].setPrice(Double.parseDouble(request.getParameter("p" + (i + 1))));
                session.setAttribute(Integer.toString((i + 1)), item[i]);

            }
            quantity = Integer.parseInt(request.getParameter("q" + currRow));
            Item currItem = (Item) session.getAttribute(Integer.toString(currRow));
            currItem.setQuantity(currItem.getQuantity() + quantity);
            session.setAttribute(Integer.toString(currRow), currItem);
        } else {

            if (null == session.getAttribute("2")) {
                out.println("not exist");
            } else {
                out.println("exist");
            }
        }

    }
}

FIX:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
        int quantity = 0;
        Item[] item = new Item[9];
        int currRow = Integer.parseInt(request.getParameter("rowNum"));

        HttpSession session = request.getSession();
        Item currItem;

        if (session.getAttribute("1") == null) {
            for (int i = 0; i < 9; i++) {
                item[i] = new Item();
                item[i].setID(request.getParameter("ID" + (i + 1)));
                item[i].setPrice(Double.parseDouble(request.getParameter("p" + (i + 1))));
                session.setAttribute(Integer.toString((i + 1)), item[i]);
            }
            quantity = Integer.parseInt(request.getParameter("q" + currRow));
            currItem = (Item) session.getAttribute(Integer.toString(currRow));
            currItem.setQuantity(currItem.getQuantity() + quantity);
        } else {
            quantity = Integer.parseInt(request.getParameter("q" + currRow));
            currItem = (Item) session.getAttribute(Integer.toString(currRow));
            currItem.setQuantity(currItem.getQuantity() + quantity);
        }
}

1 个答案:

答案 0 :(得分:1)

您可以使用request.getSession()而不是request.getSession(false);以及随后的空检查。

如果不存在,它将创建一个新的,或者在找到它时使用现有的。 The java docs for HtpServletRequest