Java Tomcat Comets应用程序返回.jsp页面而不是天气数据

Java Tomcat Comets应用程序返回.jsp页面而不是天气数据,java,ajax,tomcat,callback,comet,Java,Ajax,Tomcat,Callback,Comet,我已经在上实现了Comets教程 似乎我正在使用Comets技术从服务器返回数据,即推送到浏览器。然而,我得到的是用于触发返回的Comet事件的.jsp页面,而不是应该返回的天气数据 我已将代码粘贴到下面。基本上有一个servlet、一个jsp页面和一个将其连接在一起的web.xml文件 我将我的web应用命名为WeatherServlet,tomcat在端口8080上运行 package com.app; import com.sun.syndication.feed.synd.SyndEn

我已经在上实现了Comets教程

似乎我正在使用Comets技术从服务器返回数据,即推送到浏览器。然而,我得到的是用于触发返回的Comet事件的.jsp页面,而不是应该返回的天气数据

我已将代码粘贴到下面。基本上有一个servlet、一个jsp页面和一个将其连接在一起的web.xml文件

我将我的web应用命名为WeatherServlet,tomcat在端口8080上运行

package com.app;

import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletResponse;
import org.apache.catalina.CometEvent;
import org.apache.catalina.CometProcessor;

public class TomcatWeatherServlet extends HttpServlet implements CometProcessor {

    private MessageSender messageSender = null;
    private static final Integer TIMEOUT = 60 * 1000;

    @Override
    public void destroy() {
        messageSender.stop();
        messageSender = null;
    }

    @Override
    public void init() throws ServletException {
        messageSender = new MessageSender();
        Thread messageSenderThread =
                new Thread(messageSender, "MessageSender[" + getServletContext().getContextPath() + "]");
        messageSenderThread.setDaemon(true);
        messageSenderThread.start();
    }

//    @Override
//    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
//    throws ServletException, IOException {
//    super.doGet(req, resp);
//    }

    public void event(final CometEvent event) throws IOException, ServletException {
        HttpServletRequest request = event.getHttpServletRequest();
        HttpServletResponse response = event.getHttpServletResponse();
        if (event.getEventType() == CometEvent.EventType.BEGIN) {
            request.setAttribute("org.apache.tomcat.comet.timeout", TIMEOUT);
               log("Begin for session: " + request.getSession(true).getId());
            messageSender.setConnection(response);
            Weatherman weatherman = new Weatherman(95118, 32408);
            weatherman.start();
        } else if (event.getEventType() == CometEvent.EventType.ERROR) {
            log("Error for session: " + request.getSession(true).getId());
            event.close();
        } else if (event.getEventType() == CometEvent.EventType.END) {
            log("End for session: " + request.getSession(true).getId());
            event.close();
        } else if (event.getEventType() == CometEvent.EventType.READ) {
            throw new UnsupportedOperationException("This servlet does not accept data");
        }
    }

private class Weatherman {

    private final List<URL> zipCodes;
    private final String YAHOO_WEATHER = "http://weather.yahooapis.com/forecastrss?p=";

    public Weatherman(Integer... zips) {
        zipCodes = new ArrayList<URL>(zips.length);
        for (Integer zip : zips) {
            try {
                zipCodes.add(new URL(YAHOO_WEATHER + zip));
            } catch (Exception e) {
                // dont add it if it sucks
            }
        }
        }

    public void start() {
        Runnable r = new Runnable() {

            public void run() {
                int i = 0;
                while (i >= 0) {
                    int j = i % zipCodes.size();
                    SyndFeedInput input = new SyndFeedInput();
                    try {
                    SyndFeed feed = input.build(new InputStreamReader(zipCodes.get(j).openStream()));
                        SyndEntry entry = (SyndEntry) feed.getEntries().get(0);
                        messageSender.send(entryToHtml(entry));
                        Thread.sleep(30000L);
                        } catch (Exception e) {
                        // just eat it, eat it
                    }
                    i++;
                }
            }
       };
        Thread t = new Thread(r);
        t.start();
    }
 private String entryToHtml(SyndEntry entry){
        StringBuilder html = new StringBuilder("<h2>");
        html.append(entry.getTitle());
        html.append("</h2>");
        html.append(entry.getDescription().getValue());
        return html.toString();
    }
}

