如何从Servlet向JSP发送数据?

pus*_*hya 2 java jsp servlets

我正在开发一个只有一个页面(index.jsp)的项目,并且正在发送Ajax请求的页面的初始加载以及检索JSON数据.发送到我的Servlet和Servlet的AJAX调用返回JSON数据,我只有一个Servlet.我正在尝试将一些数据发送到我的JSP页面来填充,所以这就是我编写Servlet的方式......

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out =response.getWriter();
    String queryString = request.getQueryString();
            ResourceBundle props = ResourceBundle.getBundle("jira");

    XmlMerge xmlMerge = new XmlMerge();
    String mergeFiles=xmlMerge.getJsonData();

    out.println(mergeFiles);
    out.close();
         //Debug Statement
        System.out.println(xmlMerge.getTodo());
        // *THIS IS THE WAY I AM SEND DATA TO JSP PAGE.*
    request.setAttribute("todo", xmlMerge.getTodo());
    request.getRequestDispatcher("/index.jsp").forward(request, response);
}
Run Code Online (Sandbox Code Playgroud)

在我的index.jsp中

<%=(String)request.getAttribute("todo")%>
Run Code Online (Sandbox Code Playgroud)

我想输出结果.

出了什么问题?

por*_*ida 6

我刚刚执行了此更改,它显示了您需要的内容:

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html");
    request.setAttribute("todo", "10");
    request.getRequestDispatcher("/index.jsp").forward(request, response);
  }
Run Code Online (Sandbox Code Playgroud)

这是生成的index.jsp:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<%=(String)request.getAttribute("todo")%>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

你的getTodo()可能有问题..我不知道它是如何工作的但也许这可能会有所帮助:

...
XmlMerge xmlMerge = new XmlMerge();
String todo = xmlMerge.getTodo();
...
request.setAttribute("todo", todo);
Run Code Online (Sandbox Code Playgroud)

更新:

PrintWriter out = response.getWriter();
out.println(...);
out.close();
Run Code Online (Sandbox Code Playgroud)

这是你的问题......你正在获取资源并关闭它.这可能会导致非法状态异常问题.

您"不需要"调度程序到index.jsp ..如果您不使用调度程序但是想要渲染页面,则可以使用以下内容:

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    response.setContentType("text/html");
    response.getWriter().write("<html><body>"+getSomething()+"</body></html>");
  }
Run Code Online (Sandbox Code Playgroud)

为什么index.jsp不是默认调用?因为甚至可能不存在index.jsp文件,它可能是对另一个servlet的调用.您可以使用将调用映射到index.jsp的配置映射到servlet.

http://tutorials.jenkov.com/java-servlets/web-xml.html

我仍然不知道使用out.println的目的是什么,但如果你想让它显示在jsp中,你可以将它作为参数发送为"todo":

 request.setAttribute("mergeFiles", mergeFiles);
Run Code Online (Sandbox Code Playgroud)

然后将其作为"todo"在jsp中打印出来.