JSP 如何知道从哪个类收到请求

nhhxz33t  于 5个月前  发布在  其他
关注(0)|答案(3)|浏览(52)

我的应用程序中有一个login.jsp页面。我使用Struts 2和一个简单的validate()方法来验证我的表单。我有两个问题:
1.我的表单bean类中的validate()方法验证表单。即检查空字段等。如果我需要检查我的用户名和密码组合,我应该在validate()中还是在我的action类中这样做?
1.如果我在我的Action类中做同样的事情,正确的组合会导致成功页面。我希望错误的组合会导致我的JSP页面沿着错误消息:“Incorrect combination”。我如何在JSP页面中检查请求来自action类,以便它可以打印错误消息“Incorrect combination”?

ahy6op9u

ahy6op9u1#

认证属于行动,而不是验证,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标志,以避免看到登录明显失败的错误消息,尽管这也可以用其他方式处理。登录后处理省略了。)

3ks5zfa0

3ks5zfa02#

我会说你肯定不希望在validate方法中使用登录逻辑;那是为了验证数据。
我建议,如果你的登录失败,只需在action上公开一个data属性,比如:

execute () {

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

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

   return result;

}

字符串
然后在login.jsp中,只需在struts if标记中 Package 一条关于错误凭证的消息,并对loginValid属性进行测试。

332nm8kg

332nm8kg3#

验证框架的目的是检查字段值是否有效,以防止在执行操作时出现意外错误。
将验证逻辑与业务逻辑分离是一个很好的做法。身份验证与验证逻辑无关。它是安全机制提供的一个单独的过程。当然,您可以创建执行身份验证的操作或拦截器,并且与任何操作一样,您可以将其配置为验证。
在Struts2中,通过应用validation interceptor作为处理请求的一部分,它甚至更加简化。在更复杂的场景中,身份验证成为业务逻辑的一部分,但验证输入字段的方法重命名相同。如果您的操作只是进行身份验证,那么您可能不需要验证来处理身份验证。
对于你的第二个问题:你所需要的就是addActionError(getText("error.key"))来使操作无效。然后返回到结果,其中<s:actionerror>显示消息。
更重要的是,如果您决定将其移动到action,验证逻辑保持不变。在这种情况下,您唯一需要做的就是删除验证堆栈。这种 * 验证 * 的唯一原因是返回与"input"不同的结果。

相关问题