   private class MessageSender implements Runnable {

        protected boolean running = true;
        protected final ArrayList<String> messages = new ArrayList<String>();
        private ServletResponse connection;

        private synchronized void setConnection(ServletResponse connection){
            this.connection = connection;
            notify();
        }

        public void stop() {
            running = false;
        }

        /**
         * Add message for sending.
         */
        public void send(String message) {
            synchronized (messages) {
                messages.add(message);
                log("Message added #messages=" + messages.size());
                messages.notify();
            }
        }

        public void run() {
            while (running) {
                if (messages.size() == 0) {
                    try {
                        synchronized (messages) {
                            messages.wait();
                        }
                    } catch (InterruptedException e) {
                        // Ignore
                    }
                }
                String[] pendingMessages = null;
                synchronized (messages) {
                    pendingMessages = messages.toArray(new String[0]);
                    messages.clear();
                }
                try {
                    if (connection == null){
                        try{
                            synchronized(this){
                                wait();
                            }
                        } catch (InterruptedException e){
                            // Ignore
                        }
                    }
                    PrintWriter writer = connection.getWriter();
                    for (int j = 0; j < pendingMessages.length; j++) {
                        final String forecast = pendingMessages[j] + "<br>";
                        writer.println(forecast);
                        log("Writing:" + forecast);
                        }
                    writer.flush();
                    writer.close();
                    connection = null;
                    log("Closing connection");
                } catch (IOException e) {
                    log("IOExeption sending message", e);
                }
            }
        }
    }
}


 <?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
   <display-name>WeatherServlet</display-name>
   <welcome-file-list>
     <welcome-file>index.html</welcome-file>
     <welcome-file>index.htm</welcome-file>
     <welcome-file>index.jsp</welcome-file>
     <welcome-file>default.html</welcome-file>
     <welcome-file>default.htm</welcome-file>
     <welcome-file>default.jsp</welcome-file>
   </welcome-file-list>
        <servlet>
     <description>WeatherServlet</description>
     <display-name>WeatherServlet</display-name>
     <servlet-name>WeatherServlet</servlet-name>
     <servlet-class>com.app.TomcatWeatherServlet</servlet-class>
   </servlet>
   <servlet-mapping>
     <servlet-name>WeatherServlet</servlet-name>
     <url-pattern>/WeatherServlet</url-pattern>
   </servlet-mapping>
 </web-app>


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Comet Weather</title>
        <SCRIPT TYPE="text/javascript">
            function go(){
                var url = "http://localhost:8080/WeatherServlet"
                var request =  new XMLHttpRequest();
                request.open("GET", url, true);
                request.setRequestHeader("Content-Type","application/x-javascript;");
                request.onreadystatechange = function() {
                    if (request.readyState == 4) {
                    if (request.status == 200){
                            if (request.responseText) {
                                document.getElementById("forecasts").innerHTML = request.responseText;
                                }
                            }
                            go();
                        }
                    };
                    request.send(null);
                }
            </SCRIPT>
    </head>
    <body>
    <h1>Rapid Fire Weather</h1>
    <input type="button" onclick="go()" value="Go!"></input>
    <div id="forecasts"></div>
    </body>
