Introduccin
Es una decisin de diseo implementar todos los forms dinmicos., sin embargo, la clase DynaActionForm no provee un comportamiento por defecto para el mtodo validate( . As! pues "ay dos opciones para validar un form, se crea una subclase de DynaActionForm donde se implemente un validate( propio (#ue no es recomendado o se usa el frame$or% de validacin (la opcin recomendada . En struts &.' no "ab!a frame$or% de validacin, simplemente se implementaba el mtodo validate( en cada ActionForm. Esto generaba ( inconvenientes) primero se replicaba cdigo de validaciones similares en cada ActionForm y segundo, cada modificacin a la validacin implicaba modificar el cdigo fuente y recompilar. El frame$or% de validacin de la versin &.& resuelve estos problemas "aciendo de la lgica de validacin un !tem configurable. El frame$or% es originado de un proyecto open source de *a%arta. El propsito de ste es proveer validacin declarativa de los campos de una forma. +a validacin incluye tipos bsicos, formatos (por defecto y definidos por medio de e,presiones regulares , rangos y longitud de los campos. +as reglas de validacin son las funciones lgicas de validacin asociadas a campos espec!ficos de la forma. +as reglas bsicas de validacin vienen establecidas en las versin &.& de -truts. .or e/emplo, 0re#uired1, 0min+engt"1, 0ma,+engt"1, etc. Estas reglas bsicas permiten "acer validacin al lado del cliente por medio de /avascript. Es posible crear reglas de validacin propias y aadirlas al arc"ivo de definiciones.
Configuracin y uso
1. Configurar el plugin validator
&.&. Aada el siguiente elemento 2plug3in4 sin ning5n cambio al arc"ivo struts3 config.,ml
<plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/W !-IN"/validator-rules.#ml$ /W !-IN"/validation.#ml"/> </plug-in>
6ote #ue el tag 2plug3in4 es de -truts &.&, como no estaba en el D7D de -truts &.' es necesario actuali8ar el D7D al #ue "ace referencia el struts3config.,ml. .ara ello copie la siguiente informacin)
< %&'()*P 1.1// N" struts-con+ig P,!-I( "-//.pache /o+t0are "oundation//&)& /truts (on+iguration "http2//3a4arta.apache.org/struts/dtds/struts-con+ig5151.dtd">
errors.byte>?'@ must be an byte. errors.s"ort>?'@ must be an s"ort. errors.integer>?'@ must be an integer. errors.long>?'@ must be an long. errors.float>?'@ must be an float. errors.double>?'@ must be an double. errors.date>?'@ is not a date. errors.range>?'@ is not in t"e range ?&@ t"roug" ?(@. errors.creditcard>?'@ is not a valid credit card number. errors.email>?'@ is an invalid e3mail address. 6ote #ue ?'@, ?&@, ?(@ indican donde se ubicarn los parmetros enviados al mensa/e de error. Estos parmetros son especificados con los elementos 2arg'4, 2arg&4 y 2arg(4 del arc"ivo validation.,ml. Asted puede escribir sus propias reglas de validacin aadindolas a este arc"ivo o crendolas en otro arc"ivo y aadiendo otro arc"ivo al tag 2plug3in4 E/emplo de reglas de validacin) <egla de validacin de 0minlengt"1 obtenida del arc"ivo validation3rules.,ml)
<validator name="minlength" classname="org.apache.struts.validator."ield(hec4s" method="validate6in-ength" methodParams="3ava.lang.'73ect$ org.apache.commons.validator.Validator.ction$ org.apache.commons.validator."ield$ org.apache.struts.action..ction rrors$ 3ava#.servlet.http.8ttp/ervlet9e:uest" depends="" msg="errors.minlength"> <3avascript><%;(&.).; +unction validate6in-ength<+orm= > var isValid = true? var +ocus"ield = null? ... </3avascript> </validator>
+os atributos del elemento 2validator ...4 son) name) nombre lgico para la regla de validacin. Es el nombre usado en el validation.,ml classname, met"od) clase y mtodo #ue contienen la lgica de la validacin met"od.arams) lista de parmetros del mtodo delimitada por comas msg) llave en el resource bundle. El validator lo usa para buscar un mensa/e del resource bundle de struts. depends) otras reglas de validacin #ue se deben llamar antes de e/ecutar sta regla.
(.(. El arc"ivo validation.,ml es especifico a la aplicacin pues es donde el desarrollador especifica #ue reglas del validation3rules.,ml se van a usar para cada ActionForm. -i el arc"ivo no e,iste creelo en el directorio 9E:3;6F de su proyecto. E/emplo de validation.,ml (Aser+oginForm
<+orm-validation> <+ormset> <+orm name=" ,ser-ogin"orm"> <+ield property="username" depends="re:uired$ minlength$ma#length"> <arg@ 4ey="display.username"/> <arg1 4ey="A>var2minlengthB" name="minlength" resource="+alse"/> <argC 4ey="A>var2ma#lengthB" name="ma#length" resource="+alse"/> <var> <var-name>ma#length</var-name> <var-value>1D</var-value> </var> <var> <var-name>minlength</var-name> <var-value>E</var-value> </var> </+ield> <+ield property="pass0ord" depends="re:uired" 7undle="alternate"> <msg name="re:uired" 4ey="userlogin.uPass0ord.re:uired" resource="true"/> </+ield> </+orm> F
En este e/emplo "ay una forma llamada Aser+oginForm. Esta forma tiene ( propiedades 0username1 y 0pass$ord1. En letra verde estn las declaraciones para validar la propiedad 0username1 en a8ul las de 0pass$ord1. En particular, la regla de validacin para 0username1 dice #ue es re#uerida y #ue tiene restricciones de longitud m!nima y m,ima. -er re#uerida implica #ue se debe ingresar alg5n valor a este campo, de lo contrario, se retornar al usuario un cdigo de error. +a longitud de 0username1 debe ser m!nimo B caracteres y m,imo &C. +os elementos 2arg'4, 2arg&4 y 2arg(4 especifican los parmetros a enviar al mensa/e de error #ue se mostrar al usuario. En general) El elemento 2form ...4 define el con/unto de campos a validar. De este elemento es importante el atributo 0name1 #ue corresponde al nombre del 2form3bean4 en struts3config.,ml
El elemento 2form ...4 puede tener & o mas elementos 2field4. Dada elemento 2field4 tambien tiene su atributo 0name1 cuyo valor corresponde al atributo 0name1 del 2form3 property4. .or e/emplo, la parte del struts3config.,ml #ue se refiere al Aser+oginForm ser!a)
<+orm-7eans> <+orm-7ean name=",ser-ogin"orm" type="org.apache.struts.validator.&ynaValidator"orm"> <+orm-property name="username" type="3ava.lang./tring"/> <+orm-property name="pass0ord" type="3ava.lang./tring"/> </+orm-7ean> </+orm-7eans>
El elemento 2field ...4 corresponde a una propiedad en un ActionForm. +os atributos de este elemento son) E property) nombre de una propiedad en un ActionForm #ue re#uiere validacin E depends) lista de reglas de validacin #ue se deben aplicar a este campo (delimitadas por comas . 7odas las reglas de validacin deben ser e,itosas para #ue la validacin del campo sea e,itosa. +a sinta,is de 2field4 dice #ue puede tener elementos opcionales como 2msg4, 2arg'4, 2arg&4, 2arg(4, 2argB4 F y cero o mas elementos 2var4. El elemento 2msg ...4 permite especificar un mensa/e de error alternativo para un elemento field. +a sinta,is de msg es) 2msg name>1..1 %ey>1...1 resource>1...1G4 donde name especifica la regla con la cual se debe usar el mensa/e (debe ser una de las definidas en validation3rules.,ml F %ey especifica la llave del resource bundle #ue se aadir al ActionError si la validacin falla y resource #ue si se establece en falso (false "ace #ue el valor del %ey se interprete como un literal de string o en verdadero (true "ace #ue el valor del %ey efectivamente sea una llave del resource bundle. .or e/emplo,
<msg name="re:uired" 4ey="userlogin.uPass0ord.re:uired" resource="true"/>
El elemento 2arg' ...4 (y 2arg&4, 2arg(4, 2argB4 son usados para pasar valores adicionales al mensa/e de error. Es decir, 2arg'4 es el primer parametro y 2arg&4 el segundo #ue se envia al mensa/e, y as! sucesivamente. <ecuerde #ue los argumentos de los mensa/es (display.pass$ord y display.username, en el e/emplo y los mensa/es (userlogin.u.ass$ord.re#uired , en el e/emplo #ue no se #uieren tomar como literales se deben copiar al resource bundle de su aplicacin. El elemento 2var ...4 se usa para establecer parmetros #ue el campo pueda re#uerir para pasar la validacin como por e/emplo los valores m!nimo y m,imo
de un rango en una validacin de rangos. +os referencian los elementos 2arg,4 usando la sinta,is H?var)var3name@
6ote el tipo del form (org.apac"e.struts.validator.DynaIalidatorForm #uiere decir #ue usa DynaIalidatorForm como validador. ". #sta'lecer validate()true) en los action mappings
<action path="/user-ogin" type="co.edu.uniandes.changeset.0e7.pro3ect.action.,ser-ogin.ction" name=",ser-ogin"orm" scope="session" input=".tile.general.login.load" validate = "true"> <+or0ard name="success" path=".tile.general.login.success"/>
El valor de input es tambin importante por#ue es a la pgina #ue vuelve una ve8 se "a violado alguna de las validaciones, es decir, es el lugar donde se muestran los mensa/es de error