如何知道收到请求的类别

时间:2013-01-25 19:29:20

标签: java jsp validation struts2 struts

我的应用程序中有一个login.jsp页面。我正在使用Struts 2和一个简单的validate()方法来验证我的表单。我有两个问题:

    我的表单bean类中的
  1. validate()方法验证表单。即检查空字段等。如果我需要检查我的用户名和密码组合,我应该在validate()内还是在我的操作类中执行此操作?

  2. 如果我在动作类中执行相同的操作,则正确的组合会导致成功页面。我希望错误的组合导致我的JSP页面以及错误消息:“组合错误”。如何在JSP页面中检查请求是否来自动作类,以便它可以打印错误消息“组合不正确”?

3 个答案:

答案 0 :(得分:1)

身份验证属于操作,而非验证,IMO。

可能考虑对字段本身使用XML或注释验证,并将登录尝试放在validate()中,但代码很小,而且我对它很满意方式。

public String execute() {
    if (userService.loginValid(username, password) {
        return SUCCESS;
    }

    addActionError(getText("login.failure"));
    return FAILURE;
}

我会使用框架对动作级别错误消息的支持而不是使用标志(如果我这样做,我不会重复该标志与本地标记),我强烈建议使用某些东西您可以注入以进行实际登录以使测试更容易。

使用validate()方法会让事情变得非常紧张:

public void validate() {
    if (!userService.loginValid(username, password)) {
        addActionError(getText("login.failure"));
    }
}

假设您定义了合理的“输入”和“成功”结果,这可能就是您所需要的。如果查看代码的开发人员熟悉该框架,则validate()版本相对清晰。

如果您对使用XML或注释验证不感兴趣,也可以手动执行此操作。那个肯定是属于validate(),对于像这样的常用实用程序方法,静态导入使代码仍然相对简洁:

public void validate() {
    boolean tryLogin = true;

    if (isBlank(username)) {
        addFieldError("username", getText("login.username.required"));
        tryLogin = false;
    }

    if (isBlank(password)) {
        addFieldError("password", getText("login.password.required"));
        tryLogin = false;
    }

    if (tryLogin && !userService.loginValid(username, password)) {
        addActionError(getText("login.failure"));
    }
}

(我添加了tryLogin标志,以避免看到显然会失败的登录错误消息,尽管这也可以通过其他方式处理。登录后处理省略了。)

答案 1 :(得分:0)

我会说你肯定不想要验证方法中的登录逻辑;这是用于验证数据。

我建议如果您的登录失败,只需在动作上公开数据属性,如:

execute () {

   boolean authenticated = login( getUsername(), getPassword() );
   setLoginValid( authenticated );

   if ( authenticated ) 
      result = SUCCESS;
   else 
      result = FAILURE;

   return result;

}

然后在您的login.jsp中,只需在struts if标记中包含有关错误凭据的消息,并对loginValid属性进行测试。

答案 2 :(得分:0)

验证框架的目的是检查字段值是否有效,以防止在执行操作时出现意外错误。

将验证逻辑与业务逻辑分开是一种很好的做法。身份验证与验证逻辑无关。它是由安全机制提供的单独过程。当然,您可以创建执行身份验证的操作或拦截器,并且可以将其配置为进行验证。

在Struts2中,通过应用validation拦截器更加简化了处理请求的工作的一部分。在更复杂的场景中,身份验证成为业务逻辑的一部分,但验证输入字段的方法会重命名。如果您的操作只是进行身份验证,那么您可能不需要验证来处理身份验证。

关于第二个问题:您需要的只是addActionError(getText("error.key"))使行动无效。然后返回结果<s:actionerror>以显示消息。

更重要的是,如果您决定将其移动到操作,验证逻辑将保持不变。在这种情况下,您唯一需要做的就是删除验证堆栈。此类验证的唯一原因是返回与"input"不同的结果。