Java 保留提交的JSP表单数据

Java 保留提交的JSP表单数据,java,jsp,servlets,Java,Jsp,Servlets,我有一个web表单(JSP),它将数据提交到不同的应用程序,托管在不同的服务器上。提交表单数据后,该应用程序重定向回同一JSP页面。现在,我想保存输入的数据。以web形式保留提交数据的不同方法有哪些。我不希望将数据存储在DB或任何文件中 PS:当请求再次重定向到同一JSP页面时,我希望保留提交的表单数据。因此,用户无需重新输入数据。例如,数据可以存储在会话或请求等中。在JSP中,这种事情通常是通过使用javabean存储表单值,然后使用JSP:useBean标记来处理的。例如,您将创建以下jav

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


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

在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()%>" />
并在表单中引用它(省略空检查):


您所能做的最好的事情是提交到您自己的servlet,然后在后台向外部Web应用程序发出另一个请求,而无需
java.net.URLConnection
。最后,只需在同一请求中发回结果页面,这样您就可以通过访问请求参数。有一个隐式EL变量
${param}
,它允许您访问请求参数,如
映射
,其中参数名称是键

所以用下面的形式


大致如下的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>
Foo:

酒吧:


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

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

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


我帮了忙吗?

一个问题:如果既不涉及数据库也不涉及任何文件,您打算如何“保存提交的数据”?当我直接使用它时,它在将它放入这个标记后工作,然后它显示为`Foo:${param.Foo}`@ali:显然您使用的是JSP 1.x而不是2.x。jsp1.x是一只痛苦的恐龙(十多年前)。你可能想升级你的环境或寻找一个不同的项目。工作得很有魅力。谢谢
<input type="text" name="var1" value="<%= session.getAttribute("var1") %>" />
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);
}
<p>Foo: <c:out value="${param.foo}" /></p>
<p>Bar: <c:out value="${param.bar}" /></p>