2010-11-01 6 views
11

Obecnie próbuję nauczyć się Struts2.Jak mogę powiedzieć, że Struts2 nie sprawdza poprawności formularza przy pierwszym wyświetleniu?

Utworzono formularz, operację do jego przetworzenia, plik XML do sprawdzenia poprawności oraz działania w pliku struts.xml.

Za każdym razem, gdy formularz wyświetla się, nawet po raz pierwszy, Struts2 próbuje sprawdzić, więc błędy są wyświetlane, zanim użytkownik miał szansę go ukończyć.

Oto odpowiedni kod:

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


Co muszę zrobić lub zmienić, aby uzyskać rozpórki, aby pokazać formularz po raz pierwszy bez narzekania na wszystkie puste pola?

+0

Myślę, że moja odpowiedź z http://stackoverflow.com/questions/12765997/struts2-disable-validation-on-page-load/16471262#16471262 może ci pomóc. – Trincoluctor

Odpowiedz

13

Tak, znam ten problem. Zwykle używam poniższego obejścia.

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

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

Więc pierwszym przejeździe zignoruje metodę sprawdzania poprawności. Ale wejście zostanie zatwierdzone.

+0

Pozdrawiam! Zadziałało. :-) –

13

Sposób obejścia @SkipValidation to zrobi, ale funkcja sprawdzania poprawności Struts już ma wbudowane reguły dotyczące tego, kiedy będzie działać (lub nie) - lepiej poznać zasady, aby nie potrzebować dodatkowej konfiguracji. Warto również nauki, więc nie są zdezorientowani, gdy walidacja nie bieg, kiedy trzeba go ...

Więc krótka odpowiedź: jeśli zmienisz ten

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

tego

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

(patrz parametr metody) - to rozwiąże problem (zaimplementuj metodę również w klasie akcji).

Długa odpowiedź: Otwórz plik struts-default.xml, znajdujący się w katalogu głównym pliku JAR z rozpórkami i przeglądaj. Sprawdzanie poprawności jest obsługiwane przez przechwytywacz "sprawdzania poprawności". Następnie jest inny przechwytywacz o nazwie "workflow", który obsługuje automatycznie pokazujący wynik "wejścia", jeśli walidacja się nie powiedzie, więc spójrz na nie razem.

Find a zobaczysz to:

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

W excludeMethods odnosi się do parametru metody działania, a jest dokładnie to, co próbujesz zrobić.

Można także ustawić własny stos przechwytujący (wzorowany na domyślnym lub jednym z innych przykładów) i zdefiniować inne wykluczone metody.Symbole wieloznaczne są obsługiwane w nazwach.