【问题标题】:How to validate a form just if user has submitted something (with Struts2)仅当用户提交了某些内容时如何验证表单(使用 Struts2)
【发布时间】:2010-09-12 12:49:48
【问题描述】:

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

当我直接访问登录 url 时,它显示登录表单(用户名和密码文本字段)并出现以下错误:

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

}

登录验证.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>

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

【问题讨论】:

    标签: validation struts2


    【解决方案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() 方法)。您不需要为此使用两个操作。

    【讨论】:

      【解决方案2】:

      你需要两个动作。

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

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

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

      【讨论】:

      • 你不需要两个动作,使用两个动作会增加不必要的代码。
      【解决方案3】:

      您需要一个重定向到 login.jsp 的操作和另一个处理登录过程和验证的操作。 在第一个动作里面不要写任何东西只是设置结果=成功。

      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>
      

      【讨论】:

      • 使用两个动作会添加不必要的代码并且不能很好地扩展。每次您需要能够处理表单时,您都会得到 2x 动作类。确认!
      【解决方案4】:

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

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

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

      http://localhost:8080/ApplicationContext
      这里 8080 - 是默认 HTTP 端口,在您的情况下可能会有所不同。
      ApplicationContext- 是您的应用程序的上下文。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-02
        • 2013-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多