2014-12-05 16 views
0

我试图在用户已经登录并且用户错误地输入用户名/密码时在我的应用程序中显示不同的错误。我尝试了很多方法,但都没有工作。我不知道还有什么可以尝试的,或者甚至有可能。我不知道我是否接近解决方案。 我想要做的是:在使用Ajax的JSP中显示特定错误

  • 在请求中设置errorMessage;
  • 在响应中设置SC_INTERNAL_SERVER_ERROR,以便AJAX函数进入**,并且参数中的HTML是具有特定消息的JSP中的HTML。

行动

public class LogUser extends Action { 

    @Override 
    public void execute() throws Exception { 
     ... 
     String pageToGo = this.tryLogUser(username, password); 
     request.getRequestDispatcher(pageToGo).forward(request, response); 
    } 

    private String tryLogUser(String username, String password) throws Exception { 
     String pageToGo = "page/userHome"; 
     ... 
     if(canLog) { 
      ... 
      try { 
       ... 
       Server.getInstance().logIn(user); // Throws an Exception if the User is already logged in. 
       ... 
      } catch (ServerException e) { 
       this.setErrorMessage("That user is already logged in."); 
       pageToGo = "page/error.jsp"; 
      } 
     } else { 
      this.setErrorMessage("User and/or Password are incorrect."); 
      pageToGo = "page/error.jsp"; 
     } 
     return pageToGo; 
    } 

    private void setErrorMessage(String message) { 

     request.setAttribute("errorMessage", message); 
     response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
    } 
} 

JSP

<div class="alert alert-danger"> ${ requestScope.errorMessage } </div> 

AJAX

function showUserHome() { 
    $.post("${ sessionScope.ServletUrl }", $("form#logForm").serialize()) 
    .done(function(html) { 
     $("div#toolbar").load("page/userToolbar.jsp"); 
     $("div#content").html(html); 
    }) 
    .fail(function(html) { 
     $("#result").html(html); 
    }); 
} 

编辑:

虽然试图从浏览器调试它,它就会在$。员额和步骤之后,就跳转到函数结束,跳过.done.fail和页面保持不变。我在RAD控制台或浏览器控制台中没有收到任何错误,除了在Action上设置的SC_INTERNAL_SERVER_ERROR

+1

'不working'不正确的问题描述尤其是当你有2个独立的环境中一起交流。需要更具体的 – charlietfl 2014-12-05 14:33:51

+0

增加了对问题的描述。这是更好还是我应该添加别的东西? – 2014-12-05 14:46:56

+0

从编辑它听起来像你不阻止浏览器默认表单提交和页面正在重新加载 – charlietfl 2014-12-05 14:51:19

回答

0

调用setErrorPage方法不会更改您的pageToGo局部变量,因此总是使用相同的视图。将其更改为类似:

pageToGo = setErrorPage("That user is already logged in."); 

(甚至可以考虑其重命名为getErrorPage

+0

是的。我忘了在复制代码之前检查它。更新了代码,确保变量值已更改。复制错误。 – 2014-12-05 14:49:56

+0

我会在服务器和客户端代码中添加日志,以验证并检查浏览器中的网络选项卡,以检查http post请求是否发送到正确的URL,并且预期的响应是否会返回。 – sodik 2014-12-05 18:58:15