SAStruts/Action/レスポンスのコントロール

SAStruts/Action/レスポンスのコントロール

Actionメソッドが様々なリターンをすることによってレスポンスがコントロールできる。

単にJSPに渡してその出力をレスポンス

JSPのファイル名を指定することによって、そのJSPファイルの出力がレスポンスになる。

return "hoge.jsp";

ここでの注意点はActionによって呼び出すviewのルートが変化するということ。 PiyoActionから呼び出されたのなら、設定にもよるが基本的にhoge.jspは

view/piyo/hoge.jsp

のjspを指すことになる。

別階層のディレクトリにあるJSPを指定したいのならば

return "/fuga/hoge.jsp";

のようにルートから記述する。

別のActionメソッドにリダイレクトする

つまりこれは別の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";

こういうふうにする。

別のActionメソッドにフォワードする

↑のリダイレクトとのように術するがredirect=trueの記述を書かないと、そのActionへ内部的にforwerdする。

一応できるが、内部的に処理を行う場合は別メソッドとして切り出したほうがいいし、URLと表示内容がズレるということになりやすいので、設計的にこの処理はおすすめしない。

別ドメインの全然別のサイトへリダイレクトする

return "http://www.hoge.com/abc/efg.html?redirect=true";

レスポンスをAction自前で用意する

レスポンスを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;
}

Tags

java/sastruts/action/control_respons.txt · 最終更新: 2020-09-21 18:36 by ore