Java Servlet和错误条件

Java Servlet和错误条件,java,ajax,json,gwt,servlets,Java,Ajax,Json,Gwt,Servlets,我正在编写我的第一个Javaservlet,我有一个问题 也许有一点很重要,那就是我的servlet将从GoogleWebToolkitAjax调用 我要做的第一件事是创建PrintWriter并开始在其中写入JSON输出 PrintWriter out = response.getWriter(); ... out.println("["); out.println(" {"); out.println(" \"validation\" : {"); ... 但如果我同时得到一个错误

我正在编写我的第一个Javaservlet,我有一个问题

也许有一点很重要,那就是我的servlet将从GoogleWebToolkitAjax调用

我要做的第一件事是创建PrintWriter并开始在其中写入JSON输出

PrintWriter out = response.getWriter();
...
out.println("[");
out.println("  {");
out.println("    \"validation\" : {");
...
但如果我同时得到一个错误条件,会发生什么呢

向客户端返回错误的正确方法是什么?AJAX客户端

我必须如何缓冲我的输出?并将错误作为JSON而不是输出返回 或
我必须抛出ServletException?

请参阅。您可以使用设置响应状态注释以及该类定义的常量。

请参阅。您可以使用设置响应状态,注意该类定义的常量。

正如@McDowell所说,在servlet中处理请求期间处理错误的正确方法是在响应对象中设置HTTP状态代码

但有一个陷阱

HTTP状态代码实际上是在HTTP响应的第一行中传递的。在提交响应时写入,这通常发生在调用response.getOutputStream或response.getWriter时。之后,您不能更改状态代码

处理此问题的方法是执行以下操作之一:

编写应用程序代码,以便在生成响应主体期间不会发生错误。 将响应主体生成为某种缓冲区,并且仅在完全构建响应输出流/读取器后才打开它。如果正文生成过程中出现错误,您可以设置HTTP状态代码,并在适当的情况下发送包含错误消息的替代正文。
正如@McDowell所说,在servlet中处理请求期间处理错误的正确方法是在响应对象中设置HTTP状态代码

但有一个陷阱

HTTP状态代码实际上是在HTTP响应的第一行中传递的。在提交响应时写入,这通常发生在调用response.getOutputStream或response.getWriter时。之后,您不能更改状态代码

处理此问题的方法是执行以下操作之一:

编写应用程序代码,以便在生成响应主体期间不会发生错误。 将响应主体生成为某种缓冲区,并且仅在完全构建响应输出流/读取器后才打开它。如果正文生成过程中出现错误,您可以设置HTTP状态代码,并在适当的情况下发送包含错误消息的替代正文。
只需使用例如StringBuilder在内存中构建字符串。在构建完字符串之前,不要向响应中写入任何字符。这就是缓冲

StringBuilder builder= new StringBuilder();
builder.append("[");
builder.append("  {");
builder.append("    \"validation\" : {");
// ...

// When finished:
response.getWriter().write(builder.toString());
当同时出现故障时,抛出ServletException,它将出现在状态代码为500的服务器默认错误页面中,或者使用发送更具体的错误状态。但通常情况下,状态代码500对于XMLHttpRequest客户机来说足以表明服务器端出现了故障

try {
    // Build and write JSON.
} catch (Exception e) {
    throw new ServletException(e);
}  

只需使用例如StringBuilder在内存中构建字符串。在构建完字符串之前,不要向响应中写入任何字符。这就是缓冲

StringBuilder builder= new StringBuilder();
builder.append("[");
builder.append("  {");
builder.append("    \"validation\" : {");
// ...

// When finished:
response.getWriter().write(builder.toString());
当同时出现故障时,抛出ServletException,它将出现在状态代码为500的服务器默认错误页面中,或者使用发送更具体的错误状态。但通常情况下,状态代码500对于XMLHttpRequest客户机来说足以表明服务器端出现了故障

try {
    // Build and write JSON.
} catch (Exception e) {
    throw new ServletException(e);
}  

你能帮我举一个缓冲的例子以及如何在响应中导出它吗?你能帮我举一个缓冲的例子以及如何在响应中导出它吗?这也行吗?ByteArrayOutputStream EXBUFF=新的ByteArrayOutputStream;PrintStream out=新的printstreeamoutcf,true,UTF8。。。exputf.writeToresponse.getOutputStream;比如说:这项工作的工具不对。这样行,但不是正确的方法。这样也行吗?ByteArrayOutputStream EXBUFF=新的ByteArrayOutputStream;PrintStream out=新的printstreeamoutcf,true,UTF8。。。exputf.writeToresponse.getOutputStream;比如说:这项工作的工具不对。行得通,但这不是正确的方法。