menu
書いてる野郎
orebike@gmail.com
Actionメソッドが様々なリターンをすることによってレスポンスがコントロールできる。
JSPのファイル名を指定することによって、そのJSPファイルの出力がレスポンスになる。
return "hoge.jsp";
ここでの注意点はActionによって呼び出すviewのルートが変化するということ。 PiyoActionから呼び出されたのなら、設定にもよるが基本的にhoge.jspは
view/piyo/hoge.jsp
のjspを指すことになる。
別階層のディレクトリにあるJSPを指定したいのならば
return "/fuga/hoge.jsp";
のようにルートから記述する。
つまりこれは別のActionにURLを通じて再アクセスさせるということになる。
先頭にスラッシュ無しで書けば、同一Actionクラスへのアクセスとみなされる。
つまりHogeActionのpiyoメソッドのレスポンスとして
return "fuga?redirect=true";
と記述すると、HogeActionのfuga
というURLパターンにマッチングするメソッド(何も指定してなければfugaメソッド)にリダイレクトして移動する。
別Actionクラスのメソッドを呼び出す場合は頭にスラッシュをつけて
return "/foo/hoo?redirect=true";
のように指定してあげる
何かの値のPOSTを受け取って確定させるようなAction後などに表示用のActionに遷移させるためによく使われる。
パラメータ付きでリダイレクトしたい場合は
return "hoge?hoge=piyo&redirect=true";
こういうふうにする。
↑のリダイレクトとのように術するがredirect=true
の記述を書かないと、そのActionへ内部的にforwerdする。
一応できるが、内部的に処理を行う場合は別メソッドとして切り出したほうがいいし、URLと表示内容がズレるということになりやすいので、設計的にこの処理はおすすめしない。
return "http://www.hoge.com/abc/efg.html?redirect=true";
レスポンスをAction内部で構築してJSPを使わない場合は
ResponseUtil.write("hogehoge", "text/html");
のように設定する。
このあと通常ならJSP名を返す所でnullをreturnしておけばwrite
で書き込んだ内容が出力される
HTTPステータスコードもセットしたいなら
ResponseUtil.getResponse().setStatus(500);
このように返してもいいだろう。
response
のインスタンスに関してはseasarに自動でつっこんでもらってもいいね。
response が Action でインジェクションされているとして
@Execute(validator=false, urlPattern="{imgName}") public String index() throws Exception{ this.response.setContentType("image/png"); OutputStream out = this.response.getOutputStream(); File f = new File("/home/hoge/" + hogeForm.imgName + ".png"); InputStream in = FileUtils.openInputStream(f); InputStreamUtil.copy(in, out); OutputStreamUtil.flush(out); OutputStreamUtil.close(out); InputStreamUtil.close(in); return null; }