为什么我的 requestDispatcher.forward(/index.jsp) 没有转发并且我没有收到错误?

问题描述

当我的 Servlet 使用 Requestdispatcher.forward 时没有任何反应

我的 servlet:

    request.setAttribute("mB",mB);
    
    Requestdispatcher rd = request.getRequestdispatcher("/index.jsp");
    try {
        rd.forward(request,response);
    } catch (servletexception|IOException e) {
        e.printstacktrace();
    }

文件 index.jsp 在我的 WebContent 文件夹中,但是当我调用 Servlet 时没有转发 index.jsp

我的项目结构:

我的 web.xml:

<servlet>
    <servlet-name>Servlet</servlet-name>
    <servlet-class>logic.Servlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Servlet</servlet-name>
    <url-pattern>/servlet</url-pattern>
</servlet-mapping>

我该如何解决这个问题? 如何从 forward 错误获取信息?我尝试调试,发现 rdrequestURI 值与 MyProject/index.jsp 一致,这是我想要的 URI。

编辑: 我的 Servlet 是由 JavaScript 页面调用的,而不是我首先说的。 这是js函数

function onSignIn(googleUser) {
    var xhr = new XMLHttpRequest();
    xhr.open('POST','/MyProject/servlet');
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    xhr.send('idtoken=' + id_token + '&page=' + window.location.href);
}

编辑 2: 我认为问题在于我用来调用 js 文件的 Google 登录按钮。

<div class="googleLogin" id="signin-container">
    <div class="g-signin2" data-onsuccess="onSignIn"></div> 
</div>
<div class="googlelogout" id="signout-container">
    <h4 class="font"><a href="#" onclick="signOut();">Sign out</a></h4>
</div> 

解决方法

编辑:您应该提到您正在使用 AJAX 来调用您的 servlet。

根据您对问题所做的编辑,您似乎没有对从服务器获得的响应执行任何操作。 AJAX 请求是异步的并在后台进行。页面不会刷新以获取响应。您会收到有关 AJAX 连接的响应。响应会触发各种事件,您需要使用 onload 事件接收响应并对其进行处理。

查看 this example,它向您展示了如何使用 XMLHttpRequest 处理来自服务器的响应。

此外,正如重复中的问题所示,使用 JQuery 而不是更底层的 XMLHttpRequest 对象通常很有用。

编辑前回答:如果转发到 JSP 时没有任何反应,则很可能意味着转发出错(可能是 JSP 中的某些语法错误或其他原因)。

有问题的代码是这样的:

try {
    rd.forward(request,response);
} catch (ServletException|IOException e) {
    e.printStackTrace();
}

如果您在这里遇到异常,它只是由服务器记录,那么您的 servlet 中不会发生任何事情。您应该检查服务器日志。

查看错误的最快方法是删除 try-catch 并让服务器在您的浏览器页面中生成错误消息。你基本上只做这段代码,没有 try-catch:

rd.forward(request,response);

这样你就可以真正看到发生了什么。捕获这样的异常并将其写入标准输出无论如何都是不好的做法,您不应该这样做。