Professional Documents
Culture Documents
Envíos duplicados
En la programación web, el tiempo de respuesta puede demorar bastan-
te por el tráfico, congestiones, servidores saturados y demás causas posi-
bles. Esto trae a colación el problema del envío duplicado de un pedido.
Este problema ocurre cuando el usuario envía el pedido y, antes de que el
servidor pueda responderle, vuelve a enviar el pedido. Típicamente, esto
ocurre si hace doble clic en el botón para enviar un formulario, o si, luego
de enviarlo y no obtener respuesta por unos segundos, vuelve a presionar
el botón pensando que no había sido enviado en su primer intento. Esta
situación puede ser inofensiva en muchos casos, pero volviendo al ya
clásico ejemplo de la transferencia bancaria, el usuario estará transfirien-
do el doble (o más) de la suma que realmente quiere transferir.
Del lado del cliente, podemos evitar esto usando JavaScript para deshabili-
tar el botón de envío una vez que fue presionado por primera vez. Es de uti-
lidad, pero no todos los navegadores soportan JavaScript, o el usuario podría
tener JavaScript deshabilitado en su navegador. Debemos prevenir esta situa-
ción en el servidor, y Struts nos brinda la funcionalidad necesaria.
La idea es grabar una marca en la sesión cuando mostramos la pá-
gina que queremos proteger; luego, la acción que la procesa busca esa
marca. Si está, la quita y sigue procesando. Bajo este protocolo, solo la
primera acción que procese la página podrá procesar los datos. Los pe-
didos subsiguientes no encontrarán la marca en la sesión.
BOTONES DE CANCELACIÓN
www.redusers.com
<action path=”/verFormulario”
type=”capitulo6.VerFormularioAction”
name=”otroForm” scope=”request”>
<forward name=”ok” path=”/jsp/capitulo6/form.jsp” />
</action>
<action path=”/procesarFormulario”
type=”capitulo6.ProcesarFormularioAction”
name=”otroForm” scope=”request”>
<forward name=”ok” path=”/jsp/form_ok.jsp” />
<forward name=”mal” path=”/jsp/form_mal.jsp” />
</action>
ERRORES Y MENSAJES
Los mensajes y errores son ambos tratados como objetos ActionMessage. Struts los
guarda en distintos lugares del pedido y, luego, con distintos tags podremos acceder
a ellos. Por regla general, un error es algo que impide seguir con la navegación,
y, si hay errores en el pedido, deberíamos tomar alguna medida extraordinaria (como
volver atrás y permitir al usuario corregir el error).
www.redusers.com
package capitulo6;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
// Mostramos el JSP
return map.findForward(“ok”);
}
}
Es bueno hacer una revisión del lado del cliente y del servidor contra envíos
duplicados implementando funciones JavaScript para deshabilitar el botón.
www.redusers.com
package capitulo6;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
// Procesar formulario
...
return map.findForward(“ok”);
}
else {
/* Marca inválida, devolvemos página de error */
return map.findForward(“mal”);
}
}
}
www.redusers.com
www.redusers.com
Cancelación de la acción
En ocasiones, es conveniente dar al usuario la opción de cancelar la acción
que está realizando. En Struts, esto es muy fácil de desarrollar. En la vista,
generamos un botón de cancelación usando el tag <html:cancel> (explicado
en el Capítulo 7). Al presionarse este botón, se envía el formulario sin vali-
darse. Esto es lógico, ya que, si el usuario quiere cancelar la acción, no va-
mos a obligarlo a completar todos los campos con los formatos necesarios.
Nuestra acción, sin embargo, seguramente dependerá de datos validados,
por lo que tendremos que ser precavidos para manejar este tipo de casos.
En la clase Action tenemos el método:
if (isCancelled(req)) {
// Acción cancelada
return map.findForward(“cancelado”);
}
else {
// Ejecutamos la acción
...
}
}
www.redusers.com
Errores y mensajes
Desde nuestra acción podemos enviar mensajes al cliente. Estos mensa-
jes pueden ser advertencias, errores de validación complejos, etcétera.
Los métodos de la clase Action son:
www.redusers.com
// Devolvemos la vista
return map.findForward(“ok”);
}
else {
/* Hay errores, devolvemos la vista a la página
para que el usuario los corrija */
return map.getInputForward();
}
}
www.redusers.com
Actividades
TEST DE AUTOEVALUACIÓN
PROFESOR EN LÍNEA
www.redusers.com