300分,不够在加,有请甲路人,版主 等 高手帮忙。

jspxnet 2002-08-27 12:20:41
http://www.csdn.net/expert/topic/972/972117.xml?temp=9.115237E-02

http://www.csdn.net/expert/topic/971/971787.xml?temp=.7595026

——————————————————————————————————
目的!

jsp 中能线程输出 html

我用了两个方法都不行。
1。
while (true)
{
out.println("OK");
Thread.sleep(2000);
}
______________________________________________
2.

<%@ page contentType = "text/html; charSet=gb2312" %>
<%@ page import="javax.servlet.*,java.io.*,java.util.*,java.sql.*"%>
<%
class ChatShow implements Runnable {

int k = 0;
Thread thr = null;
javax.servlet.jsp.JspWriter pw;
public void setOut(JspWriter out)
{
pw = out;
}

public void start()
{
if (thr == null)
{
thr = new Thread(this);
thr.start();
}
}

public void stop()
{
if (thr != null)
{
thr.stop();
thr = null;
}
}
public void run()
{
while(true)
{
try
{
k++;
pw.pw.println(k + "ok");
//希望在网页上输出
} catch (Exception e) {
System.out.println("Error in while:" + e.getMessage());
}
try
{
thr.sleep(2000);
} catch (InterruptedException e){}

}
}
}
ChatShow CS = new ChatShow();
CS.setOut(out);
CS.start();
%>

----------------------------------------------------------------------
只要能什么方法都可以。
...全文
42 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jspxnet 2002-08-27
  • 打赏
  • 举报
回复
就这样用了。 谢谢大家了。
<%
int k = 0;
while (true)
{
k++;
out.print(k + "OK");
out.flush();
Thread.sleep(2000);
}
%>
zhangkai 2002-08-27
  • 打赏
  • 举报
回复
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.Date" %>
<html>
<head>
<title>
</title>
</head>
<body bgcolor="#008080">
<font color="#db1263" size=-1>
<br>
<h2>
<% response.setHeader("refresh","1"); %>
the current time is:<%=new Date()%>;
</h2>
<br>
<br>
</font>
</form>
</body>
</html>

代码实现每一秒叶面刷新一次的功能,既调用response.setHeader(),就可以了。

以上这段从我的一个问题中拷贝出来的,是别人给我的回答。
jspxnet 2002-08-27
  • 打赏
  • 举报
回复
小结一下结果:

out.flush() 能强制刷新;
但只能得到一次结果。
线程是运行的。
如果手动刷新的话就能得到我想要的结果了。
如果让它自动刷新又出了个刷新问题。
qusea 2002-08-27
  • 打赏
  • 举报
回复
要输出到HTML,简单的用out 这个对象是不可以的(因为这个对象似乎是输出到控制台的)。你必须找到可以向页面输出的对象。
Brain 2002-08-27
  • 打赏
  • 举报
回复
没错
out.flush()能强制刷新,不过不能满足楼主的需要,因为这样和一个非线程类的作用是一样。就是一次执行完毕就得到结果。

在线呈中out.flush()只有循环的第一次的内容可以打印,以后的就不行。
所以没什么意义。

不知道楼主用线程输出到client的本意是什么
xmvigour 2002-08-27
  • 打赏
  • 举报
回复
更正“ 而不是jsp页面直接调用的”!
xmvigour 2002-08-27
  • 打赏
  • 举报
回复
jsp叶面---servlet---

其实我们调用的是已经转为对应的servlet 你可以看看你web service底下的工作目录!如tomcat的work!

servlet 本来就已实现线程调用!

jsp只是为了编写方便 而且配合javabean等其它的 比较容易实现mvc!

而是jsp页面直接调用的!
zhangkai 2002-08-27
  • 打赏
  • 举报
