2009-06-28 14 views
7

Ho un modulo Web (JSP) che invia i dati a diverse applicazioni, ospitate su server diversi. Dopo aver inviato i dati del modulo, tale applicazione reindirizza alla stessa pagina JSP. Ora, voglio salvare i dati inseriti. Quali sono i diversi approcci per conservare i dati inviati in forma web. Non preferirei memorizzare i dati in DB o in qualsiasi file.Conservazione dei dati modulo JSP inviati

PS: Vorrei conservare i dati del modulo inviato quando la richiesta di nuovo reindirizzata alla stessa pagina JSP. Pertanto, l'utente non deve reinserire i dati. Ad esempio, i dati possono essere memorizzati in Sessione o Richiesta, ecc.

+2

Una domanda: se non sono coinvolti né un database né alcun file, come si propone di "salvare i dati inviati"? – duffymo

risposta

2

In JSP questo tipo di cose viene solitamente gestito utilizzando un javabean per memorizzare i valori del modulo e quindi utilizzando il tag jsp: useBean. Per esempio si potrebbe creare la seguente 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; } 
} 

Nel modulo JSP devi usare il tag useBean ei tuoi valori campi modulo otterrebbe i loro valori dal fagiolo:

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

Nella tua jsp i dati del modulo vengono pubblicati su (quindi reindirizzati indietro) si avrà il seguente codice che spingerebbe i dati del modulo inviato nel bean.

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

Un'altra opzione è quella di riempire solo i dati del modulo nella sessione nella tua pagina risparmiare:

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

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

e fare riferimento a esso nel modulo (null checking omesso):

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

La cosa migliore che puoi fare è inviare al tuo servlet che a sua volta spara un'altra richiesta per l'applicazione web esterna in background con poco aiuto di java.net.URLConnection. Infine, basta postare di nuovo alla pagina dei risultati all'interno della stessa richiesta, in modo da poter accedere ai parametri della richiesta solo per EL. C'è una variabile EL implicita ${param} che ti dà accesso ai parametri di richiesta come un Map in cui il nome del parametro è la chiave.

Quindi, con il seguente modulo

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

e più o meno il seguente servlet metodo

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

si dovrebbe essere in grado di accedere all'ingresso in result.jsp come segue

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

Semplice come quella. Nessuna necessità di script jsp:useBean e/o brutto.

+0

Funziona dopo averlo inserito in questo tag quando lo stavo usando direttamente, quindi è stato visualizzato così com'è 'Foo: $ {param.foo}' – Ali786

+0

@ ali: apparentemente stai usando JSP 1.x invece di 2.x. JSP 1.x è un dinosauro doloroso (vecchio di oltre un decennio). Potresti voler aggiornare il tuo ambiente o cercare un progetto diverso. – BalusC

+0

Ha funzionato come un fascino. Grazie! –

1

Se ho capito il problema correttamente (grande "se" lì), hai un FORM che ha un metodo di POST e un AZIONE che è indirizzato direttamente a un server remoto. Quando l'utente fa clic su "Invia", il browser non sta coinvolgendo il tuo host in quella transazione, i dati vanno al destinatario "ACTION". Ciò renderebbe le opzioni limitate all'implementazione di una relazione di richiamata con il servizio remoto (possibilmente al di fuori del controllo dell'utente), impostando un servlet proxy locale per intercettare i dati e inoltrare il POST al destinatario previsto (il che renderebbe il POST originato da il server e non il client (questo potrebbe probabilmente causare problemi)), o utilizzare alcuni pattern di progettazione AJAX per inviare i dati del modulo a due posti invece di uno solo che il tag FORM detta.

Oltre a ciò, è necessario disporre di una qualche forma di persistenza locale come un database o un file.

Mi è stato di aiuto?

Problemi correlati