Una era construye ciudades. Una hora las destruye.
Séneca

[Struts Validator] - input en struts-config.xml

Si queremos que Struts valide automáticamente un formulario, debemos indicarlo en la declaración de nuestro action en struts-config.xml, mediante validate="true". Entonces Struts ejecutará las validaciones de Struts Validator y el método validate () del formulario.

Si la validación de los datos es correcta, entonces Struts continua con el flujo normal hacia el Action declarado. En caso contrario, el flujo seguirá hacia el path que indiquemos en la propiedad input="…", con los mensajes de error de las validaciones no superadas.

<action path="/editar*" type="es.xxx.xxx.control.actions.{1}Action" parameter="editar" name="{1}Form" scope="request" validate="true" input="{1}" roles="1">

      <forward name="success" redirect="false" path="{1}" />

</action>

La idea original de la propiedad input (entrada en español) era indicar el path de la JSP que había introducido los datos, para redirigir el flujo hacia ella indicando los errores de validación para que el usuario pudiera cambiarlos.

Sin embargo, es posible que nos interese redirigirla a una acción en lugar de hacia una JSP, por ejemplo para hacer consultas previas a BBDD que no están cacheadas, o para no perder el contenido original de la request que invocó la primera vez la JSP. Para ello simplemente indicamos en input la acción a la que queremos redirigir:

input="/recargarCombos{1}.do"

Technorati Tags: ,

 

7 Comentarios hasta el momento »

  1. FelipeM dijo

    11 de September del 2007 a las 1:10 pm

    Hola,

    El {1} ¿a qué equivale? no entiendo qué hace en medio de la dirección del action :-S

    Un saludo.

  2. yoyoooyoy dijo

    11 de September del 2007 a las 2:32 pm

    Vale, qué descuido !!! creía que había explicado el tema de las wildcards también aquí.

    Echa un vistazo a los “Wildcards” en la Lyckapedia:
    http://www.hachisvertas.net/jcs/wiki/index.php?title=Struts_Wildcards

    En este caso, {1} toma el valor del *. Por ejemplo, editarUsuario corresponde al path “/editar*”, y será atendido por el action UsuarioAction que será alimentado por el formulario UsuarioForm, y el flujo continuará hacia la tile Usuario tanto si todo es correcto (forward success) como si falla la validación (input).

    Básicamente {1}, {2}… {n} son sustituidos por parámetros. Pasa igual por ejemplo en los mensajes de error del struts-validator: mira el MessageResources y verás por ejemplo :
    errors.maxlength={0} can not be greater than {1} characters.
    {0} y {1} son los argumentos que declaras en el validator.xml:
    <field property=”datosProyecto.resumen” depends=”required, maxlength”>
    <arg0 key=”datosProyecto.resumen” />
    <arg1 name=”maxlength” key=”${var:maxlength}” resource=”false”/>
    <var><var-name>maxlength</var-name><var-value>3500</var-value></var>
    </field>

    Muchas gracias por el comentario

  3. FelipeM dijo

    11 de September del 2007 a las 8:09 pm

    Vaya, utilizo las variables con ActionMessage/Validator, pero no conocía esa posibilidad con los * !

    La culpa es mía por preguntar sin antes darme una vuelta por la web y ver artículos que habías escrito ;-)

    Un saludo.

  4. yoyoooyoy dijo

    12 de September del 2007 a las 9:01 am

    No hombre, si se agradecen los comentarios (así parece que le sirve a algien :P) y me sacas unos minutos de la rutina del curro.

    Hoy en día los archivos de configuración se están convirtiendo en el precio a pagar por utilizar frameworks, y se están convirtiendo en el principal problema para mantener un proyecto.

    De tu comentario y del de Jesús en http://www.hachisvertas.net/blog/01/2007/03/13/struts-configuracion-de-struts/ intentaré sacar un artículo de buenas prácticas para no convertir en monstruos demoníacos nuestros xml y properties.

    Gracias por vuestros comentarios!!!

  5. minifreak dijo

    6 de March del 2008 a las 9:45 am

    Muy buenas!

    Yo tengo otra pregunta:
    ¿Considerarías el hecho de utilizar los paths de los mappings en los inputs como una best practice?
    Por lo que he podido leer, comentas que es posible utilizar esta solución, pero que la idea original era utilizar una jsp o entrada de tiles.
    Como ves la posibilidad de sobreescribir el TilesRequestProcessor para que haga la lógica que nos interese (incluso utilizar forwards como inputs, inputForward=true en la definición del Controller en el struts-config.xml) y la carga de datos se haga implementando el método populate() de nuestro FormBean llamándose cada vez que se ejecuta el método validate(), el cual sobreescribiriamos y llamaríamos al super.validate().
    ¿Se reduciría de esta manera el flujo de nuestra aplicación y por lo tanto esta sería una best practice?

    Saludos y gracias.

    PD: Muy bueno lo de las wildcards, no lo sabia… :P

  6. yoyoooyoy dijo

    6 de March del 2008 a las 11:50 am

    Muchas gracias minifreak por tu comentario.

    Si te parece, vamos por partes, y como creo que las respuestas llevarían bastante espacio te voy a contestar con sendos posts :)

    Además llevo tiempo queriendo resumir todos los posts de Struts en un libro, y sacar tiempo para reescribrir bien el manual de struts.

    (si te corre prisa dame un toque vía mail o comantario y te respondo más rápido)

  7. Lycka Bonita » [Struts] - Input y Forwards de un Action dijo

    7 de March del 2008 a las 8:20 am

    [...] pregunta minifreak en [Struts Validator] - input en struts-config.xml si considero que es una best practice que tanto input como forward se refieran a acciones y no a [...]

Comentarios RSS · TrackBack URI

Dejanos tu Comentario

Nombre: (Requerido)

E-Mail: (Requerido)

Sitio WEB:

Comentario:

Comenta