回复
to xmvigour(微电--我的女朋友是个小女孩 真郁闷!):
不对,“子线程什么时候处理完毕也就是jsp响应客户端请求的!”!
jsp叶面中启动的子线程已经不由jsp叶面能控制的了,所以不能说“子线程什么时候处理完毕也就是jsp响应客户端请求的!”!
我的个人理解而已。
chl 2002-08-27
  • 打赏
  • 举报
回复
把该类放到<%!%>里面试试
xmvigour 2002-08-27
  • 打赏
  • 举报
回复
子线程什么时候处理完毕也就是jsp响应客户端请求的!
还有就是这个及时不是一定要马上就有东西给你 而是马上就进行响应处理至于返回值不一定就同时瞬间的回传!

而且一个客户请求就是一个子线程!
xmvigour 2002-08-27
  • 打赏
  • 举报
回复
while (true)
{
out.println("OK");
out.flush();//强制刷新 把数据传到客户端 而不用都生成完再传到前台
Thread.sleep(2000);
}
zhangkai 2002-08-27
  • 打赏
  • 举报
回复
to xmvigour(微电--我的女朋友是个小女孩 真郁闷!) :
线程自是可以立即返回,可从线程的原理来说,一个线程启动后,就不再属父线程自由控制了。因此理论上来说,父线程是不知道子线程什么时候处理完毕。
而jsp叶面是需要及时响应客户端请求的,所以我认为其理论相驳。
估计楼主的目的是想把动态的吧数据显示到页面。
我再楼主的另一问题上(http://www.csdn.net/expert/topic/971/971787.xml?temp=.988125)回答了。
我以前也是想这个思路解决问题。后来发现不可行。

jspxnet 2002-08-27
  • 打赏
  • 举报
回复
我感觉也是 jsp页面要求是立即响应客户端请求的,
但我使用 System.out.print("OK");
的确线程是运行了的,但就是不会显示到 ie中,
是不是思路有问题呢???

请: xmvigour(微电--我的女朋友是个小女孩 真郁闷!)
在说一下。

Brain 2002-08-27
  • 打赏
  • 举报
回复
你如果要动态地取值,只能是client端动态地对server进行请求

想做线程动态送出去是不行的

机制是这样

你另外一个帖子,大家都回答了
xmvigour 2002-08-27
  • 打赏
  • 举报
回复
我也不是高手:)

事情没有绝对的 你要看多线程就是 有可能同时为多个客户服务! 线程为什么不确定什么时候有返回值 除了一些需要同步化要注意的 基本是响应一个客户端请求就是一个线程 至于线程调度 jsp的机制应该已经弄好了!

这是我个人的理解!
zhangkai 2002-08-27
  • 打赏
  • 举报
回复
线程是不确定什么时候有返回值得,而jsp页面要求是立即响应客户端请求。
从理论上来说,就有点想驳。

xmvigour(微电--我的女朋友是个小女孩 真郁闷!) 应该是高手啊,问下,我这样的思路对吧?
chl 2002-08-27
  • 打赏
  • 举报
回复
对不起,我刚才还没看清楚题目。
你知道你这样建的ChatShow是方法里面的内部类吗?
jsp的"<%%>"里的所有内容都是在一个输出方法里面的。
方法里面的内部类如果要用到外部的变量是需要把该变量声明为final的,或者你不要把你的类放在"<%%>"中,放到"<%!%>"里面试试。
chl 2002-08-27
  • 打赏
  • 举报
回复
jsp本来就是多线程的啦!
xmvigour 2002-08-27
  • 打赏
  • 举报
回复
out.flush();Flush the stream. If the stream has saved any characters from the various write() methods in a buffer, write them immediately to their intended destination. Then, if that destination is another character or byte stream, flush it. Thus one flush() invocation will flush all the buffers in a chain of Writers and OutputStreams.

The method may be invoked indirectly if the buffer size is exceeded.

Once a stream has been closed, further write() or flush() invocations will cause an IOException to be thrown.

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