我有一个 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/