1

我在一个 servlet (page1) 中有下面的代码,我想在按 Save 后转到第二个 servlet (page2),读取以 page1 形式编写的内容并将它们附加到一个无线电组中,如下所示:

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\">");
4

1 回答 1

2

您可以使用其中一个<input type="hidden">或会话范围来记住以前保存的数据。例如

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

或者

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

传递的数据是可用的后续请求

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

或者

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

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

例如在第一个请求中

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.
于 2013-01-14T15:17:41.807 回答