代码之家  ›  专栏  ›  技术社区  ›  Julian Popov

servlet和错误条件

  •  1
  • Julian Popov  · 技术社区  · 14 年前

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

    可能重要的是,我的servlet将从GoogleWebToolkit(Ajax)调用

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

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

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

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

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

    3 回复  |  直到 11 年前
        1
  •  2
  •   BalusC    11 年前

    只需在内存中构建字符串,例如 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
  •  2
  •   Stephen C    14 年前

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

    但有一个陷阱。

    HTTP状态代码实际上是在HTTP响应的第一行中传递的。当响应是“提交”的时候就会写出来,这通常发生在您调用 response.getOutputStream() response.getWriter() . 之后,您将无法更改状态代码。

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

    • 编写应用程序代码,以便在生成响应主体期间不会发生错误。
    • 将响应体生成到某种类型的缓冲区,并且只有在完全构建响应输出流/读卡器之后才打开它。如果在主体生成过程中出现错误,可以设置HTTP状态代码,并(如果适当)发送包含错误消息的可选主体。
        3
  •  1
  •   McDowell    14 年前

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