Servlet和错误条件

时间:2010-07-16 07:58:59

标签: java ajax json gwt servlets

我正在编写我的第一个JAVA servlet,我有一个问题。

说我的servlet将从Google Web Toolkit(AJAX)中调用可能很重要

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

PrintWriter out = response.getWriter();
...
out.println("[");
out.println("  {");
out.println("    \"validation\" : {");
...

但如果同时我得到一个错误条件会发生什么?

将错误返回给客户端的正确方法是什么? (AJAX客户端)

我是否必须缓冲输出(如何?)并将错误返回为JSON(而不是输出) 要么 我必须抛出ServletException?

3 个答案:

答案 0 :(得分:2)

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

但是有一个问题。

HTTP状态代码实际上是在HTTP响应的第一行传递的。当响应“已提交”时会写入,这通常在您致电response.getOutputStream()response.getWriter()时发生。之后,您无法更改状态代码。

处理它的方法是执行以下操作之一:

  • 对应用程序进行编码,以便在生成响应正文期间不会发生错误。
  • 将响应主体生成到某种缓冲区,只有在完全构建它时才打开响应输出流/阅读器。如果在正文生成期间出现错误,您可以设置HTTP状态代码并(如果适用)发送包含错误消息的替代正文。

答案 1 :(得分:2)

使用例如StringBuilder在内存中构建字符串。在完成字符串构建之前,不要将任何字符写入响应。那是“缓冲”。

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

// When finished:
response.getWriter().write(builder.toString());

当某些内容同时失败时,要么抛出ServletException(最终会在状态码为500的服务器默认错误页面中),要么使用HttpServletResponse#sendError()发送更具体的错误状态。但通常情况下,状态码500足以使XMLHttpRequest客户端在服务器端出现故障。

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

答案 2 :(得分:1)

请参阅HTTP status codes。您可以使用HttpServletResponse.setStatus来设置响应状态(还要注意该类定义的常量)。