2010-07-16 5 views
1

첫 번째 JAVA 서블릿을 작성 중이며 질문이 있습니다.서블릿 및 오류 조건

는 내 서블릿이

가 내가 PrintWriter를 작성하고 시작하는 것입니다

우선이 내 JSON 출력을 작성하는 구글 웹 툴킷 (Google Web Toolkit) (AJAX)에서 호출 될 것이라고 말을하는 것이 중요 할 수 있음

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

하지만 오류 상태가 발생하면 어떻게됩니까?

클라이언트에게 오류를 반환하는 올바른 방법은 무엇입니까? (AJAX 클라이언트)

내 출력 (HOW?)을 버퍼링하고 JSON (출력 대신)으로 오류를 반환해야합니까? 또는 ServletException을 발생시켜야합니까?

답변

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); 
} 
+0

이것도 괜찮습니까? ByteArrayOutputStream outBuf = new ByteArrayOutputStream(); PrintStream out = 새 PrintStream (outBuf, true, "UTF8"); ... outBuf.writeTo (response.getOutputStream()); –

+0

다음과 같이 가정 해 보겠습니다.효과가 있지만 올바른 방법은 아닙니다. – BalusC

2

@McDowell에 따르면 서블릿에서 요청을 처리하는 동안 오류를 처리하는 올바른 방법은 응답 객체에 HTTP 상태 코드를 설정하는 것입니다.

그러나 캐치가 있습니다.

HTTP 상태 코드는 실제로 HTTP 응답의 첫 번째 줄에 전달됩니다. 응답이 "커밋 됨"일 때 작성됩니다. 일반적으로 response.getOutputStream() 또는 response.getWriter()으로 전화를 걸 때 발생합니다. 그 후에는 상태 코드를 변경할 수 없습니다.

그것을 처리하는 방법은 다음 중 하나를 수행하는 것입니다

  • 코드 응용 프로그램 오류가 응답 본체의 생성 중에 발생하지 않도록.
  • 일종의 버퍼에 대한 응답 본문을 생성하고 완전히 빌드 한 경우에만 응답 출력 스트림/판독기를 엽니 다. 본문 생성 중 오류가 발생하면 HTTP 상태 코드를 설정하고 오류 메시지가 포함 된 대체 본문을 보낼 수 있습니다 (해당하는 경우).
+0

버퍼링에 대한 예와 이에 대한 응답으로 어떻게 내보낼 수 있습니까? –

+0

@ 주 - @ BalusC의 대답 참조. –