【问题标题】:Retaining the submitted JSP form data保留提交的 JSP 表单数据
【发布时间】:2009-06-28 17:18:34
【问题描述】:

我有一个 Web 表单 (JSP),它将数据提交到不同的应用程序,托管在不同的服务器上。提交表单数据后,该应用程序重定向回相同的 JSP 页面。现在,我想保存输入的数据。以 Web 形式保留提交的数据有哪些不同的方法。我不希望将数据存储在数据库或任何文件中。

PS:当请求再次重定向到同一个 JSP 页面时,我想保留提交的表单数据。因此,用户无需重新输入数据。比如,数据可以存储在 Session 或 Request 等中。

【问题讨论】:

  • 一个问题:如果既不涉及数据库也不涉及任何文件,您如何提出“保存提交的数据”?

标签: java jsp servlets


【解决方案1】:

您能做的最好的事情是提交给您自己的 servlet,然后在 java.net.URLConnection 的帮助下在后台向外部 Web 应用程序发起另一个请求。最后只需在同一个请求中回传到结果页面,这样您就可以通过EL 访问请求参数。有一个隐含的 EL 变量 ${param},它可以让您访问请求参数,例如 Map,其中参数名称是键。

所以用下面的形式

<form action="myservlet" method="post">
    <input type="text" name="foo">
    <input type="text" name="bar">
    <input type="submit">
</form>

大致如下servlet方法

protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    String foo = request.getParameter("foo");
    String bar = request.getParameter("bar");

    String url = "http://external.com/someapp";
    String charset = "UTF-8";
    String query = String.format("foo=%s&bar=%s", URLEncoder.encode(foo, charset), URLEncoder.encode(bar, charset));

    URLConnection connection = new URL(url).openConnection();
    connection.setUseCaches(false);
    connection.setDoOutput(true); // Triggers POST.
    connection.setRequestProperty("accept-charset", charset);
    connection.setRequestProperty("content-type", "application/x-www-form-urlencoded;charset=" + charset);

    try (OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(), charset)) {
        writer.write(query);
    }

    InputStream result = connection.getInputStream();
    // Do something with result here? Check if it returned OK response?

    // Now forward to the JSP.
    request.getRequestDispatcher("result.jsp").forward(request, response);
}

您应该能够访问result.jsp 中的输入,如下所示

<p>Foo: <c:out value="${param.foo}" /></p>
<p>Bar: <c:out value="${param.bar}" /></p>

就这么简单。不需要jsp:useBean 和/或讨厌的小脚本。

【讨论】:

  • 把它放在这个标签 当我直接使用它之后它就可以工作了,然后它显示为 `Foo: ${参数.foo} `
  • @ali:显然您使用的是 JSP 1.x 而不是 2.x。 JSP 1.x 是一个痛苦的恐龙(十多年前)。您可能想要升级您的环境或寻找不同的项目。
  • 工作就像一个魅力。谢谢!
【解决方案2】:

在 JSP 中,这种事情通常通过使用 javabean 来存储表单值,然后使用 jsp:useBean 标记来处理。例如,您将创建以下 javabean:

package com.mycompany;
public class FormBean {
   private String var1;
   private String var2;
   public void setVar1(String var) { this.var1 = var; }
   public String getVar1() { return this.var1; }
   public void setVar2(String var) { this.var2 = var; }
   public String getVar2() { return this.var2; }
}

在您的表单 jsp 中,您将使用 useBean 标记,您的表单字段值将从 bean 获取它们的值:

<jsp:useBean id="formBean" class="com.mycompany.FormBean" scope="session"/>
...
...
<input type="text" name="var1" value="<%=formBean.getVar1()%>" />

在您的 jsp 中,表单数据被发布到(然后重定向回来),您将拥有以下代码,将发布的表单数据推送到 bean。

<jsp:useBean id="formBean" class="com.mycompany.FormBean" scope="session"/>
<jsp:setProperty name="formBean" property="*"/> 

另一种选择是将表单数据填充到保存页面的会话中:

String var1 = request.getParameter("var1");
String var2 = request.getParameter("var2");

session.setAttribute("var1", val1);
session.setAttribute("var2", val2);
...

并在您的表单中引用它(省略空值检查):

<input type="text" name="var1" value="<%= session.getAttribute("var1") %>" />

【讨论】:

    【解决方案3】:

    如果我正确理解了问题(大“如果”),那么您就有了一个具有 POST 方法的 FORM 和一个直接指向远程服务器的 ACTION。当用户单击“提交”时,浏览器不会让您的主机参与该事务,数据将发送给“操作”接收者。这将使您的选择仅限于实现与远程服务的回调关系(可能超出您的控制),设置本地代理 servlet 来拦截数据并将 POST 转发给它的预期接收者(这将使 POST 源自服务器而不是客户端(这可能会导致问题)),或者利用一些 AJAX 设计模式将表单数据发送到两个地方,而不是 FORM 标签规定的一个地方。

    除此之外,您还需要某种形式的本地持久性,例如数据库或文件。

    我有没有帮助?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多