【问题标题】:How to remember previously saved form data for subsequent requests如何记住先前保存的表单数据以供后续请求
【发布时间】:2013-01-14 14:52:33
【问题描述】:

我在一个 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\">");

【问题讨论】:

  • 我不知道你具体要问什么,但我至少可以说,如果你把 HTML 代码放在 JSP 文件中,Java 代码放在Java(servlet)类。
  • 我同意,但我被要求这样做......我上面问的是,我怎样才能完成第1页的表格并按保存将这些数据添加到第2页。
  • 是的,要求已被理解,但尚不清楚您的具体问题是什么。它是在收集请求参数吗?是打印收集到的请求参数吗?这两项任务也相当明显,我只是不确定这对你来说是否真的是一个问题,以及究竟如何。编辑您的问题以包含一些您尝试完成这些任务的相关 servlet 代码也会有所帮助。
  • 问题是我从表单中获取了 request.getParameter 但我对如何打印它们而不丢失以前保存的数据以及第二如何添加问题编号 [i] 每保存一组数据的时间。
  • 好的,你的具体问题现在明白了。我修正了问题标题并发布了答案。

标签: java forms servlets


【解决方案1】:

您可以使用&lt;input type="hidden"&gt; 或会话范围来记住以前保存的数据。例如

<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.

【讨论】:

  • 感谢BalusC的回复,虽然我对如何使用它有点困惑......后续请求代码必须添加到哪里?你能给我更多的信息吗?谢谢。
  • 就在“下一种形式”。所以问题2的形式应该记住问题1的答案作为隐藏值。并且问题3的形式应该记住问题1和2的答案作为隐藏值。等等。有道理,对吧?
  • 这是有道理的。所以我应该只将字符串键和下面的代码添加到表单(page1)的页面中?
  • 在使用会话属性和键的情况下,隐藏的输入应该以所有形式出现。我已经编辑了答案以进一步澄清那部分。抱歉,我预计其余部分对您来说已经足够明显了。
  • 没问题,对不起……没有意义的是我只有一个表格可以添加问题,那么后续请求是如何提出的?
猜你喜欢
  • 2023-03-17
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
相关资源
最近更新 更多