如何在用户提交内容时验证表单(使用Struts2)

时间:2010-09-12 12:49:49

标签: validation struts2

我正在开发一个非常简单的Struts2应用程序,我得到这个奇怪的(并且很容易解决,我确定)问题:

当我访问directoly到登录网址时,会显示包含以下错误的登录表单(用户名和密码文本字段):

Name field is required
Password is required

该字段为空,因为这是用户第一次进入该字段,所以我想告诉Struts2验证系统不要验证,除非用户使用用户名和密码提交登录表单。我敢肯定我会忽略或伪造一些东西。

Login.java操作代码:

package actions.access;

import actions.base.BaseAction;
import data.Webuser;

public class Login extends BaseAction {

    private Webuser user;

    public String execute() {
        if (user != null) {
            session = this.getSession();
            if (session.get("user-logged") == null ) {
                session.put("user-logged", user.getId());
            }
        }
        return SUCCESS;
    }

    public void validate() {
        if (user != null) {
            Webuser realUser = services.getWebuserByNickname(user.getNickname());
            if (realUser.getPass().equals(user.getPass())) {
                user.setId(realUser.getId());
            } else {
                addFieldError("user.nickname", "Nickname or password are wrong");
            }
        }
    }

    public Webuser getUser() {
        return user;
    }


    public void setUser(Webuser user) {
        this.user = user;
    }

}

Login-validation.xml代码:

<field name="user.nickname">
    <field-validator type="requiredstring">
        <param name="trim">true</param>
        <message>Login name is required</message>
    </field-validator>
</field>

<field name="user.pass">
    <field-validator type="requiredstring">
        <param name="trim">true</param>
        <message>Password is required</message>
    </field-validator>
</field>

任何形式的帮助将不胜感激。 提前谢谢。

4 个答案:

答案 0 :(得分:1)

您要找的是使用相同的操作来显示表单,然后(提交后)处理表单。

public class LoginAction {
    @SkipValidation
    public String execute() throws Exception {
        return INPUT; // shows the form
    }

    public void validate() {
        // do your validations here...
    }

    public String submit() throws Exception {
        // process the form
        // redirect somewhere
    }
}

您的表单应提交“login!submit”(即动态方法调用,它会调用您的submit()方法)。您不需要为此使用两个操作。

答案 1 :(得分:0)

你需要两个动作。

  1. 您的登录操作会重定向到您的login.jsp。

  2. 处理登录过程的LoginSubmit Action。

  3. 对于第二个,您可以定义验证。

答案 2 :(得分:0)

您需要一个重定向到login.jsp的操作和另一个处理Login进程和验证的操作。 在第一个动作中,不要写任何东西,只需设置result = success。

public class IndexAction extends ActionSupport
{


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

Struts.xml中的条目如下:

<action name="login" class="com.test.web.LoginAction">
<result name="input">/pages/login.jsp</result>
    <result name="success" >/pages/welcome.jsp</result>    
</action>
<action name="index" class="com.test.web.IndexAction">
    <result name="success">/pages/login.jsp</result>
</action>

答案 3 :(得分:0)

避免此问题的一种方法是,在您的web.xml文件中有一个欢迎文件列表条目。这应该指向您的登录页面。一旦你启动你的应用程序,这个登录页面就会打开,不做任何动作和验证。

<welcome-file-list>
    <welcome-file>Login.jsp</welcome-file>
</welcome-file-list>

启动服务器后,您可以通过以下格式提供网址来访问您的应用程序

http://localhost:8080/ApplicationContext
这里8080是默认的HTTP端口,在你的情况下它可以是不同的 ApplicationContext-是应用程序的上下文。

我认为其他事情应该可以正常工作。