¿Qué importa que algún capitán me ordene coger la escoba y barrer la cubierta?¿Quién no es un esclavo? Decídmelo.
Ismael, en Moby Dick

[Struts Validator] – Formulario no declarado

Otro post de mensajes poco claros de Struts:

ServletException in '/jsp/ContenedorFormulario.jsp': No form found under 'SolicitudForm' in locale 'es_ES'. A form must be defined in the Commons Validator configuration when dynamicJavascript="true" is set.

Lo que nos dice es que no encuentra el formulario SolicitudForm , en el fichero XML descriptor de las validaciones de Struts Validator, que solemos llamar validation.xml.

[Struts Validator] – Validaciones múltiples validwhen

Leo textualmente la guía de Struts Validator :

A few quick notes on the grammer.

  • All comparisons must be enclosed in parens.
  • Only two items may be joined with and or or
  • If both items to be compared are convertable to ints, a numeric comparison is done, otherwise a string comparison is done.

Atención a la segunda nota. Oh estúpido de mí, que entendía que únicamente se podían hacer validaciones del estilo

  • ( (a) and (b) )
  • ( (a) or (b) )

Pues esto no es cierto, porque aunque la guía no lo documenta, puedes concatenar recursivamente las veces que quieras, siempre cuidando de los paréntesis.

Por ejemplo, podemos sustituir "(a)" en las expresiones anteriores por "( (c) or (d) )", y así recursivamente hasta montar validaciones como:

 

<field property="bioseguridad.justificacionABCD" depends="validwhen">

      <arg0 key="bioseguridad.justificacionABDC" />

      <var>

            <var-name>test</var-name>

            <var-value>

(

      (

            (

                  (bioseguridad.experimentacionSeresHumanos != "1")

                  or

                  (*this* != null)

            )

            and

            (

                  (bioseguridad.utilizacionCelulasEmbrionarias != "1")

                  or

                  (*this* != null)

            )

      )

      and

      (

            (

                  (bioseguridad.utilizacionTejidosHumanos != "1")

                  or

                  (*this* != null)

            )

            and

            (

                  (bioseguridad.utilizacionDatosPersonales != "1")

                  or

                  (*this* != null)

            )

      )

)

            </var-value>

      </var>

</field>

 

Lo que le da al validwhen una potencia bastante mayor de la que yo utilizaba. 

[tags]struts, struts validator[/tags]

[Struts Validator] – Mensajes con argumentos

Cuando una validación no pasa, Struts Validator pinta un mensaje que le puedes acompañar con los argumentos que quieras.

En una validación validwhen, yo quería que me saltase el mensaje típico cuando no pase la validación. Pero el nombre del campo era variable, tenía cuatro campos de justificación de distintos campos:

 

bioseguridad.justificacion.respuesta=Justifique su Respuesta al apartado {0}

Y el argumento que le pasas diferencia los campos justificación entre sí.

Pero en el validation.xml, tenía un mensaje (errors.required) que tenía un argumento (bioseguridad.justificación.respuesta) que tenía también un argumento (el campo justificación al que correspondía)… y no sabía cómo implementarlo.

Gracias a José Daniel (en la guía del Struts Validator también viene), encontré la respuesta.

Al fallar una validación, se presenta un mensaje. Por defecto, cada tipo de validación tiene un mensaje asociado, pero lo puedes cambiar:

 

<field property="bioseguridad.justificacionH" depends="validwhen, maxlength">

      <msg name="validwhen" key="bioseguridad.justificacion.respuesta" />

      <arg0 key="bioseguridad.liberacionOMGs"/>

      <var>

            <var-name>test</var-name>

            <var-value>((bioseguridad.liberacionOMGs != "1") or (*this* != null))</var-value>

      </var>

      <arg2 name="maxlength" key="${var:maxlength}" resource="false"/>

      <var><var-name>maxlength</var-name><var-value>3500</var-value></var>

</field>

[tags]struts, struts validator[/tags]

[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>

Continua leyendo »

Comenta