java spring validation jsp struts2

java - Struts2/Spring-execute no se está llamando incluso después de aprobar validate



validation jsp (2)

Estoy teniendo problemas con mi configuración, mi inicio de sesión ha pasado la validación, pero la función de ejecución no se está llamando

LoginAction.java:

@Override public String execute() throws Exception { System.out.println("5"); String username = blogUser.getUsername(); String password = blogUser.getPassword(); blogUser = blogUserService.getUserByLogin(username, password); System.out.println("6"); sessionMap.put(Constants.SESSION_USERNAME, blogUser.getUsername()); System.out.println("7"); sessionMap.put(Constants.SESSION_USERID, blogUser.getUserId()); System.out.println("return:success"); return SUCCESS; } @Override public void validate() { System.out.println("1"); String username = blogUser.getUsername(); String password = blogUser.getPassword(); System.out.println("username:"+username + ", password:"+password); if (username == null & password == null) { System.out.println("22"); addFieldError("blogUser.username",""); } else if (username == null || password == null) { System.out.println("2"); addFieldError("blogUser.username","Invalid Login"); } else if (!blogUserService.checkLogin(username, password)) { System.out.println("3"); addFieldError("blogUser.username","Invalid Login"); } System.out.println("4"); } public String postLogin() throws Exception { System.out.println("77"); return LOGIN; }

struts.xml:

<action name="login" class="loginActionBean" > <result name="input" type="tiles">/login.tiles</result> <result name="none" type="tiles">/login.tiles</result> <result name="login" type="tiles">/login.tiles</result> <result name="success" type="redirectAction">postPreviewAction</result> <result name="error" type="tiles">/login.tiles</result> </action> <action name="doLogin" class="loginActionBean" method="postLogin"> <result name="login" type="tiles">/login.tiles</result> <result name="input" type="redirectAction">login</result> </action>

login.jsp:

<%@ page contentType="text/html; charset=UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <div> <h2>Users Login</h2> <s:form action="login" method="post"> <s:textfield label="Username" name="blogUser.username" /> <s:password label="Password" name="blogUser.password" /> <s:submit value="Login" /> </s:form> </div>

Solo puedo ver "4" impreso (lo que significa que pasó la validación) pero eso es todo, no va a "5"

EDITAR: fragmento de tiles.xml agregado

<definition name="/login.tiles" extends="baseLayout"> <put-attribute name="body" value="/login.jsp" /> </definition>


De la documentación de Struts2 Spring Plugin :

Normalmente, en struts.xml especifica la clase para cada acción. Al utilizar SpringObjectFactory defecto, la infraestructura solicitará a Spring que cree la Acción y las dependencias SpringObjectFactory según lo especificado por el comportamiento predeterminado de autoenlace.

Lo que significa que no necesita crear Spring beans de sus acciones.

Sin embargo, a veces es posible que desees que el bean esté completamente administrado por Spring. Esto es útil, por ejemplo, si desea aplicar tecnologías AOP o Spring más complejas, como Acegi, a sus beans. Para hacer esto, todo lo que tiene que hacer es configurar el bean en Spring applicationContext.xml y luego cambiar el atributo de clase de su `Action en el struts.xml para usar el nombre del bean definido en Spring en lugar del nombre de la clase.

Struts2 en sí mismo crea una nueva instancia de acción para cada solicitud, por lo que las acciones no son simples. Si crea un Spring Bean fuera de acción, entonces déle un scope adecuado (por ejemplo, scope="prototype" ), porque:

Por defecto, un bean será un singleton , a menos que el bean tenga una definición de bean padre, en cuyo caso heredará el alcance del principal.

La declaración de ejemplo loginActionBean :

<bean id="loginActionBean" class="some.package.LoginActionBean" scope="prototype" />


La acción llamada doLogin (debe tener el nombre correcto, como showLogin ) es la acción que muestra la página de inicio de sesión. No debe ser validado porque siempre fallará. Tienes que eliminar esto de la configuración de acción

<result name="input" type="redirectAction">login</result>

Y el método de acción debe excluirse de la validación. Puede configurar el interceptor de validation para excluir este método, pero otra forma de hacerlo es simplemente poner la anotación @SkipValidation en el método.

@SkipValidation public String showLogin() throws Exception { System.out.println("77"); return LOGIN; }

La acción llamada login tiene algunos resultados redundantes que podrían eliminarse

<result name="none" type="tiles">/login.tiles</result> <result name="login" type="tiles">/login.tiles</result> <result name="error" type="tiles">/login.tiles</result>

Nota: esa validación por defecto se invoca en cada método de acción de la clase de acción a menos que se excluya de la validación o no tenga configurado el interceptor de validation .

La configuración final:

<action name="login" class="loginActionBean" > <result name="input" type="tiles">/login.tiles</result> <result type="redirectAction">postPreviewAction</result> </action> <action name="showLogin" class="loginActionBean" method="showLogin"> <result name="login" type="tiles">/login.tiles</result> </action>