javascript - 无法通过getRequestDispatcher转发到jsp页面

标签 javascript java jsp servlets requestdispatcher

我有一个 webservlet,“Home.jsp”将在打开 Web 应用程序时加载,因此它将在 servlet 中调用 doGet 并将其转发到仪表板 jsp 页面

@WebServlet("/Home.jsp")
public class HomeController extends HttpServlet {...
....

request.getRequestDispatcher("central_dashboard.jsp").forward(request,response);

因此,在仪表板页面中,我有一个 javascript 函数,我在其中调用另一个 servlet 页面“Process.do”,问题是调用了 get 方法,并且它没有将页面转发到 getRequestDispatcher 上的“results.jsp”。

//Calling the webservlet from the jsp page

function res_call(d, i) {
    $.ajax({  
        type: "GET",  
        url: "Process.do",                             
      });

}

流程.do

request.getRequestDispatcher("results.jsp").forward(request, response); 

注意:所有jsp文件都在webcontent文件夹下

我在这里阅读了一些帖子,尝试返回webservlet中的函数,但没有用。我不确定问题出在哪里。

<小时/>

发布代码,

   @WebServlet("/Home.jsp")
    public class HomeController extends HttpServlet {
        private static final long serialVersionUID = 1L;

        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                t

ry {
                doProcessRequest(request, response);
            } catch (SQLException | JSONException | ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try {
                doProcessRequest(request, response);
            } catch (SQLException | JSONException | ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

    protected void doProcessRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("name",val);   
        request.getRequestDispatcher("dashboard.jsp").forward(request,response);
    }
}
<小时/>
    @WebServlet("/Process.do")
    public class ProcessController extends HttpServlet {
        private static final long serialVersionUID = 1L;

        /**
         * @see 

HttpServlet#HttpServlet()
     */
    public ProcessController() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            doProcessRequest(request, response);
        } catch (SQLException | JSONException | NumberFormatException | ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            doProcessRequest(request, response);
        } catch (SQLException | JSONException | NumberFormatException | ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    protected void doProcessRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("name",val);   
        request.getRequestDispatcher("results.jsp").forward(request, response);
        return;

    }
}

dashboard.jsp - 从其中包含central.jsp,我将在其中调用js函数,该函数将被调用,并且Process.do - doGet方法将被执行,但results.jsp页面不会被转发/打开。

<!DOCTYPE html>
<meta charset="utf-8">
    <head>
    <title></title>
    </head>
    <body>
    <div class="centraltest">
     <%@ include file="central.jsp"%>
    </div>
    </body>

最佳答案

1) 问题是,尝试理解这样一个事实:当您从 ajax 发送 http 请求时,这意味着您是在单独的线程中发送请求,而不是在主线程中(您发送请求的页面本身)。因此 Servlet 处的重定向不会反射(reflect)在客户端。

为了实现这一点,请将您想要重定向到的 URL 作为对请求的响应发送回,并且在 ajax 的成功方法上只需使用 java 脚本 window.location(URL)

servlet 内部:

JSONObject jobj = new JSONObject();
jobj.put("url","central_dashboard.jsp");
response.getWriter().write(jobj.toString());

在客户端:

function res_call(d, i) {
  $.ajax({
      url: "Process",
      type: "GET",
      dataType : 'json',
      cache: false,
      data: { 'url': 'value' }, 
      success: function(data){
          window.location = data.url;
                }
 });
}

注意:当您通过 AJAX 调用 servlet 时,根据定义,无论服务器发送的 header 如何,您都会停留在同一页面上。

如果您想更改页面,则必须在 $.ajax(..) 调用的成功处理函数中使用 JavaScript 来完成此操作。

您可以读取servlet响应发送的Location响应头并将window.location.href设置为该值,检查其他options用于重定向。

2) 您可以在 Process servlet 的 doGet 方法中使用以下代码作为替代方案。

response.getOutputStream().print("<script> window.location.href='central_dashboard.jsp'; </script>");   
//make sure this is the last line of your program control flow, because from here
//the response will be sent to central_dashboard.jsp

而不是 Process servlet 中的以下代码:

request.getRequestDispatcher("central_dashboard.jsp").forward(request,response);

关于javascript - 无法通过getRequestDispatcher转发到jsp页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39809807/

相关文章:

java - LIbgdx - 为什么 AssetManager 不工作?

java - 如何使用java向json添加数据?

javascript - 如何在对象上使用 reduce

javascript - 使用计时器在 Javascript 中使用参数设置动画

javascript - onclick ("open()") 事件后 html 页面消失

javascript - promise 在返回前不解决

java - 当我尝试在下面的代码中打印为 RSA 生成的公钥和私钥时,我得到了什么?

java - 不是具体类 AndroidManifest

java - 通过 servlet/jsp 从 mysql 数据库中删除数据

java - 在 Eclipse 中部署时需要帮助将子项目链接到主项目