S2JSFでファイルのアップロードを行う。

なんかいろいろ中途半端に手を付けすぎていますが、
ファイルのアップロードも必要なので調査しました。
はい。以外と簡単でした。

手順ですが、以下が参考になります。
http://www.seasar.org/wiki/index.php?FAQ%2FS2JSF#o8f96c6b

1.Myfacesの拡張タグを使えるようにするために、jsf.diconを編集します。

org.seasar.jsf.runtime.JsfConfigImplにメソッドインジェクションを行うことで可能です。

<component class="org.seasar.jsf.runtime.JsfConfigImpl">
<initMethod name="addTaglibUri">
<arg>"h"</arg>
<arg>"http://java.sun.com/jsf/html"</arg>
</initMethod>
<initMethod name="addTaglibUri">
<arg>"f"</arg>
<arg>"http://java.sun.com/jsf/core"</arg>
</initMethod>
<initMethod name="addTaglibUri">
<arg>"s"</arg>
<arg>"http://www.seasar.org/jsf"</arg>
</initMethod>
<!-- ファイルアップロードのために設定 -->
<initMethod name="addTaglibUri">
<arg>"x"</arg>
<arg>"http://myfaces.sourceforge.net/tld/myfaces_ext_0_9.tld"</arg>
</initMethod>
</component>

2.拡張タグを使ってファイルをアップロードさせるHTMLを書きます。
formのenctype指定と、x:inputFileUploadの利用がキモになります。

<form enctype="multipart/form-data">
<span m:inject="x:inputFileUpload" m:value="#{hogeDto.uploadedFile}" />

3.Dtoでアップロードしたファイルを受け取ります。

importの記述、UploadedFileのsetter/getterを記述します。

import org.apache.myfaces.custom.fileupload.UploadedFile;

public class HogeDto implements Serializable {
private UploadedFile uploadedFile;

public UploadedFile getUploadedFile() {
return this.uploadedFile;
}
public void setUploadedFile(UploadedFile uploadedFile) {
this.uploadedFile = uploadedFile;
System.out.println("uploadFileSize["+uploadedFile.getSize()+"]");
}
}

取り出したファイルは、getInputStream()で取得します。

S2JSFで、初期処理(initialize)を2回以上呼びたくないのです

S2JSFの実装でちょっとハマっています(泣)

ページの初期化に指定された HogeEditInitAction#initialize で、

■HogeEditInitAction
private HogeDto hogeDto;

public String initialize() {
hogeDto.setDate("20060703"); //今日の日付を自動でセット
}

とした場合に、HTMLへの表示およびボタンへのActionバインドを下記のように定義し、

<input type="text" id="date" m:value="#{hogeDto.date}"/>
<input type="button" id="btn" m:action="#{hogeEditAction.goCheck}" value="check" />

初期化された日付値(hogeDto.date)を書き換えて、checkボタンを押下。
ボタンが押されたときのActionで、サーバ側でチェックを行い、同じ画面(入力フォーム)に返す。

public String goCheck() {
// ここでコード重複などのチェック
return null;
}

この場合、書き換えた日付値が初期値に戻ってしまいます。

HogeEditInitAction#initializeは、バリデータエラーがあった場合は処理されないのですが、
バリデータを通過した場合には再処理されてしまうんですね。

確かに一覧表示や参照画面では必要ですよね。

ASP.NETの Boolean isPostback() みたいに、2回目以降のポストバックかどうかを判定できないんでしょうか?...

S2JSFで動的な画像の表示

S2JSFによる動的な画像表示を調査中。

http://groups.yahoo.co.jp/group/jsf-jp/message/338 から引用

<h:graphicImage url="#{bean.imgPath}" />

とした上で、bean.imgPathは画像処理をするサーブレットを別途用意し、そのサーブレットへのパスと、画像を切り替えるための何らかのデータをパラメーターとしてパスに付加して返せばいいようです。

S2JSFDtoの値(IDなど)に応じて動的に画像を表示したい場合は上記のようにServletを介在させるしかないのか?