【问题标题】:Http servlet not returning any valueHttp servlet 不返回任何值
【发布时间】:2023-03-15 07:19:02
【问题描述】:

当我将它与调度程序一起使用时,HttpServletResponse 没有返回任何值。在下面的代码中,直到“返回”它在控制台中打印。但是下一行 out.println(previousLastLine) 没有返回。任何建议将不胜感激。提前致谢。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(value="/notifyController")
public class NotificationController extends HttpServlet{

    int rep = 0;
    String previousTime = null;
    String previousLastLine = null; 
    String lastText = null;
    int count = 0;
    boolean changeFlag = false;
    final long timeInterval = 1000;
    HttpServletResponse response = null;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        response = resp;
        if(rep == 0){
            Runnable runnable = new Runnable() {
                public void run() {
                    while (true) {
                        changeFlag = scheduleTask(); 
                        if(changeFlag == true){
                            try {
                                System.out.println("RETURNED");
                                response.setContentType("text/html");
                                PrintWriter out = response.getWriter();
                                out.println(previousLastLine);
                                out.flush();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        try {
                            Thread.sleep(timeInterval);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
            Thread thread = new Thread(runnable);
            thread.start();
            rep++;
        }
    }

    public boolean scheduleTask(){
        BufferedReader br = null;
        try {
            String sCurrentLine;
            br = new BufferedReader(new FileReader("D:/messagedetails.txt"));
            while ((sCurrentLine = br.readLine()) != null) {
                if(lastText != sCurrentLine){
                    lastText = sCurrentLine;
                }
            }
            if(count == 1 && !previousLastLine.equalsIgnoreCase(lastText)){
                previousLastLine = lastText;
                return true;
            }
            previousLastLine = lastText;
            count = 1;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            try {
                if (br != null)br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }       
        return false;
    }
}

【问题讨论】:

标签: java servlets


【解决方案1】:

您似乎正在尝试设置响应类型并使用后台线程编写响应正文。这在 doPost 方法中是行不通的。

问题在于,当doPost 调用返回时,servlet 框架将立即“提交”带有空主体的响应。当你的后台线程的run()方法尝试在响应对象上调用setContentType时,会抛出异常。

您正在捕获IOException,但我很确定抛出的异常是未经检查的异常。 (如果您检查日志文件,您可能会在那里看到异常堆栈跟踪。)

如果您尝试实现某种异步行为,那么您需要使用符合 Servlet 3.0 规范的容器,并且您需要对您的 servlet 进行不同的编码。

参考:

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 2021-01-26
    • 2015-05-20
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多