如果我遗漏了任何内容,请不要犹豫,编辑问题或询问更多详细信息。
我知道在Scriptlets
中使用JSP
是不好的。
但我被分配来维护现有的JAVA project
,这只是仅使用JSP
和servlets
(无框架)构建的。
我的任务是使用 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)。
希望我们的堆栈用户能帮助我。
答案 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在他的回答中所建议的那样。