2013-08-14 2 views
4

RequestDispatcher에 대해 배울 때 기본 코드를 작성하고 있습니다. 나는 rd.forward()가 호출 될 때 경로 (이 경우 다른 서블릿)에 명명 된 자원으로 제어 (및 응답 처리)가 전달된다는 것을 알고 있습니다. 그런데 왜이 코드가 이전에 out.write() 문으로 인해 IllegalStateException을 던지지 않았습니까?RequestDispatcher - 응답이 커밋되는 시점은 언제입니까?

내가 정말로 묻는 것은, 언제 어떻게 이러한 out.write() 문이 커밋 되었습니까?

감사합니다, 제프

public class Dispatcher extends HttpServlet{ 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws IOException, ServletException{ 

    response.setContentType("text/plain"); 
    PrintWriter out = response.getWriter(); 
    out.write("In Dispatcher\n"); 

    String modeParam = request.getParameter("mode"); 
    String path = "/Receiver/pathInfo?fruit=orange"; 
    RequestDispatcher rd = request.getRequestDispatcher(path); 
    if(rd == null){ 
     out.write("Request Dispatcher is null. Please check path."); 
    } 
     if(modeParam.equals("forward")){ 
      out.write("forwarding...\n"); 
      rd.forward(request, response); 
     } 
     else if(modeParam.equals("include")){ 
      out.write("including...\n"); 
      rd.include(request, response); 
     } 
    out.flush(); 
    out.close(); 
} 

}

답변

3

당신은 flush라고하지 않았기 때문에.

홍조가없는 경우 전달하기 전에 모든 내용이 지워집니다. 그렇지 않으면 기대하는 호전을 얻게됩니다. getRequestDispatcher (통해 얻어진 RequestDispatcher의)에 docs:

로서, 의 ServletRequest 객체 검색 대상 자원의 경로 조정 된 경로 요소와 매개 변수를 갖는다.

응답은 클라이언트 (응답 본문 출력이 플러시되기 전)에 커밋 된 후으로 호출되어야합니다. 응답 가 이미 커밋 된 경우이 메서드는 IllegalStateException을 발생시킵니다. 응답 버퍼의 커밋되지 않은 출력은 앞으로 가기 전에 이 자동으로 지워집니다.

2

docs을 읽으십시오.

PrintWriterflush()을 호출하면 응답이 커밋됩니다.

이제 호기심에 따라 IllegalStateException이 던져지지 않은 이유가 있습니다. PrintWriter.flush()이이 예외 또는 확인 된 예외를 throw하지 않기 때문입니다. 그리고 flush()이 메서드의 뒷부분에 있기 때문에 rd.forward()이 호출 될 때 응답이 커밋되지 않았 음을 알 수 있습니다.

+0

알아보기 다음과 같이 코드의 끝 부분을 수정하면 왜 예외가 throw되지 않습니다. \t'out.flush(); \t \t out.write ("예외 코드?"); \t \t out.close(); –

+2

플러시가 전에 호출 된 경우 예외가 throw됩니다. – Tala

+0

. 감사합니다. Tala. 전달 된 모든 항목이 이미 삭제 된 것을 잊지 마세요. Tala의 게시물을보십시오. –

0

전달하기 전에 flush()를 호출하지 않았습니다. 그래서 어떤 예외도 보여주지 않습니다. 요청이 전달되기 전에 flush()를 작성하면 예외가 발생합니다.

flush()를 호출하면 버퍼에있는 모든 내용이 브라우저로 보내지고 버퍼가 지워집니다.

다음 시나리오에서는 예외가 발생합니다.

response.getWriter().print('hello...'); 
response.getWriter().flush(); 
request.getRequestDispatcher("/index.").forward(request, response);