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回目以降のポストバックかどうかを判定できないんでしょうか?...