2009-06-28 12 views
7

Tengo un formulario web (JSP) que envía los datos a diferentes aplicaciones, alojadas en servidores diferentes. Después de enviar los datos del formulario, esa aplicación redirige a la misma página JSP. Ahora, quiero guardar los datos ingresados. ¿Cuáles son los diferentes enfoques para retener los datos presentados en el formulario web? No preferiría almacenar los datos en DB o cualquier archivo.Retención de los datos de formulario JSP enviados

PD: Me gustaría conservar los datos del formulario enviado cuando la solicitud se redirija nuevamente a la misma página JSP. Por lo tanto, el usuario no necesita volver a ingresar los datos. Al igual, los datos se pueden almacenar en Sesión o Solicitud, etc.

+2

Una pregunta: si no se trata de una base de datos ni de ningún archivo, ¿cómo propone "guardar los datos enviados"? – duffymo

Respuesta

2

En JSP este tipo de cosas generalmente se maneja usando un javabean para almacenar los valores del formulario y luego usar la etiqueta jsp: useBean. Por ejemplo, se crearía el siguiente 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; } 
} 

En su formulario JSP tendrá que utilizar la etiqueta useBean y sus valores de campos de formulario se obtendría sus valores de la semilla:

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

En su JSP los datos del formulario se publican en (luego vuelven a redireccionar) tendrías el siguiente código que empujaría los datos del formulario publicado al bean.

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

Otra opción es simplemente rellenar los datos del formulario en la sesión en su página de ahorrar:

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

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

y hacer referencia a ella en su forma (nula comprobación omitido):

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

Lo mejor que puede hacer es enviarlo a su propio servlet, que a su vez dispara otra solicitud a la aplicación de la aplicación externa en segundo plano con la ayuda de java.net.URLConnection. Finalmente solo publique nuevamente en la página de resultados dentro de la misma solicitud, para que pueda acceder a los parámetros de solicitud por EL. Hay una variable EL implícita ${param} que le da acceso a los parámetros de solicitud como un Map donde el nombre del parámetro es la clave.

Así, con el siguiente formulario

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

y más o menos lo siguiente servlet método

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

usted debería ser capaz de acceder a la entrada en result.jsp de la siguiente manera

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

simple como ese. No es necesario jsp:useBean y/o scriptlets desagradables.

+0

Funciona después de ponerlo en esta etiqueta cuando lo estaba usando directamente, se ha mostrado como 'Foo: $ {param.foo}' – Ali786

+0

@ ali: aparentemente estás usando JSP 1.x en lugar de 2.x. JSP 1.x es un dinosaurio doloroso (más de una década de antigüedad). Es posible que desee actualizar su entorno o buscar un proyecto diferente. – BalusC

+0

Funcionó como un amuleto. ¡Gracias! –

1

Si entiendo el problema correctamente (si hay un "si" grande), tiene una FORMA que tiene un método de POST y una ACCIÓN que apunta directamente a un servidor remoto. Cuando el usuario hace clic en "Enviar", el navegador no está involucrando a su anfitrión en esa transacción, la información va al destinatario de "ACCIÓN". Eso limitaría sus opciones a la implementación de una relación de devolución de llamada con el servicio remoto (posiblemente fuera de su control), configurando un servlet proxy local para interceptar los datos y reenviar el POST a su destinatario (lo que haría que el POST se originara desde el servidor y no el cliente (esto podría causar problemas)), o utilizar algún patrón de diseño AJAX para enviar los datos del formulario a dos lugares en lugar de solo uno que dicta la etiqueta FORMULARIO.

Más allá de eso, necesitaría tener algún tipo de persistencia local como una base de datos o un archivo.

¿Ayudé a todos?

Cuestiones relacionadas