如何记住以前保存的表单数据以用于后续请求

时间:2013-01-14 14:52:34

标签: java forms servlets

我在servlet(page1)中有下面的代码,我想按下Save转到第二个servlet(page2),读取以page1形式写的内容并将它们附加到这样的广播组:< / p>

Question [i]: question  (i increases every time a question is added in page2)
radiobutton1 (radio1)
radiobutton2 (radio2)
radiobutton3 (radio3)

关键是每次填写下面的表格时,数据都应添加到之前已保存的数据之下。

你能为servlet page2建议一些示例代码吗?

非常感谢。

out.println("<form  id=\"form1\" action = \"page2\" method = \"POST\" >");            
        out.println("<input type=\"text\" name=\"question\"><br />");
        out.println("<input type=\"text\" name=\"radio1\"><br />");
        out.println("<input type=\"text\" name=\"radio2\"><br />");
        out.println("<input type=\"text\" name=\"radio3\"><br />");
        out.println("<input type = \"submit\" value = \"Save\">");

1 个答案:

答案 0 :(得分:2)

您可以使用<input type="hidden">或会话范围记住以前保存的数据。 E.g。

<input type="hidden" name="question1answer" value="42" />

request.getSession().setAttribute("question1answer", 42);

传递的数据是后续请求

String question1answer = request.getParameter("question1answer");

Integer question1answer = (Integer) request.getSession().getAttribute("question1answer");

隐藏输入的缺点是它产生了相当多的样板代码,并且最终用户可以轻松猜测/操纵它。会话范围的缺点是它在同一会话中的所有请求之间共享(因此当最终用户在多个浏览器窗口/选项卡中打开相同页面时可能会发生干扰)。要结合两者的优点,您可以在第一个请求中生成一个长且唯一的密钥,您将其用作密钥,将所有关联数据存储在会话范围中,并将该密钥作为隐藏请求参数传递。

E.g。在第一次请求中

String key = UUID.randomUUID().toString();
request.setAttribute("key", key);
List<Answer> answers = new ArrayList<Answer>();
request.getSession().setAttribute(key, answers);
// ...
answer.add(question1answer);

和HTML

<input type="hidden" name="key" value="${key}" />

以及随后的所有请求

String key = request.getParameter("key");
request.setAttribute("key", key);
List<Answer> answers = (List<Answer>) request.getSession().getAttribute(key);
// ...
answers.add(question2answer); // question3answer, question4answer, etc.