【问题标题】:Unable to forward to jsp page by getRequestDispatcher无法通过 getRequestDispatcher 转发到 jsp 页面
【发布时间】:2016-10-01 17:58:04
【问题描述】:

我有一个 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 方法,它没有将页面转发到“results.jsp”在 getRequestDispatcher 上。

//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>

【问题讨论】:

  • 请贴出你的代码,否则盲目猜测工作量很大,不太可能有帮助
  • 请添加异常堆栈。
  • @NiklasP,贴出代码
  • @RohitGaikwad,我没有收到任何错误,页面保持静止

标签: javascript java jsp servlets requestdispatcher


【解决方案1】:

1) 问题是,当您从 ajax 发送 http 请求时,这意味着您是在单独的线程中发送请求,而不是在主线程(页面本身从您发送请求的位置)。因此 servlet 的重定向不会反映在客户端。

为了实现这一点,发回你想要重定向到的 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 时,根据定义,无论服务器发送的标头如何,您都停留在同一页面上。

如果你想改变页面,你必须使用javascript,在$.ajax(..)调用的success处理函数中。

您可以读取 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);

【讨论】:

  • 现在试过了,没有转发到页面,也没有错误日志可以追踪
  • 在 Process.do 之前 request.getRequestDispatcher("results.jsp").forward(request, response);添加一个打印语句,让我知道它是否打印了一些东西。
  • 是的,它的印刷!我已经尝试并确认该方法正在执行。
  • urlToRedirect 到 jobj.put("url",urlToRedirect );是这个吗?我已经在 /Home servlet 和 getDispatcher 上方添加了这个,但没有运气
  • 查看更新的JS代码并注意。您需要调试JS并检查ajax调用的“数据”字段中设置的内容,以及处理程序是否进入成功函数,稍后是window.location的值是否正确。
猜你喜欢
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
相关资源
最近更新 更多