2010-11-01 11 views
11

Attualmente sto cercando di imparare Struts2.Come posso dire a Struts2 di non convalidare un modulo la prima volta che viene visualizzato?

Ho creato un modulo, un'azione per elaborarlo, un XML per convalidarlo e azioni in struts.xml.

Ogni volta che il modulo viene visualizzato, anche la prima volta, Struts2 tenta di convalidare, quindi gli errori vengono visualizzati prima che l'utente abbia la possibilità di completarlo.

Ecco il codice rilevante:

<!-- /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> 


Cosa devo fare o modificare per ottenere puntoni per mostrare il modulo la prima volta senza lamentarsi di tutti i campi vuoti?

+0

Penso che la mia risposta da http://stackoverflow.com/questions/12765997/struts2-disable-validation-on-page-load/16471262#16471262 potrebbe aiutarti. – Trincoluctor

risposta

13

Sì, conosco questo problema. Di solito sto usando il seguente work-around.

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

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

Quindi primo passaggio ignorerà metodo di convalida. Ma l'input sarà convalidato.

+0

Cheers! Ha funzionato. :-) –

13

Il workaround di @SkipValidation lo farà, ma la convalida di Struts ha già regole incorporate su quando verrà eseguito (o meno) - è meglio imparare le regole in modo da non aver bisogno della configurazione extra. E 'anche la pena di imparare, quindi non si sono confusi quando la convalida non lo fa corsa quando serve ...

Quindi, risposta breve: se si modifica questa

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

a questo

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

(notare il parametro metodo) - risolverà il problema (implementare il metodo anche nella classe di azione).

Risposta lunga: Open puntoni-default.xml, alla radice del file JAR puntoni-core e navigare intorno. La convalida viene gestita dall'intercettatore di "convalida". Poi c'è un altro intercettatore chiamato "flusso di lavoro" che gestisce automaticamente il risultato "input" se la validazione fallisce, quindi guardateli insieme.

Trova e vedrete questo:

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

I excludeMethods si riferisce al parametro metodo di azione, ed è esattamente quello che stai cercando di fare.

È anche possibile impostare il proprio stack di interceptor (sul modello di default, o uno degli altri esempi) e definire altri metodi esclusi.I caratteri jolly sono supportati nei nomi.

Problemi correlati