Struts 2中特定字段的手动验证

5
例如,我有一个名为UsersActionAction类,其中包含一些方法,例如: loginlogoutregister等等。
我编写了以下validate()方法:
@Override
public void validate() {
    if ("".equals(username)) {
        addFieldError("username", getText("username.required"));
    }
    if ("".equals(email)) {
        addFieldError("email", getText("email.required"));
    } else if (!Utils.isValidEmail(email)) {
        addFieldError("email", getText("invalid.email.address"));
    }
    if ("".equals(phone)) {
        addFieldError("phone", getText("phone.required"));
    }
    if ("".equals(password)) {
        addFieldError("password", getText("password.required"));
    }
}

问题在于此解决方案仅在调用注册操作时有效,无论如何,它在登录或注销时都不起作用,因为它将检查字段是否不为空或电子邮件是否正确,并始终会给出错误。好的,注销的解决方案是在其上方添加@SkipValidation注释,但我不知道如何告诉它登录只有2个字段usernamepassword,并且不需要检查emailphone。我不想为每个操作编写一个Action类,因为Struts 2的目的不是这样做。
2个回答

6
创建validateMethodName方法,其中methodName是方法的名称,例如:
validateLogin() { ... }

否则,请为您的validate方法提供某种形式的上下文信息。

我尝试使用validate_methodName,但它没有通过。你所说的“为您的验证方法提供某种上下文信息”是什么意思? - Ferrago
@Ferrago 抱歉,应该是 validateLogin。不过为什么不使用 XML 进行简单的验证呢? - Dave Newton
谢谢,现在它可以工作了。因为我需要更快的解决方案,我认为 XML 更耗时,你不这么认为吗?无论如何,在那之前我没有使用任何框架进行验证(只是一些手动的“验证”),我最近开始使用验证框架,所以我对它没有太多经验。 - Ferrago
@Ferrago 我对哪个更好/更差持中立态度。简单的XML验证的好处是它们可以用来驱动客户端验证,尽管并非所有验证器都被默认支持。 - Dave Newton
如果客户端禁用了JS呢? - Ferrago
@Ferrago 那显然是行不通的吧?验证必须在服务器端进行,但大多数人这些天都没有关闭JS,因为那会导致可怕的UX。 - Dave Newton

2

使用注解,在你的操作方法 login 上加上注解:

@Action(value="login", results = {
  @Result(name="input", location = "/login.jsp")
},interceptorRefs = @InterceptorRef(value="defaultStack", params = {"validation.validateAnnotatedMethodOnly", "true"}))
@Validations(requiredFields = {
  @RequiredFieldValidator(type = ValidatorType.FIELD, fieldName = "username", message = "${getText("username.required")}"),
  @RequiredFieldValidator(type = ValidatorType.FIELD, fieldName = "password", message = "${getText("password.required")}")
})

这将只验证用户名密码字段。其他操作方法类似。

参考资料:


抱歉,但我根本不使用注释,@SkipValidation参数是用于基于xml的配置的。 - Ferrago
你错了,它不是一个参数,而是一个注解。 - Roman C
好的,谢谢。但是无论如何,我不使用基于注释的配置,而是使用基于XML的配置。 - Ferrago
好的,我会给你一些参考资料,帮助你将它重写为XML格式。 - Roman C
感谢你的时间,无论如何@Dave Newton的答案对我来说是最好的,我感激你的帮助。 - Ferrago

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接