应用comet时,怎么可以从服务器推复杂的内容到浏览器?

liguicheng2006 2009-09-17 04:12:35
请问,在comet时,一般是服务器servlet用一个PrintWriter将要发送的数据传出去,浏览器在javascript脚本里用XMLHttpRequest得到responseText,这个responseText就是服务器发过来的新数据。
而PrintWriter.write()方法的参数类型是char,int,String,想问一下,应该如何将复杂的数据传出去?请大家说一下有什么方法
当然,我也知道可以在服务器端传出数据前将数据组成一串字符,但后面还要在javascript中解析这串字符,因为对javascript不是太熟悉,所以觉得麻烦。
不知道有没有办法在javascript里的responseText传给当前jsp页面里的java代码呢?这就可以在服务器端将数据打包成字节流,再在页面解开(简单查了一下,说javascript是浏览器解析,jsp是服务器编译解析,所以不行,不过未认真想过)
共享网上抄来的代码,本人实验过,是可行的(tomcat 6,firefox打开)。

/**
* Servlet implementation class CometServlet
*/
public class CometServlet extends HttpServlet implements CometProcessor{
private static final long serialVersionUID = 1L;
// private HttpServletRequest request;
private String word = "Hello World" ;


/**
* @see HttpServlet#HttpServlet()
*/
public CometServlet() {
super();
// TODO Auto-generated constructor stub
}

@Override
public void event(CometEvent e) throws IOException, ServletException {
// TODO Auto-p method stub
if(e.getEventType() == EventType.BEGIN){
HttpServletResponse response = e.getHttpServletResponse();
RadomNumber ran = new RadomNumber(response);
new Thread(ran).start();
} else if(e.getEventType() == EventType.READ){

}
}


private class RadomNumber implements Runnable{

private ServletResponse connection;

RadomNumber(ServletResponse response){
this.connection = response;
}

@Override
public void run() {
// TODO Auto-generated method stub

String ran = null;
while (word != null) {
PrintWriter out = null;
ran = String.valueOf(Math.random());
if (!ran.equals(word)) {
try {
out = connection.getWriter();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.write(word);
out.println();
out.flush();
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
word = ran;
}
}
}

}


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
<script>
function storeCaret (textEl) {
if (textEl.createTextRange)
textEl.caretPos = document.selection.createRange().duplicate();
}

var http_request = false;

function CometEx(text) {
if(window.XMLHttpRequest){//Mozilla browser
http_request = new XMLHttpRequest();
if(http_request.overrideMineType){//set MiME type
http_request.overrideMineType('test/xml');
}
}else if(window.ActiveXObject){//IE browser 不过好像没用,不能在IE上显示.
try{
http_request = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try{
http_request = new ActiveXObject(Microsoft.XMLHTTP);
}catch(e){}
}
}
if(!http_request){//can not creat HttpRequest
window.alert("can not creat HttpRequest");
return false;
}
//var request = new XMLHttpRequest();
//request.open("GET", 'http://localhost:8080/MyComet/CometServlet', true);
http_request.open("GET", 'http://localhost:8080/MyComet/CometServlet', true);
http_request.onreadystatechange = function() {
if (http_request.readyState == 3 && http_request.status == 200) {
//alert(request.responseText);
text.value = http_request.responseText;

}
};
http_request.send(null);
}
</script>
</head>
<body>
<FORM NAME="aForm">
<TEXTAREA NAME="aTextArea" ROWS="5" COLS="80" WRAP="soft" ONSELECT="storeCaret(this);" ONCLICK="storeCaret(this);" ONKEYUP="storeCaret(this);"> value: </TEXTAREA>
<BR>
<INPUT TYPE="button" VALUE="Go!" ONCLICK="CometEx(this.form.aTextArea);">
</FORM>

</body>
</html>
...全文
92 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
liguicheng2006 2009-09-18
  • 打赏
  • 举报
回复
那服务器端应该怎么处理?像现在是 out.write(word);只把一个字符串发出来,如果想传出来两个,怎么办?客户端想要将两个字符串分别显示在两个TextArea里又怎么写?
街头小贩 2009-09-17
  • 打赏
  • 举报
回复
如果觉得responseText麻烦可以用responseXML,JSON呀!responseText中适合小量的字符串!过大的字符串就要用responseXML,json
街头小贩 2009-09-17
  • 打赏
  • 举报
回复
不知道有没有办法在javascript里的responseText传给当前jsp页面里的java代码呢?
re:
你是说把responseText里面的字符串当java代码?真晕!你不但没明白ajax,也没白同步的http请求!
Pushlet 是一个开源的 Comet 框架,Pushlet 使用了观察者模式:客户端发送请求,订阅感兴趣的事件;服务器端为每个客户端分配一个会话 ID 作为标记,事件源会把新产生的事件以多播的方式发送到订阅者的事件队列里。 server端向浏览器client发送通知这种通讯模式在J2EE应用中很常见,通常使 Pushlet服务器端Java类UML图 Pushlet服务器端Java类UML图 用采用RMI、CORBA或者自定义TCP/IP信息的applet来实现。这些技术往往由于复杂而产生诸多不利之处:技术难以实现、存在防火墙限制(因为需要打开非HTTP的通讯端口)、需要额外的server开发和维护。并且除了刷新整个页面或者完全采用applet展示内容之外,很难找到别的方法将client端applet的状态和浏览器的页面内容集成在一起。 Pushlet是一种comet实现:在Servlet机制下,数据从server端的Java对象直接送(push)到(动态)HTML页面,而无需任何Java applet或者插件的帮助。它使server端可以周期性地更新client的web页面,这与传统的request/response方式相悖。浏览器client为兼容JavaScript1.4版本以上的浏览器(如Internet Explorer、FireFox),并使用JavaScript/Dynamic HTML特性。而底层实现使用一个servlet通过Http连接到JavaScript所在的浏览器,并将数据送到后者。有关JavaScript版本的知识请参看Mozilla开发中心提供的《JavaScript核心参考》和Stephen Chapman编写的《What Version of Javascript》。 这种机制是轻量级的,它使用server端的servlet连接管理、线程工具、javax.servlet API,并通过标准Java特性中Object的wait()和notify()实现的生产者/消费者机制。原则上,Pushlet框架能够运行在任何支持servlet的server上、防火墙的后面。当在client中使用JavaScript/DHTML,Pushlet提供了通过脚本快速建立应用、使用HTML/CSS特性集成和布局新内容的便利方法。
《JavaScript权威指南(第6版)》主要讲述的内容涵盖JavaScript语言本身,以及Web浏览器所实现的JavaScript API。本书第6版涵盖了HTML5和ECMAScript 5,很多章节完全重写,增加了当今Web开发的最佳实践的内容,新增的章节包括jQuery、服务器端JavaScript、图形编程以及 JavaScript式的面向对象。本书不仅适合初学者系统学习,也适合有经验的 JavaScript 开发者随手翻阅。 David Flanagan是一名程序员,也是一名作家,它的个人网站是 。他在O’Reilly出版的其他畅销书还包括《JavaScript Pocket Reference》、《The Ruby Programming Language》、以及《Java in a Nutshell》。David毕业于麻省理工学院,获得计算机科学与工程学位。他和妻子和孩子一起生活在西雅图和温哥华之间的美国太平洋西北海岸。 目录: 前言 第1章 JavaScript概述 1.1 JavaScript语言核心 1.2 客户端JavaScript 第一部分 JavaScript 语言核心 第2章 词法结构 2.1 字符集 2.2 注释 2.3 直接量 2.4 标识符和保留字 2.5 可选的分号 第3章 类型、值和变量 3.1 数字 3.2 文本 3.3 布尔值 3.4 null和undefined 3.5 全局对象 3.6 包装对象 3.7 不可变的原始值和可变的对象引用 3.8 类型转换 3.9 变量声明 3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 4.10 逻辑表达式 4.11 赋值表达式 4.12 表达式计算 4.13 其他运算符 第5章 语句 5.1 表达式语句 5.2 复合语句和空语句 5.3 声明语句 5.4 条件语句 5.5 循环 5.6 跳转 5.7 其他语句类型 5.8 JavaScript语句小结 第6章 对象 6.1 创建对象 6.2 属性的查询和设置 6.3 删除属性 6.4 检测属性 6.5 枚举属性 6.6 属性getter和setter 6.7 属性的特性 6.8 对象的三个属性 6.9 序列化对象 6.10 对象方法 第7章 数组 7.1 创建数组 7.2 数组元素的读和写 7.3 稀疏数组 7.4 数组长度 7.5 数组元素的添加和删除 7.6 数组遍历 7.7 多维数组 7.8 数组方法 7.9 ECMAScript 5中的数组方法 7.10 数组类型 7.11 类数组对象 7.12 作为数组的字符串 第8章 函数 8.1 函数定义 8.2 函数调用 8.3 函数的实参和形参 8.4 作为值的函数 8.5 作为命名空间的函数 8.6 闭包 8.7 函数属性、方法和构造函数 8.8 函数式编程 第9章 类和模块 9.1 类和原型 9.2 类和构造函数 9.3 JavaScript中Java式的类继承 9.4 类的扩充 9.5 类和类型 9.6 JavaScript中的面向对象技术 9.7 子类 9.8 ECMAScript 5 中的类 9.9 模块 第10章 正则表达式的模式匹配 10.1 正则表达式的定义 10.2 用于模式匹配的String方法 10.3 RegExp对象 第11章 JavaScript的子集和扩展 11.1 JavaScript的子集 11.2 常量和局部变量 11.3 解构赋值 11.4 迭代 11.5 函数简写 11.6 多catch 从句 11.7 E4X: ECMAScript for XML 第12章 服务器端JavaScript 12.1 用Rhino脚本化Java 12.2 用Node实现异步I/O 第二部分 客户端JavaScript 第13章 Web浏览器中的JavaScript 13.1 客户端JavaScript 13.2 在HTML里嵌入JavaScript 13.3 JavaScript程序的执行 13.4 兼容性和互用性 13.5 可访问性 13.6 安全性 13.7 客户端框架 第14章 Window对象 14.1 计器 14.2 浏览器定位和导航 14.3 浏览历史 14.4 浏览器和屏幕信息 14.5 对话框 14.6 错误处理 14.7 作为Window对象属性的文档元素 14.8 多窗口和窗体 第15章 脚本化文档 15.1 DOM概览 15.2 选取文档元素 15.3 文档结构和遍历 15.4 属性 15.5 元素的内容 15.6 创建、插入和删除节点 15.7 例子:生成目录表 15.8 文档和元素的几何形状和滚动 15.9 HTML表单 15.10 其他文档特性 第16章 脚本化CSS 16.1 CSS概览 16.2 重要的CSS属性 16.3 脚本化内联样式 16.4 查询计算出的样式 16.5 脚本化CSS类 16.6 脚本化样式表 第17章 事件处理 17.1 事件类型 17.2 注册事件处理程序 17.3 事件处理程序的调用 17.4 文档加载事件 17.5 鼠标事件 17.6 鼠标滚轮事件 17.7 拖放事件 17.8 文本事件 17.9 键盘事件 第18章 脚本化HTTP 18.1 使用XMLHttpRequest 18.2 借助发送HTTP请求:JSONP 18.3 基于服务器送事件的Comet技术 第19章 jQuery类库 19.1 jQuery基础 19.2 jQuery的getter和setter 19.3 修改文档结构 19.4 使用jQuery处理事件 19.5 动画效果 19.6 jQuery中的Ajax 19.7 工具函数 19.8 jQuery选择器和选取方法 19.9 jQuery的插件扩展 19.10 jQuery UI类库 第20章 客户端存储 20.1 localStorage和sessionStorage 20.2 cookie 20.3 利用IE userData持久化数据 20.4 应用程序存储和离线Web应用 第21章 多媒体和图形编程 21.1 脚本化图片 21.2 脚本化音频和视频 21.3 SVG:可伸缩的矢量图形 21.4 中的图形 第22章 HTML5 API 22.1 地理位置 22.2 历史记录管理 22.3 跨域消息传递 22.4 Web Worker 22.5 类型化数组和ArrayBuffer 22.6 Blob 22.7 文件系统API 22.8 客户端数据库 22.9 Web套接字 第三部分 JavaScript核心参考 JavaScript核心参考 第四部分 客户端JavaScript参考 客户端JavaScript参考

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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