ファイルアップロード

ファイルアップロードは以下のようにorg.apache.commons.fileupload.FileItemの型で受け取ることができます。 アップロードを使用するにはapp-cubby.diconの設定 を行っておく必要があります。

アップロード用のJSP

<t:form method="post" action="${contextPath}/fileupload/upload" enctype="multipart/form-data"
        value="${form}">
<h1>ファイルアップロード</h1>
拡張子が「png」「jpg」のファイルのみアップロードできます。<br/>
...
<label for="file">ファイル:</label>
<t:input type="file" name="file"/><br/>
<input type="submit" value="アップロード"/>
</t:form>

アップロードを処理するアクションクラス

import org.apache.commons.fileupload.FileItem;
...
public class FileUploadAction extends Action {
        public ValidationRules validation = new DefaultValidationRules() {
                public void initialize() {
                        ...
                        // (?i)を付けることで大文字小文字を区別しないという意味
                        // 正規表現に関しての詳細な情報はjava.util.PatternクラスのJavaDocを参照してください。
                        add("file", new FileRegexpValidator(".+\\.(?i)(png|jpg)")); 
                }
        };
        ...
        public FileItem file;
        ...
        @Validation(rules = "validation", errorPage = "fileupload.jsp")
        public ActionResult upload() {
                return new Forward("fileupload_done.jsp");
        }       
}

アップロード結果を表示するクラス

...
<h2>ファイルアップロード結果</h2>
<label for="file">File:</label>
アップロード完了しました。<br/>
ファイル名:${action.file.name}<br/>
ファイルサイズ:${action.file.size}<br/>
...

共通アクション

アクションクラスの共通的な処理は、以下のように共通アクションに記述し、継承して個々のアクションクラスから利用すると便利です。 共通アクションには本当に共通的な処理のみ置いてください。いくつかのアクションクラスや特定のユースケースのみで使用するような処理は、Service/Logic/Helper/Utilクラスなどを用意して共通処理を移譲したほうが良い場合が多いです。 Cubbyでは、あえてBeseActionのような共通の便利機能を用意していません。それぞれのプロジェクトにおいて、必要な共通アクションを自由に作成することを推奨します。

共通アクション

// 共通アクションクラス
public class BaseAction extend Action {
  ...
  /**
   * 通知用のフラッシュメッセージをセットします。
   * @param message メッセージ
   */
  protected void notice(String message) {
    flash.put("notice", message);
  }
}

// それぞれのアクションクラス
private clsss TodoAction extend BaseAction {
  ...
}

画面部品のインポート

Cubby では 共通の画面部品(他のフレームワークではコンポーネントなどと呼ばれます)を何もサポートしませんが、 画面部品が必要な場合、以下のように「JSTLのc:importタグ」+「JSP標準のスクリプトレット」+「Seasar2 の SingletonS2Container」を使って 画面部品を作成することを推奨します。

画面部品では、引数を元にデータベースへの検索などを行いたい場合があります。 その場合、画面部品のJSPページの先頭に画面描画に必要な情報取得のスクリプトレットを記述します。 通常はSeasar2を使用する場合、スクリプトレット中でLogicクラスやDaoのメソッドを実行すれば良いでしょう。 スクリプトレットは多用するとメンテナンス性が落ちますので、画面部品の先頭でのみで限定的に使用することをおすすめします。

なお、EclipseのWTP(Web Tools Platform) プラグインを使用するとスクリプトレット中の「Javaコードの補完」「import文の自動設定」「コンパイルエラーの表示」などほぼ完璧に行ってくれます。 スクリプトレットでも通常のJavaコード同様にさくさく開発できるのでぜひ導入してみてください。

import(単純な場合):メイン画面

<h2>1.c:importを使用したサンプル<br/>
(S2やDBデータと絡まない単純なパターン)</h2>
<c:import url="img.jsp">
        <c:param name="x" value="100"/>
        <c:param name="y" value="100"/>
        <c:param name="imageUrl" value="http://www.seasar.org/images/seasar_logo_blue.gif"/>
</c:import>
<c:import url="img.jsp">
        <c:param name="x" value="200"/>
        <c:param name="y" value="200"/>
        <c:param name="imageUrl" value="http://www.seasar.org/images/seasar_banner.gif"/>
</c:import>

import(単純な場合):画面部品(img.jsp)

${param.imageUrl}:<br/>
<img src="${param.imageUrl}" width="${param.x}" height="${param.y}"/><br/>
<hr/>

import(Seasar2のDaoを利用):メイン画面

<h2>2.c:importを使用したサンプル<br/>
(S2やDBデータを読み込み先のJSPのスクリプトレットで直接使用(WTPの使用をおすすめ))</h2>
<c:import url="import_scriptlet.jsp"/>

import(Seasar2のDaoを利用):画面部品(import_scriptlet.jsp)

<%@page import="java.util.List"%>
<%@page import="org.seasar.framework.container.SingletonS2Container"%>
<%@page import="org.seasar.cubby.examples.todo.dao.TodoTypeDao"%>
<%@page import="org.seasar.cubby.examples.todo.entity.TodoType"%>
<%
        TodoTypeDao todoTypeDao = SingletonS2Container
                        .getComponent(TodoTypeDao.class);
        List<TodoType> types = todoTypeDao.seletAll();
        pageContext.setAttribute("types", types);
%>
<br />
<c:forEach var="type" items="${types}">
        <li>${type.name}</li>
</c:forEach>
<hr />