2010-11-01 19 views
11

Actualmente estoy intentando aprender Struts2.¿Cómo puedo decirle a Struts2 que no valide un formulario la primera vez que se muestra?

He creado un formulario, una acción para procesarlo, un XML para validarlo y acciones en struts.xml.

Cada vez que se muestra el formulario, incluso la primera vez, Struts2 intenta validar, por lo que los errores se muestran antes de que el usuario tuviera la oportunidad de completarlo.

Este es el código correspondiente:

<!-- /WebContent/views/user/login.jsp --> 
<?xml version="1.0" encoding="ISO-8859-1" ?> 
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<%@ taglib prefix="s" uri="/struts-tags" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Login Page</title> 
<s:head /> 
</head> 
<body> 
    <h1>Login Page</h1> 
    <s:form action="executeUser"> 
     <s:textfield key="userBean.userName" /> 
     <s:password key="userBean.password" /> 
     <s:submit align="center" /> 
    </s:form> 
</body> 
</html> 

<!-- /src/struts.xml --> 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 

<struts> 

    <constant name="struts.devMode" value="true" /> 

    <package name="overviewofstruts" extends="struts-default"> 
     <action name="loginUser" class="hu.flux.user.LoginUserAction" method="execute"> 
      <result name="input">/views/user/login.jsp</result> 
     </action> 

     <action name="executeUser" class="hu.flux.user.LoginUserAction" method="execute"> 
      <result name="input">/views/user/login.jsp</result> 
      <result name="success">/views/user/login_thankyou.jsp</result> 
     </action> 
    </package> 

</struts> 

// /src/hu/flux/user/LoginUserAction.java 
package hu.flux.user; 
import java.util.Map; 
import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionSupport; 

public class LoginUserAction extends ActionSupport { 

    private User userBean; 
    public void setUserBean(User userBean) { this.userBean = userBean; } 
    public User getUserBean() { return userBean; } 

    public String login() throws Exception { return this.execute(); } 
    public String execute() throws Exception { return SUCCESS; } 
    public String input() throws Exception { return INPUT; } 
} 

<!-- // /src/hu/flux/user/LoginUserAction-validation.xml --> 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE validators PUBLIC 
"-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> 
<validators> 
<validator type="requiredstring"> 
    <param name="fieldname">userBean.userName</param> 
    <message>Username is required.</message> 
</validator> 
<validator type="requiredstring"> 
    <param name="fieldname">userBean.password</param> 
    <message>Password is required.</message> 
</validator> 


¿Qué necesito hacer o cambiar para obtener struts para mostrar el formulario la primera vez sin quejarse de todos los campos en blanco?

+0

Creo que mi respuesta de http://stackoverflow.com/questions/12765997/struts2-disable-validation-on-page-load/16471262#16471262 podría ayudarlo. – Trincoluctor

Respuesta

13

Yee, sé este problema. Usualmente estoy usando la siguiente solución.

Marcos execute con org.apache.struts2.interceptor.validation.SkipValidation

@SkipValidation 
public String execute() throws Exception { return SUCCESS; } 

Así que primero pase ignorará método de validación. Pero la entrada será validada.

+0

¡Salud! Funcionó. :-) –

13

La solución de @SkipValidation lo hará, pero la validación de Struts ya tiene reglas incorporadas sobre cuándo se ejecutará (o no): es mejor aprender las reglas para que no necesite la configuración adicional. Es también digno de aprendizaje, de manera que no se confundan cuando la validación no lo hace de ejecución cuando lo necesite ...

Así, respuesta corta: si cambia este

<action name="loginUser" class="hu.flux.user.LoginUserAction" method="execute"> 

a este

<action name="loginUser" class="hu.flux.user.LoginUserAction" method="input"> 

(observe el parámetro de método) - eso solucionará el problema (implemente el método en su clase de acción también).

Respuesta larga: abra struts-default.xml, en la raíz del archivo struts-core JAR y explore. La validación es manejada por el interceptor de "validación". Luego hay otro interceptor llamado "flujo de trabajo" que se encarga de mostrar automáticamente el resultado de "entrada" si la validación falla, así que mírelos juntos.

Buscar y verá este:

<interceptor-ref name="validation"> 
    <param name="excludeMethods">input,back,cancel,browse</param> 
</interceptor-ref> 
<interceptor-ref name="workflow"> 
    <param name="excludeMethods">input,back,cancel,browse</param> 
</interceptor-ref> 

Los excludeMethods se refiere al parámetro de método de acción, y es exactamente lo que estamos tratando de hacer.

También puede configurar su propia pila de interceptor (modelado en el predeterminado u otro de los ejemplos) y definir otros métodos excluidos.Los comodines son compatibles con los nombres.

Cuestiones relacionadas