2

如果我遗漏了什么,请随时编辑问题或询问更多详细信息。

我知道ScriptletsJSP.

但我被指派维护现有的JAVA project,仅使用JSPservlets(无框架)构建。

我的任务是使用Apache HTTP Server为我的应用程序实现负载平衡。

该应用程序可以正常工作 out load balancing。当我实现load balancingusing 时Apache HTTP Server,我遇到了 JSP 的问题。

我会给出一个场景。我的JSP有一个 while 循环,它运行 javascript 来更新内容。

我的 JSP 有,

<%
    String jsPreAppend = "<script language=JavaScript >push('";     
    String jsPostAppend = "')</script> ";   
    String s=null;   
    int i = 0;

       try {
        while (true) {
            System.out.println("count :"+i);
            out.print(jsPreAppend + i + jsPostAppend);        
            out.flush();

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                out.print(jsPreAppend + "InterruptedException: " + e + jsPostAppend);
            }

            i++;

          }
       } catch (Exception e) {
             out.print(jsPreAppend + "Exception: " + e + jsPostAppend);
       }
%> 

我的 JavaScript 有,

 function push(content) {   
         document.getElementById('update').innerHTML = content;
 }

控制台输出将是,

count :1
count :2
count :3
.
.
.
count : n
count :n+1

但是 JSP 中的内容不会更新。我认为javascript在while循环中失败了。

但是SysOut()有效,因为更新的内容将在控制台中每秒钟打印一次。

load balancing但是没有(只有一个tomcat),同样的应用程序工作也很好。

希望我们的堆栈用户能帮助我。

4

2 回答 2

3

当你的 HTML 被渲染时,JSP 就已经被执行了。因此,该代码无法实现您尝试做的事情。

您需要编写一个 Java 脚本方法,该方法有时会进行一些更新。检查此线程以使用 Javascript 编写相同的逻辑

于 2013-08-26T09:51:23.163 回答
0

考虑到while(true)循环将在服务器端执行。此时,响应文档(HTML)正在构建中,客户端还不能解释它。此循环仅将 javascript 调用写入一种缓冲区,响应在发送到客户端之前存储在该缓冲区中。

例如,该循环正在做的是将无限写入响应:

<script language=JavaScript >push('1')')</script>
...
<script language=JavaScript >push('n')')</script>

每一秒都在写入每一行的事实是无关紧要的。您会在正确的时间看到标准输出中的跟踪,因为那是在服务器上执行的。

这将使请求陷入无限循环,除非有某种异常。即使循环在某个时刻结束,并且请求完成了处理,当这些语句将被客户端执行时,它们也会被顺序执行而没有任何延迟。

setTimeout()您应该将这些调用移至客户端,并使用诸如@sanbhat 在他的回答中建议的客户端机制安排其执行。

于 2013-08-26T10:49:12.247 回答