2013-08-14 5 views
4

Я пишу базовый код, когда узнаю о RequestDispatcher. Я понимаю, что когда вызывается rd.forward(), управление (и обработка ответов) пересылается ресурсу, названному в пути, - в этом случае другому сервлету. Но почему этот код не выдает исключение IllegalStateException (не то, что я хочу) из-за вышеприведенных инструкций out.write()?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.

Все будет очищено до пересылки, если вы не покраснели. В противном случае вы получите стимул, который вы ожидаете.

Как и в docs:

За RequestDispatcher, полученного с помощью getRequestDispatcher(), то ServletRequest объект имеет путь элементы и параметры приспособленные к соответствует пути целевого ресурса.

перед вызовом перед тем, как ответ был отправлен клиенту (до того, как выходной сигнал ответа был сброшен). Если ответ уже был зафиксирован, этот метод генерирует исключение IllegalStateException. Невыполненный вывод в буфере ответа автоматически очищается перед переходом.

2

Прочитать docs.

Вызов flush() на PrintWriter фиксирует отклик.

Теперь, согласно вашему любопытству, почему нет IllegalStateException брошен. Это просто потому, что PrintWriter.flush() не выбрасывает это или любое исключенное исключение. И мы знаем, что ответ не был зафиксирован при вызове rd.forward(), так как flush() приходит позже в методе.

+0

Got it. Почему же это не исключение, если я изменю конец кода следующим образом: \t 'out.flush(); \t \t out.write ("код исключения?"); \t \t out.close();' –

+2

Исключение выбрано методом 'forward', если перед этим был вызван флеш – Tala

+0

Точно. Спасибо, Tala. И не забывайте, что все уже очищено, когда оно отправляется Смотрите, почта Талы. –

0

Вы не вызывали флеш() перед переходом. Таким образом, это не показывает никаких исключений. Если вы пишете flush() перед отправкой запроса, он будет генерировать исключение.

Когда мы вызываем flush(), все, что было в буфере, отправляется в браузер, и буфер очищается.

В следующем сценарии мы получим исключение.

response.getWriter().print('hello...'); 
response.getWriter().flush(); 
request.getRequestDispatcher("/index.").forward(request, response); 
Смежные вопросы