我有一个Web表单(JSP),它将数据提交给托管在不同服务器上的不同应用程序。提交表单数据后,该应用程序重定向回相同的JSP页面。现在,我想保存输入的数据。保留Web表单中提交的数据的不同方法有哪些。我不希望将数据存储在数据库或任何文件中。
PS:我想在请求再次重定向到同一JSP页面时保留提交的表单数据。因此,用户无需重新输入数据。比如,数据可以存储在Session或Request等中。
答案 0 :(得分:6)
最好的办法就是提交给自己的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
和/或讨厌的小脚本。
答案 1 :(得分: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") %>" />
答案 2 :(得分:1)
如果我正确理解了这个问题(大“如果”那么),你就有了一个具有POST方法的FORM和一个直接指向远程服务器的ACTION。当用户单击“提交”时,浏览器不涉及该事务中的主机,数据将转到“ACTION”收件人。这将使您的选项仅限于实现与远程服务的回调关系(可能超出您的控制),设置本地代理Servlet来拦截数据并将POST转发给它的预期收件人(这将使POST来自服务器而不是客户端(这可能会导致问题)),或利用一些AJAX设计模式将表单数据发送到两个地方而不是FORM标签所指示的地方。
除此之外,您还需要具有某种形式的本地持久性,如数据库或文件。
我有帮助吗?