Validación de formularios en Struts 2

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.

index.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:head/>
<s:form action="Register" >
	<s:textfield label="User Name" key="user.username"/>
	<s:password label="Password" key="user.password" />
	<s:textfield label="Email" key="user.email" />
	<s:submit/>
</s:form>

PacienteAction.java

(el action debe tener los getters y
setters de las propiedades que quiero validar o no se producirá la validación).

PacienteAction-validation.xml (mismo paquete que PacienteAction.java)

<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="user.username">
	<field-validator type="requiredstring"><message key="validateRequired"/></field-validator>
</field>
<field name="user.password">
	<field-validator type="requiredstring"><message key="validateRequired"/></field-validator>
        <field-validator type="stringlength">
		<param name="minLength">6</param>
		<param name="trim">true</param>
		<message key="validatePassword"/>
	</field-validator>
</field>
<field name="user.email">
	<field-validator type="requiredstring"><message key="validateRequired"/></field-validator>
        <field-validator type="email"><message key="validateMail"/></field-validator>
</field>
</validators>

package.properties

validateRequired = ${getText(fieldName)} is required.
validateMail = ${getText(fieldName)} is not in correct format.
validatePassword = ${getText(fieldName)} should be more than 6 character.

struts.xml

<action name="Register" class="com.PacienteAction">
	<result>/index.jsp</result>
	<result name="input">index.jsp</result>
</action>

PacienteAction.java , PacienteAction-validation.xml y package.properties deben estar en el mismo paquete

Nota:
Lo más apropiado es definir los mensajes de los errores de validación en los ficheros package.properties y las etiquetas de los elementos en los ficheros global. Para mostrar los errores de validación no es necesario registrar los ficheros package.properties en el struts.xml. Sin embargo, si queremos elementos del tipo hagan uso de los valores definidos en estos ficheros, si que deberemos definirlos en el struts.xml

Validar un número

index.jsp

<s:head/>
<s:form action="Register" >
	<s:textfield key="numero" /> 
	<s:submit/>
</s:form>
ValidationAction-validation.xml<!DOCTYPE validators PUBLIC
        "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
        "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
	<field name="numero">
		<field-validator type="regex">
		<param name="expression"><![CDATA[^\d*$]]></param>
		<message> Debe ser un entero</message>
		</field-validator>
	</field>
</validators>

package.properties

invalid.fieldvalue.numero = debes introducir un número

Con la línea anterior lo que hacemos es personalizar el mensaje de error Invalid field value for field «numero» que obtendríamos al convertir un texto en un número.

Validación con theme=»simple»

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
    <s:head/>
    <s:fielderror />
<s:form action="Register2" theme="simple" >
    <s:textfield key="user.username"/>
	<s:fielderror fieldName="user.username" /><br/>
    <s:password key="user.password" />
	<s:fielderror fieldName="user.password" /><br/>
    <s:textfield key="user.email"/>
	<s:fielderror fieldName="user.email" /><br/>
    <s:submit/>
</s:form>

Nota:
para quitar las etiquetas ul y li que general el fielderror, habrá que modificar struts2-core-2.0.11.1.jar/template/simple/fielderror.ftl y quitarlas de ahí.

Otras validaciones

<validators>
  <field name="bar">
      <field-validator type="required">
          <message>You must enter a value for bar.</message>
      </field-validator>
      <field-validator type="int">
          <param name="min">6</param>
          <param name="max">10</param>
          <message>bar must be between ${min} and ${max}, current value is ${bar}.</message>
      </field-validator>
  </field>
  <field name="bar2">
      <field-validator type="regex">
          <param name="expression">[0-9],[0-9]</param>
          <message>The value of bar2 must be in the format "x, y", where x and y are between 0 and 9</message>
     </field-validator>
  </field>
  <field name="date">
      <field-validator type="date">
          <param name="min">12/22/2002</param>
          <param name="max">12/25/2002</param>
          <message>The date must be between 12-22-2002 and 12-25-2002.</message>
      </field-validator>
  </field>
  <validator type="expression">
      <param name="expression">foo lt bar </param>
      <message>Foo must be greater than Bar. Foo = ${foo}, Bar = ${bar}.</message>
  </validator>
</validators>

Notas:

  • Documentación de validación
  • Cuando definimos una validación, esta se efectuará para todos los métodos de un action. Si no queremos que la validación se aplique sobre algún método en concreto, podemos usar la directiva:
    @SkipValidation
    precediendo al método.

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.