Java 将数据提交到HttpServletResponse后是否可以发送错误消息

Java 将数据提交到HttpServletResponse后是否可以发送错误消息,java,http,servlets,response,mime,Java,Http,Servlets,Response,Mime,各位 如果将部分数据提交到HttpServletResponse后发生错误, 我可以发送错误消息或替换http状态码吗? 我调查了一些函数(sendError、sendStatus等),但没有找到解决方案。 这很平常,不是吗 如果是这样,服务器需要在发送大量数据之前存储所有数据。 我认为服务器永远不会有足够的内存 p、 美国。 我必须发送很多数据,比如视频数据。它是如此大的数据,所以我不想在发送之前存储很多数据。Umm:-(如果出现错误,您可以尝试增加缓冲区并将其重置。这可以帮助您“修补”代码。

各位

如果将部分数据提交到HttpServletResponse后发生错误, 我可以发送错误消息或替换http状态码吗? 我调查了一些函数(sendError、sendStatus等),但没有找到解决方案。 这很平常,不是吗

如果是这样,服务器需要在发送大量数据之前存储所有数据。 我认为服务器永远不会有足够的内存

p、 美国。
我必须发送很多数据,比如视频数据。它是如此大的数据,所以我不想在发送之前存储很多数据。Umm:-(

如果出现错误,您可以尝试增加缓冲区并将其重置。这可以帮助您“修补”代码。但对于视频内容,这可能会很困难

您可以尝试以下代码

Servlet:

package testingThings;

import java.io.IOException;
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("/BufferedResponse")
public class BufferedResponse extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().println("buffer size: " + response.getBufferSize());
        response.setStatus(HttpServletResponse.SC_OK);

        String flash = request.getParameter("flash");
        if (flash != null) {
            response.flushBuffer();
        }

        if (response.isCommitted()) {
            response.getWriter().println("buffer was commited.");
            response.getWriter().println("it is too late change the response");
        }
        else {
            response.resetBuffer();
            response.getWriter().println("buffer reseted.");
            response.getWriter().println("response and status code were changed");
            response.setStatus(HttpServletResponse.SC_FOUND);
        }
    }

}
或者像其他人建议的那样,将逻辑与视图分开


至少您可以处理数据,编写“日志”(作为响应的准备)。如果一切正常且未发生错误,请在响应中写入“日志”。

如果发生错误,您可以尝试增加缓冲区并重置它。这可以帮助您“修补”代码。但对于视频内容,这可能很困难

您可以尝试以下代码

Servlet:

package testingThings;

import java.io.IOException;
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("/BufferedResponse")
public class BufferedResponse extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().println("buffer size: " + response.getBufferSize());
        response.setStatus(HttpServletResponse.SC_OK);

        String flash = request.getParameter("flash");
        if (flash != null) {
            response.flushBuffer();
        }

        if (response.isCommitted()) {
            response.getWriter().println("buffer was commited.");
            response.getWriter().println("it is too late change the response");
        }
        else {
            response.resetBuffer();
            response.getWriter().println("buffer reseted.");
            response.getWriter().println("response and status code were changed");
            response.setStatus(HttpServletResponse.SC_FOUND);
        }
    }

}
或者像其他人建议的那样,将逻辑与视图分开


至少你可以处理数据,写“日志”(为响应做准备)。如果一切正常,没有错误发生,那么在响应中写“日志”。

你是正确的。在发送响应数据之前,你必须设置状态和标题。如果你正确地将关注点分开(例如,你可以使用MVC模式),在开始发送任何响应之前,您将知道是否存在需要通过http status报告的错误。http状态代码是最先发送的数据项之一。一旦发送,您就无法更改它。也就是说,
HttpServletResponse
将被缓冲。但是,如果缓冲区溢出,服务器将立即开始发送g数据。多年来,我一直使用“命令式”风格,做基本相同的事情,计算一些东西,输出它们,再计算一些,输出。问题是,如果你输出了一半的页面,并且得到了一个错误,你就不能轻易地更改响应。一般来说,使用“函数式”更容易样式,将整个响应计算到字符串或StringBuffer中,然后由主函数返回对象并立即输出。您是正确的。您必须在发送响应数据之前设置状态和标题。但是,如果您正确地分离出您的关注点(例如,您可以使用MVC模式),在开始发送任何响应之前,您将知道是否存在需要通过http status报告的错误。http状态代码是最先发送的数据项之一。一旦发送,您就无法更改它。也就是说,
HttpServletResponse
将被缓冲。但是,如果缓冲区溢出,服务器将立即开始发送g数据。多年来,我一直使用“命令式”风格,做基本相同的事情,计算一些东西,输出它们,再计算一些,输出。问题是,如果你输出了一半的页面,并且得到了一个错误,你就不能轻易地更改响应。一般来说,使用“函数式”更容易样式,将整个响应计算到字符串或StringBuffer中,然后由主函数返回对象并立即输出。