2010-01-27 35 views
8

Tengo el siguiente formulario de configuración:formas de manejo con botones múltiples mensajes/

<html> 
<head></head> 

<body> 
<form method="post" enctype="multipart/form-data" action="FileUpload"> 
    <table> 
     <th>WEX SI Online Validation</th> 
     <tr> 
      <td>Step 1: Select File for Validation: </td> 
      <td><input name="filename" type="file"/></td> 
     </tr> 
     <tr> 
      <td>Step 2: Validate File:</td> 
      <td><input name="validate" type="button" value="Validate"/></td> 
     </tr> 
     <tr> 
      <td>Step 3: Download and Fix Errors:</td> 
      <td><input name="download" type="button" value="Download"/></td> 
     </tr> 
     <tr> 
      <td>Step 4: Submit</td> 
      <td><input name="submit" type="submit" value="Submit"/></td> 
     </tr> 
    </table> 
</form> 
</body> 

</html> 

¿Cómo debo manejar esto? Estoy usando Java/JSP/Servlets pero no estoy seguro de cómo manejar la publicación para la parte de carga de esto y de las otras acciones.

Creo que sería mejor crear algún tipo de controlador de formulario que manejara la publicación del formulario y lo delegue a otros servlets, dependiendo de lo que el usuario esté haciendo. No estoy seguro de cómo decir lo que el usuario ha seleccionado sin embargo.

Respuesta

3

Como para cualquier otro elemento normal <input>, se enviará el name-value par de <input type="button"> como parámetro de solicitud.

La principal advertencia es que los elementos <input type="button"> y <button> no funcionan correctamente en MSIE. En todas las versiones de MSIE, el atributo value de un elemento de botón no se enviará como valor de parámetro, sino que se enviará su cuerpo (el contenido de la etiqueta).

Además, en IE6 hay otro error sorprendente: no solo se enviará el par nombre-valor del botón presionado, sino que también se enviarán los de los demás botones no presionados en el formulario. De esta forma, no puede distinguir el botón presionado en el lado del servidor.

La solución que funciona en combinación con todos los navegadores es usar <input type="submit"> y darles un nombre diferente (o el mismo nombre pero con un valor diferente).

E.g.

<input type="submit" name="validate" value="Validate"> 
<input type="submit" name="download" value="Download"> 
<input type="submit" name="submit" value="Submit"> 

en combinación con

if (request.getParameter("validate") != null) { 
    // Validate button pressed. 
} else if (request.getParameter("download") != null) { 
    // Download button pressed. 
} else if (request.getParameter("submit") != null) { 
    // Submit button pressed. 
} 

o

<input type="submit" name="action" value="Validate"> 
<input type="submit" name="action" value="Download"> 
<input type="submit" name="action" value="Submit"> 

en combinación con

String action = request.getParameter("action"); 
if ("Validate".equals(action)) { 
    // Validate button pressed. 
} else if ("Download".equals(action)) { 
    // Download button pressed. 
} else if ("Submit".equals(action)) { 
    // Submit button pressed. 
} 

La última forma ofrece más posibilidades para abstraer la una y la otra más bien lejos en Java l Evel.

Por cierto, por supuesto suponer que usted ya está usando Apache Commons FileUpload para procesar los datos del formulario de varias partes, si es necesario con ayuda de un Filter which puts the multipart form data back in the request parameter map, de lo contrario no obtendrá nada de HttpServletRequest#getParameter().

+0

Estoy tratando de utilizar la última sugerencia que hizo, todos los botones de envío, con el mismo nombre, diferentes valores, pero cuando recupero la acción de mi solicitud, siempre es nulo. Tengo el mismo html que el anterior, excepto con los cambios de nombre. – Casey

+0

Lea el último párrafo de mi respuesta :) – BalusC

+0

Por el momento, no estoy analizando nada. Solo tengo el formulario llamando a mi servlet controlador. Sin embargo, dado que el formulario está configurado en multipart/form-data, supongo que tengo que poner la información en el lugar correcto. – Casey

0

Apache Commons FileUpload puede manejar todo esto para usted.

+0

y ¿cómo exactamente? – Bozho

+0

Ya lo estoy usando para manejar la carga real. No todos los botones envían archivos, pero desencadenan otros procesos en segundo plano. – Casey

1

Los botones tipo = "botón" no envían automáticamente el formulario. Solo el tipo = "enviar" lo hará.

Si desea varios botones que cada uno envíe y realice diferentes acciones, entonces tiene varias opciones. Creo que la opción que mencionas para tener un solo servlet decidir qué está haciendo el usuario y reenviar a otro servlet es una buena idea. Puede ver qué está haciendo el usuario buscando el nombre del botón en el mapa de atributos.

String btn = request.getParameter("submitbuttonname"); 
    if(btn != null){ 
     //this was the button clicked. 
    } 

La segunda opción que puedo pensar es dividir el formulario en varias formas. ¿Necesita enviar el archivo para cada botón? Si no es así, cree un formulario con los datos que debe enviar cada uno con su propio botón de envío.

2

El valor del botón de envío se transmite en la solicitud POST junto con todos los demás valores de formulario, siendo el nombre del botón el nombre y el valor es el valor del botón.

Para que pueda detectar qué botón se pulsó, verificando la existencia de valores para cada tecla asociada a botones variables (o si nombra sus botones de la misma manera, simplemente puede verificar cuál es el valor de la tecla).

Además, los elementos manipuladores Button Necesidad onClick que presentar efectivamente la forma y/o hacer cualquier trabajo (por PRESENTAR elementos por defecto onclick llama de forma submit())

0

Puede ser manejado con JavaScript.

function submitTo(url) { 
    form.action = url; 
    form.submit(); 
} 

...

<input name="download" onClick="submitTo('/download')" ... /> 
0

El mejor enfoque es tener un controlador de formulario para delegar la lógica para otras clases, en función de los valores de tipo de entrada que se pasa como parámetros.

Cuestiones relacionadas