将表单提交到JSP页面的结果实时动态输出

时间:2017-05-16 18:55:04

标签: java jsp servlets

我在 keyword.jsp

中有此表单

Form

当用户点击提交时,它会调用 KeywordPostServlet.java 进行一些计算。计算完成后,用户将被定向到 followMessage.jsp

enter image description here

根据"要关注的用户数量,从用户点击提交到用户看到结果之间可能需要很长时间。这是 KeywordPostServlet.java

中的计算
for (int i = 0; i < tweets.size(); i++){
    Status s = tweets.get(i);
    twitter.createFriendship(s.getUser().getId());
    msg += i+1 + ". Following @" + s.getUser().getScreenName() + ".<br/>";
}
request.setAttribute("message", msg);
request.getRequestDispatcher("/followMessage.jsp").forward(request, response);

以下是在 followMessage.jsp中显示结果的代码:

<body>
<%
    String msg = (String) request.getAttribute("message");
%>
<%=msg%>
</body>

如何让用户看到他们实时关注的每个人,而不是仅仅点击提交并立即查看结果?

2 个答案:

答案 0 :(得分:1)

您应该能够在服务器端代码中执行此类操作:

package org.myorg.example.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class StreamingServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        response.setHeader("Connection", "keep-alive");
        response.setHeader("Transfer-Encoding", "chunked");
        for (int i = 0; i < 5; i++) {
            String str = "Line " + (i + 1) + "<br/>";
            response.getWriter().write(str);
            response.flushBuffer();
            sleep();
        }
        response.getWriter().write("DONE<br/>");
    }

    private void sleep() {
        try {
            System.out.println("Sleeping");
            Thread.sleep(500);
            System.out.println("Done sleeping");
        } catch (Exception exp) {
            throw new RuntimeException(exp);
        }
    }

}

答案 1 :(得分:0)

您正在使用Twitter API createFrienship

这似乎是一个HTTP请求。因此,您在for循环中触发了太多请求。这需要时间。

尝试在额外的线程中执行此操作。这是一个乐观的策略,但我相信如果你想关注这么多用户,别无他法:

new Thread(new Runnable(){

    @Override
    public void run(){
        // your loop with createFriendship(..)
    }

}).start();

和。如果您是creating a string in a loop

,请使用StringBuilder