</html>
package.com.app;
导入com.sun.syndication.feed.synd.SyndEntry;
导入com.sun.syndication.feed.syndd.SyndFeed;
导入com.sun.syndication.io.SyndFeedInput;
导入java.io.IOException;
导入java.io.PrintWriter;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入java.io.InputStreamReader;
导入java.net.URL;
导入java.util.ArrayList;
导入java.util.List;
导入javax.servlet.ServletResponse;
导入org.apache.catalina.CometEvent;
导入org.apache.catalina.com处理器;
公共类TomcatWeatherServlet扩展了HttpServlet处理器{
private MessageSender=null;
私有静态最终整数超时=60*1000;
@凌驾
公共空间销毁(){
messageSender.stop();
messageSender=null;
}
@凌驾
public void init()引发ServletException{
messageSender=新建messageSender();
线程消息发送线程=
新线程(messageSender,“messageSender[“+getServletContext().getContextPath()+”]);
messageSenderThread.setDaemon(true);
messageSenderThread.start();
}
//@覆盖
//受保护的无效数据集(HttpServletRequest-req、HttpServletResponse-resp)
//抛出ServletException、IOException{
//super.doGet(要求、响应);
//    }
公共void事件(最终CometEvent事件)引发IOException、ServletException{
HttpServletRequest=event.getHttpServletRequest();
HttpServletResponse=event.getHttpServletResponse();
if(event.getEventType()==CometEvent.EventType.BEGIN){
setAttribute(“org.apache.tomcat.comet.timeout”,timeout);
日志(“开始会话:+request.getSession(true.getId());
messageSender.setConnection(响应);
气象员气象员=新气象员(9511832408);
天气预报员,开始;
}else if(event.getEventType()==CometEvent.EventType.ERROR){
日志(“会话错误:+request.getSession(true.getId());
event.close();
}else if(event.getEventType()==CometEvent.EventType.END){
日志(“会话结束:+request.getSession(true.getId());
event.close();
}else if(event.getEventType()==CometEvent.EventType.READ){
抛出新的UnsupportedOperationException(“此servlet不接受数据”);
}
}
二等气象员{
私有最终列表zipCodes;
私有最终字符串YAHOO_WEATHER=”http://weather.yahooapis.com/forecastrss?p=";
公共气象员(整数…拉链){
zipCodes=新阵列列表(zips.length);
适用于(整数拉链:拉链){
试一试{
添加(新的URL(YAHOO_WEATHER+zip));
}捕获(例外e){
//如果它很糟糕,就不要加上它
}
}
}
公开作废开始(){
Runnable r=新的Runnable(){
公开募捐{
int i=0;
而(i>=0){
int j=i%zipCodes.size();
SyndFeedInput=新的SyndFeedInput();
试一试{
SyndFeed feed=input.build(新的InputStreamReader(zipCodes.get(j.openStream()));
SyndEntry条目=(SyndEntry)feed.getEntries().get(0);
send(entryToHtml(entry));
线程。睡眠(30000L);
}捕获(例外e){
//吃吧,吃吧
}
i++;
}
}
};
螺纹t=新螺纹(r);
t、 start();
}
私有字符串entryToHtml(SyndEntry条目){
StringBuilder html=新的StringBuilder(“”);
append(entry.getTitle());
html.append(“”);
append(entry.getDescription().getValue());
返回html.toString();
}
}
私有类MessageSender实现可运行{
受保护的布尔运行=真;
受保护的最终ArrayList消息=新建ArrayList();
专用ServletResponse连接;
专用同步void setConnection(ServletResponse连接){
这个连接=连接;
通知();
}
公共停车场(){
运行=错误;
}
/**
*添加用于发送的消息。
*/
公共无效发送(字符串消息){
已同步(消息){
消息。添加(消息);
日志(“消息添加#消息=“+messages.size());
messages.notify();
}
}
公开募捐{
(跑步时){
if(messages.size()==0){
试一试{
已同步(消息){
messages.wait();
}
}捕捉(中断异常e){
//忽略
}
}
字符串[]pendingMessages=null;
已同步(消息){
pendingMessages=messages.toArray(新字符串[0]);
messages.clear();
}