虽然JSP中的循环执行javascript无法正常工作?

时间:2013-08-26 09:47:36

标签: java apache jsp tomcat load-balancing

如果我遗漏了任何内容,请不要犹豫,编辑问题或询问更多详细信息。

我知道在Scriptlets中使用JSP是不好的。

但我被分配来维护现有的JAVA project,这只是仅使用JSPservlets(无框架)构建的。

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

该应用程序可以正常运行load balancing。当我使用load balancing实现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在循环中失败了。

SysOut()有效,因为控制台中每都会打印更新后的内容。

但同样的应用工作没有load balancing(只有一个tomcat)。

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

2 个答案:

答案 0 :(得分:3)

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

您需要编写一个Java脚本方法,该方法在某些时候会进行一次更新。 Check this thread使用Javascript编写相同的逻辑

答案 1 :(得分:0)

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

作为一个例子,该循环正在做的是将无限广告写入响应:

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

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

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

您应该将这些调用移到客户端,并使用setTimeout()之类的客户端机制安排执行,就像@sanbhat在他的回答中所建议的那样。