サーブレットのディスパッチにはフォワードとインクルードがありますが、実際何が違うのかなぁと。
よくフォワードは処理を次のリソースに丸投げ、インクルードは戻ってくると言われることがあるけど、GOTO文じゃないんだから、プログラム的にはどちらももどってきます。違いはレスポンスの扱いの違いです。
フォワード(forward)
フォワードは、フォワード先のリソースにレスポンスを全部まかせます。
細かいところでは、
- フォワード前にレスポンスバッファがクリア。なので、フォワード前の書き込みは無効。
- フォワード前に
レスポンスバッファをcloseすると レスポンスをコミットした場合(close、手動flush、バッファを越えて自動flush)、フォワード時にIllegalStateException
インクルード(include)
インクルードは、インクルード元が主、インクルード先が従の関係になり、レスポンスを作っていきます。
細かいところでは、
- インクルード前にレスポンスバッファをcloseすると、その後は書いたのは無効。
このあたり適当に使ってたので、あまり意識してなかった。というか最近はディスパッチを自分で書くことないのかなー。