2009-06-28 177 views
7

我有一個Web表單(JSP),它將數據提交給託管在不同服務器上的不同應用程序。提交表單數據後,該應用程序將重定向回相同的JSP頁面。現在,我想保存輸入的數據。以網頁形式保留提交的數據有哪些不同的方法。我不希望將數據存儲在數據庫或任何文件中。 PS:我想保留提交的表單數據,當請求再次被重定向到相同的JSP頁面時。因此,用戶不需要重新輸入數據。就像數據可以存儲在會話或請求中一樣。保留提交的JSP表單數據

+2

一個問題:如果既沒有數據庫也沒有涉及任何文件,您如何建議「保存提交的數據」? – duffymo 2009-06-28 17:24:48

回答

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") %>" /> 
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和/或令人討厭的scriptlet。

+0

當它直接使用它時,它會把它放在這個標籤中然後顯示爲'Foo:$ {param.foo}` – Ali786 2014-09-29 09:33:10

1

如果我正確地理解了這個問題(大「如果」那裏),你有一個FORM的方法是POST和一個直接指向遠程服務器的ACTION。當用戶單擊「提交」時,瀏覽器不涉及您的主機在該交易中,數據將轉到「ACTION」收件人。這將使您的選項受限於實現與遠程服務的回調關係(可能無法控制),設置本地代理servlet來攔截數據並將POST轉發給它的預期收件人(這將使POST始發於服務器而不是客戶端(這可能會導致問題)),或者利用一些AJAX設計模式將表單數據發送到兩個位置,而不是FORM標籤指定的一個位置。

除此之外,您需要擁有某種形式的本地持久性,如數據庫或文件。

我有幫助嗎?