Как я могу сказать Struts2 не проверять форму при первом ее отображении? - PullRequest
11 голосов
/ 01 ноября 2010

Я сейчас пытаюсь изучить Struts2.

Я создал форму, действие для ее обработки, XML для ее проверки и действия в struts.xml.

Каждый раз, когда форма отображается, даже в первый раз, Struts2 пытается ее проверить, поэтому ошибки отображаются до того, как пользователь сможет ее заполнить.

Вот соответствующий код:

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


Что мне нужно сделать или изменить, чтобы получить распорки для отображения формы в первый раз, не жалуясь навсе пустые поля?

Ответы [ 2 ]

13 голосов
/ 30 декабря 2011

Обходной путь @SkipValidation сделает это, но проверка Struts уже имеет встроенные правила о том, когда он будет запущен (или нет) - лучше изучить правила, чтобы вам не требовалась дополнительная настройка.Также стоит учиться, чтобы вы не смущались, когда проверка не запускается, когда вам это нужно ...

Итак, короткий ответ: если вы измените это

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

к этому

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

(обратите внимание на параметр метода) - это решит проблему (также реализуйте метод в вашем классе действий).

Длинный ответ: открытоstruts-default.xml, в корне JAR-файла struts-core и просматривайте его.Валидация обрабатывается перехватчиком «validation».Затем есть еще один перехватчик, называемый «рабочий процесс», который автоматически отображает результат «ввода» в случае неудачной проверки, поэтому посмотрите на них вместе.

Найдите, и вы увидите следующее:

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

ExcludeMethods относится к параметру метода действия и предназначен именно для того, что вы пытаетесь сделать.

Вы также можете настроить свой собственный стек перехватчиков (смоделированный по умолчанию или в одном из других примеров) иопределить другие исключенные методы.Подстановочные знаки поддерживаются в именах.

13 голосов
/ 01 ноября 2010

Да, я знаю эту проблему.Обычно я использую следующие обходные пути.

Пометить execute с org.apache.struts2.interceptor.validation.SkipValidation

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

Так что первый проход будет игнорировать метод проверкиНо вход будет проверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...