2012-01-23 2 views
0

서블릿을 사용하여 데이터 전송 응용 프로그램을 작성 중이며 서블릿 응답이 기록 된 후에 문제가 발생하면 오류 응답을 보내고 싶습니다. 그게 가능하니?서블릿 응답이 쓰여진 후 오류 응답 보내기

제 문제는 데이터베이스에서 읽은 데이터로 생성 된 큰 압축 CSV 파일을 보내는 것입니다. 스트림으로 모든 작업을 수행하므로 서블릿 응답이 기록 된 후 csv 파일을 만들 때 오류가 발생할 수 있습니다. 나는 그것이 일어나는 것을 보았다.

서블릿 OutputStream을 플러시 한 후에 만 ​​문제가 있음을 발견했습니다. 플러시되지 않은 경우 오류 응답을 보낼 수 있지만 이후에는 보낼 수 없습니다. 많은 양의 데이터를 다루기 때문에 모든 것을 한 번에 보낼 수는 없습니다.

답변

1

서블릿을 사용하여 데이터 전송 응용 프로그램을 작성 중이며 서블릿 응답이 기록 된 후 문제가 발생하면 오류 응답을 보내고 싶습니다. 그게 가능하니?

서버 쪽에서가 아닙니다. 서버는 이미 플러시 된 바이트를 클라이언트에서 다시 가져올 수 없습니다. 이것은 반환의 지점입니다. 응답의 Writer 또는 OutputStream에 대해 IOException과 다른 예외가 있다고 가정합니다. (이 가난한 연습 임에도 불구하고, HTML은 JSP에서 소속)가 HTML 인 경우

, 당신은 은 위치 변경과 같이 강제로 일부 JS 코드 인쇄 수 :

try { 
    writer.write(someHtml); 
} catch (SomeException e) { 
    writer.write("<script>window.location = 'error.jsp';</script>"); 
    // ... 
} 

는하지만이 아니다 HTML 이외의 응답에서도 가능합니다. 미리 전체 응답을 메모리 또는 임시 디스크에 버퍼해야합니다. 버퍼링이 흠 잡을 데 없다면 다시 응답에 파이프 할 수 있습니다.

try { 
    processAndSaveInMemoryOrTempDiskFile(someData, byteArrayOrFileLocation); 
} catch (SomeException e) { 
    throw new ServletException(e, "Processing some data failed."); 
} 

copyFromMemoryOrTempDiskToResponse(byteArrayOrFileLocation, writer);