フォワードとインクルード

サーブレットのディスパッチにはフォワードとインクルードがありますが、実際何が違うのかなぁと。


よくフォワードは処理を次のリソースに丸投げ、インクルードは戻ってくると言われることがあるけど、GOTO文じゃないんだから、プログラム的にはどちらももどってきます。違いはレスポンスの扱いの違いです。

フォワード(forward)

フォワードは、フォワード先のリソースにレスポンスを全部まかせます。

細かいところでは、

  • フォワード前にレスポンスバッファがクリア。なので、フォワード前の書き込みは無効。
  • フォワード前に レスポンスバッファをcloseすると レスポンスをコミットした場合(close、手動flush、バッファを越えて自動flush)、フォワード時にIllegalStateException

インクルード(include)

インクルードは、インクルード元が主、インクルード先が従の関係になり、レスポンスを作っていきます。

細かいところでは、

  • インクルード前にレスポンスバッファをcloseすると、その後は書いたのは無効。


このあたり適当に使ってたので、あまり意識してなかった。というか最近はディスパッチを自分で書くことないのかなー。