基于Tomcat6的comet风格的web应用中的一点问题

问题描述

在网上查找了一些资料后尝试着自己写了下comet的东西,因为对tomcat比较熟悉,而且据说tomcat6对comet是支持的,所以就基于tomcat6按照网上查找的资料写了点,这里我用的是tomcat6.0.26;大概的意思就是现在有一个实现了org.apache.catalina.CometProcessor接口的Sevlets,不是使用平常的服务方法,就是处理请求不是通过doGet()或doPost(),而是通过CometProcessor的event(),这里就出现了一个问题,当我在js中发出请求后,用firebug进行调试报出的错误是“405MethodNotAllowed”,而如果还是用doGet()或doPost()来处理请求又是正常的了servlet的代码:publicclassWeatherServletextendsHttpServletimplementsCometProcessor{privatestaticfinallongserialVersionUID=1L;privateMessageSendermessageSender=null;privatestaticfinalIntegerTIMEOUT=60*1000;@Overridepublicvoiddestroy(){messageSender.stop();messageSender=null;}@Overridepublicvoidinit()throwsServletException{messageSender=newMessageSender();ThreadmessageSenderThread=newThread(messageSender,"MessageSender["+getServletContext().getContextPath()+"]");messageSenderThread.setDaemon(true);messageSenderThread.start();}@Overridepublicvoidevent(finalCometEventevent)throwsIOException,ServletException{System.out.println("Comet!!!!!");HttpServletRequestrequest=event.getHttpServletRequest();HttpServletResponseresponse=event.getHttpServletResponse();if(event.getEventType()==CometEvent.EventType.BEGIN){request.setAttribute("org.apache.tomcat.comet.timeout",TIMEOUT);log("Beginforsession:"+request.getSession(true).getId());//使用一个MessageSender类发送数据messageSender.setConnection(response);Weathermanweatherman=newWeatherman();weatherman.start();}elseif(event.getEventType()==CometEvent.EventType.ERROR){log("Errorforsession:"+request.getSession(true).getId());event.close();}elseif(event.getEventType()==CometEvent.EventType.END){log("Endforsession:"+request.getSession(true).getId());event.close();}elseif(event.getEventType()==CometEvent.EventType.READ){thrownewUnsupportedOperationException("Thisservletdoesnotacceptdata");}}privateclassWeatherman{publicvoidstart(){Runnabler=newRunnable(){@SuppressWarnings("unchecked")publicvoidrun(){while(true){try{//这里做些事情Thread.sleep(30000L);}catch(Exceptione){//justeatit,eatitSystem.out.println("justeatit,eatit");}}}};Threadt=newThread(r);t.start();}}privateclassMessageSenderimplementsRunnable{protectedbooleanrunning=true;protectedfinalArrayList<String>messages=newArrayList<String>();privateServletResponseconnection;privatesynchronizedvoidsetConnection(ServletResponseconnection){this.connection=connection;notify();}publicvoidsend(Stringmessage){synchronized(messages){messages.add(message);log("Messageadded#messages="+messages.size());messages.notify();}}publicvoidstop(){running=false;}publicvoidrun(){while(running){if(messages.size()==0){try{synchronized(messages){messages.wait();}}catch(InterruptedExceptione){//Ignore}}String[]pendingMessages=null;synchronized(messages){pendingMessages=messages.toArray(newString[0]);messages.clear();}try{if(connection==null){try{synchronized(this){wait();}}catch(InterruptedExceptione){//Ignore}}PrintWriterwriter=connection.getWriter();for(intj=0;j<pendingMessages.length;j++){finalStringforecast=pendingMessages[j]+"<br>";writer.println(forecast);log("Writing:"+forecast);}writer.flush();writer.close();connection=null;log("Closingconnection");}catch(IOExceptione){log("IOExeptionsendingmessage",e);}}}}}

js中的代码:functiongo(){varurl="/webChat/Weather";varxmlhttp=DefXmlHttp();xmlhttp.open("post",url,true);xmlhttp.onreadystatechange=function(){if(xmlhttp.readyState==4){if(xmlhttp.status==200){if(xmlhttp.responseText){document.getElementById("forecasts").innerHTML=xmlhttp.responseText;}}go();}};xmlhttp.send(null);}

这里面的DefXmlHttp是另外封装的ajax请求请高手帮看看这问题是出在了什么地方,不胜感激!~~~

解决方案

解决方案二:
该回复于2011-03-03 15:14:17被版主删除

时间: 2024-10-04 10:34:18

基于Tomcat6的comet风格的web应用中的一点问题的相关文章

使用Java实现类似Comet风格的web app_java

开始    在本文中,我将展示如何使用各种不同的 Java 技术构建一些简单的 Comet 风格的 Web 应用程序.读者对 Java Servlet.Ajax 和 JavaScript 应该有一定的了解.我们将考察 Tomcat 和 Jetty 中一些支持 Comet 的特性,因此需要使用这两个产品的最新版本.本文使用 Tomcat 6.0.14 和 Jetty 6.1.14.另外还需要一个支持 Java 5 或更高版本的 JDK.本文使用 JDK 1.5.0-16.此外还需要看看 Jetty

XML在Web应用中的优势体现

Web 的开始阶段是简单的网站(信息中介和信息发布的平台),随着Internet 和Intranent.Extranet的快速发展而发展成为各种应用的主要平台.Web在商业 .工业.银行.财政.教育.政府等领域产生了深远影响,这得益于Web标准化. 松散耦合.语言中立.平台无关性.开放性等特性的服务.Web服务需要XML(可 扩展标记语言).SOAP(简单对象访问协议.WSDL(Web服务描述语言)和UDDL( 统一描述.发现和集成协议)四大技术标准的支持.其中UDDI.SOAP和WSDL基于

使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)

原文:使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[五]--在Web Api中实现Http方法(Put,Post,Delete) 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我们对资源的CRUD操作都是通过相应的Http方法来实现--Post(新增),Put(修改),Delete(删除),Get(查询).查询在前几章我们已经实现了,本章就在我们的案列(CourseController)

用ASP.NET 2.0实现AJAX风格的Web开发

ajax|asp.net|web 提要 在过去的几个月中,基于AJAX技术开发高度交互的Web应用程序的设计模式迅速流行开来.现在,具有高度可配置性的Web应用程序,例如Google Maps和A9,都在综合利用这些技术来创造丰富的客户端用户体验.其实,结合AJAX技术进行Web开发并非最近的研究成果,只不过这些技术一直以来不断得到持续更新和改进. 本文中我有三个目的.首先,我想提供一个AJAX风格应用程序的高级概述.其次,我想详细地描述ASP.NET 2.0的异步回调机制.最后,我想对构建AJ

使用WCF的Web编程模型开发REST风格的Web Service

WCF中的Web编程模型提供了一种以REST风格来设计Web Service的功能,它不同于以往基于SOAP或者WS-*规范的Web Service,而是以URI和http协议为中心的.对于操作的每一个资源有唯一的标志符,而利用不同的http动作(例如GET,POST,PUT,DELETE)来对这些资源进行相应的操作.同时该模型中还提供URI Template,它是用来定义参数化的URI,使URI的某些部分作为参数在服务中使用.可能这样解释十分含糊不清,下面用一个小例子来说明这种Web编程模型.

使用sqlRest将数据库转换为REST风格的Web服务

随着 Web 2.0 的 发展,REST(Representational State Transfer)风格的 Web Service 得到普遍的应用,各种 REST 框架如雨后春笋般发展起来.当我们从事 Web 2.0 的实践时,越来越感觉到服务器端的 REST 服务在应对 MIS 一样的信息系统以及和数据库的交互时还存在很大的问题,比如效率低下,重复编码等. 例如,我们假定如下的场景:需要使用 Web 2.0 的技术来实现一个信息管理系统,这个系统的主要的任务就是对后台数据库的业务数据的操

万分感谢-Rest风格的 web service开发

问题描述 Rest风格的 web service开发 各位大神,现在想开发基于rest风格的web service ,可是刚接触rest,感觉很吃力很痛苦,大神们有什么好的书籍或教程推荐吗?万分感谢!!!! 解决方案 http://www.ruanyifeng.com/blog/2014/05/restful_api.html 解决方案二: 1.首先还是要理解web service是做什么的,在什么样的场景下需要使用. 2.rest框架有很多,可以先找个框架学习下,比如resteasy,做一个简

不容错过的window8 metro UI风格的web资源

中介交易 SEO诊断 淘宝客 云主机 技术大厅 最近微软已经正式发布了windows 8操作系统,window操作系统的风格已经完全改变成了瓦片状的Metro UI. 对于微软来说这是一个巨大的改变,而且所有微软的平台包括,桌面,平板,移动及其网站都使用这个UI风格. Metro UI包含了所有的现代web设计的特点,包括了,简化,基于网格的界面,并且富有连续性. 大家如果有兴趣可以看看这个界面设计说明 (http://msdn.microsoft.com/en-us/library/windo

RESTful风格的Web服务框架 Swagger

Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步.Swagger 让部署管理和使用功能强大的API从未如此简单.   创建工程   1.REST API import javax.ws.rs.Consumes;      import javax.ws.rs.GET;      import javax.ws