2009-06-28 12 views
7

Mam formularz internetowy (JSP), który przesyła dane do innej aplikacji, hostowanej na innym serwerze. Po przesłaniu danych formularza aplikacja przekierowuje z powrotem na tę samą stronę JSP. Teraz chcę zapisać wprowadzone dane. Jakie są różne podejścia do zachowania przesłanych danych w formie internetowej. Nie chciałbym przechowywać danych w DB lub innym pliku.Zachowanie przesłanych danych formularza JSP

PS: Chciałbym zachować przesłane dane formularza, gdy żądanie zostanie ponownie przekierowane na tę samą stronę JSP. Dlatego użytkownik nie musi ponownie wprowadzać danych. Dane mogą być przechowywane w sesji lub żądaniu itp.

+2

Jedno pytanie: jeśli nie jest zaangażowana ani baza danych, ani żaden plik, w jaki sposób proponuje się "zapisać przesłane dane"? – duffymo

Odpowiedz

2

W JSP tego rodzaju rzeczy zwykle są obsługiwane za pomocą javabean do przechowywania wartości formularza, a następnie za pomocą tagu jsp: useBean. Na przykład można utworzyć następujący JavaBeans:

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; } 
} 

W formularzu JSP chcesz użyć tagu useBean i twoi wartości pól formularza by uzyskać ich wartości z fasoli:

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

W swojej JSP dane formularza są wysyłane do (następnie przekierowuje z powrotem) masz następujący kod, który wypchnąłby opublikowanych danych formularza do komponentu bean.

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

Inną opcją jest po prostu rzeczy dane formularza do sesji w swoim ratowania stronie:

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

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

i odwoływać się do niej w swojej formie (null sprawdzanie pominięta):

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

Najlepsze, co możesz zrobić, to poddać się własnemu serwletowi, który z kolei wysyła kolejne żądanie do zewnętrznej aplikacji internetowej w tle, z niewielką pomocą java.net.URLConnection. Na koniec po prostu powróć do strony z wynikami w ramach tego samego żądania, aby uzyskać dostęp do parametrów żądania przez EL. Istnieje niejawna zmienna EL ${param}, która zapewnia dostęp do parametrów żądania, takich jak Map, w których nazwa parametru jest kluczem.

Więc z poniższego formularza

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

i grubsza następujące serwletu metodą

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); 
} 

powinieneś być w stanie uzyskać dostęp do wejścia w result.jsp następująco

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

Proste jak że. Nie ma potrzeby stosowania jsp:useBean i/lub nieprzyjemnych skryptletów.

+0

Działa po umieszczeniu go w tym tagu , gdy używałam go bezpośrednio, a następnie wyświetlił się jako 'Foo: $ {param.foo}' – Ali786

+0

@ ali: najwyraźniej używasz JSP 1.x zamiast 2.x. JSP 1.x to bolesny dinozaur (ponad dekadę). Możesz ulepszyć swoje środowisko lub poszukać innego projektu. – BalusC

+0

Pracował jak urok. Dzięki! –

1

Jeśli dobrze rozumiem problem (duże "jeśli" tam), masz FORMULARZ, który ma metodę POST i AKCJA, która jest skierowana bezpośrednio do zdalnego serwera. Kiedy użytkownik kliknie "Wyślij", przeglądarka nie angażuje hosta w tę transakcję, dane trafiają do odbiorcy "DZIAŁANIE". To sprawi, że twoje opcje będą ograniczone do wdrożenia relacji oddzwaniania z usługą zdalną (być może poza twoją kontrolą), ustanowienia lokalnego serwletu proxy w celu przechwycenia danych i przekazania POST do zamierzonego odbiorcy (co spowodowałoby, że POST pochodzi z na serwerze, a nie na kliencie (może to powodować problemy)) lub wykorzystać jakiś wzór projektowy AJAX do wysłania danych formularza do dwóch miejsc zamiast jednego, który dyktuje tag FORM.

Poza tym trzeba mieć pewną formę lokalnej trwałości, jak bazę danych lub plik.

Czy w ogóle mi pomogłem?

Powiązane problemy