[S2]読んだメモ@Seasar2によるスーパーアジャイルなWeb開発

しーさーつー それは DIコンテナー with AOPなフレームワーク

従来のフレームワークの問題点

  • ちょっとした変更でも再デプロイが必要となり生産性が低下する。
  • Struts, Spring - 設定ファイルのXMLの肥大化により生産性が下がる。

Seasar の利点

  • HOT deploy機能により再デプロイ無しに実行可能
  • COOL deploy機能では従来のような静的なデプロイが可能
  • 定型的な設定はあらかじめされていて、例外的な設定のみ行えば良い。

Seasar のプロダクト構成

  • Seasar2
    • S2Container : 基盤となる DI (Dependency Injection) コンテナ - 意識せずとも使える
    • S2Dxo(ダックスオー): オブジェクト間のデータ変換
  • Teeda : Web 機能を提供するフレームワーク。Core(JSF) + Extension
  • S2Dao : 実装クラスは実行時に AOP (Aspect Oriented Programming) を使ってバイトコードを自動生成
  • Dolteng : Super Agile Family の生産性工場のための Eclipse プラグイン

ページ駆動開発

  1. UI モック
  2. ユーザのレビュー
  3. 入出力項目抽出
  4. データベースのテーブル設計
  5. テーブルを生成
  6. DoltengDao (テーブル名 + Dao)の生成
  7. HTML の入出力項目のタグの id 属性にテーブルのカラム名をキャメルケースで記述
  8. DoltengJavaPage クラスを自動生成

生成したPageクラスでやること

  • 画面に表示するデータを準備する
    initialize() : あるページが最初に表示される時に一度だけ実行される
  • 画面に入力されたデータを処理する
    prerender() : あるページが表示されるたびに実行される

テーブル駆動開発

テーブルのメタデータを元に CRUD (Create Read Update Delete) を実行できるアプリケーションを自動生成する。

ロジックを書く場所

  • 画面固有のロジックは Page クラス
  • 同一ユースケースの複数画面で使う共通ロジックは 親 Page クラス
  • 複数のユースケースで使われるロジックは 共通のユースケース名 + Service クラス

ユースケースを適当にまとめる。

セットアップ

メモ

Dolteng で新しく Page クラスを作る(右クリックのメニューかCtrl+5)と、 HTMLidpublic 変数として自動的に生成される。 この変数に初期値を入れると HTML の該当 id 要素の中身に反映される。 また id へは get パラメータからも変更できる(ちゃんとエスケープも自動でやってくれる)。 Java のコードで id に対応するパブリックフィールドにはマッピングマーカーが付く。

Teeda のメモ

  • データを引き継ぐ画面遷移 : go + 画面名
  • データを引き継がないただの画面遷移 : jump + 画面名
  • なんらかの処理を実行する : do + 処理名
  • doXxx の返り値 null は画面遷移しないという意味
  • form 要素の id 名の suffix(form|Form) にすると Teeda が処理を実行する
  • @Required アノテーションを public 変数につけると null を許可しない。
  • id="allMessages" を持つ要素にエラーメッセージが全て出力される。個別に出力する場合は id="userNameMessage" のようにする。
  • label.properties : src/main/resources → ***********.web で右クリ [new][File] label.properties を作成。idName={ID Name} などと書き込む。
  • AppFacesExceptionHTML にエラーメッセージを出力可能。id="message" となっている HTML 要素に出力される。エラーメッセージは src/main/resources/appMessages_ja.properties で定義する。定義しない場合は空文字となる。
  • AppFacesException はアプリケーション例外で、これ以外はシステム例外。
  • <html xmlns:te="http://www.seasar.org/teeda/extension"> の名前空間で Teeda の独自タグを使用する
  • te:escape 属性 を false にすると出力時に HTML エスケープしない。
  • 入力用の HTML 属性 id="xxx" に対して 出力用の id="xxx-任意の文字列" を使用できる。
  • Save hidden では Serializable なデータであればなんでも保存できる。
  • Select 要素の Option 子要素は initialize()xxxItems のリストに Map を追加することで内容を指定することができる。Map"label" をキーに持ったものが表示される文字列に、"value" をキーにしたものが value属性の値に入る。
  • src/main/resourcesappMessages_ja.propertiesorg.seasar.teeda.extension.component.TSelect.NULL_LABEL を設定することで、null 値の option 要素のラベルを指定できる。
  • 複数選択チェックボックスは span id="xxx" で対象のチェックボックスを囲む。initializexxxItems"label", "value" キーで値を設定すると、チェックボックスが表示される。
  • id="xxxItems" とつけたグループの1要素は繰り返し可能。PagexxxIndex フィールドに処理するインデックスが入る。
  • id 選んで Dolteng→Add Dynamic Property で生成したメソッドで動的なプロパティを設定できる。
  • id="isXxx"id="isNotXxx" とに対応する isXxx() メソッドによりHTML要素を出力するかどうかを条件分岐できる。display:none; ではないよ。
  • システム例外が発生した時の遷移先は src/main/resources/teedaErrorPage.dicon に記述する。
  • 例外が発生したときに遷移するページは TeedaExtensionErrorPageManager#addErrorPage で指定する。遷移先の Page クラスでは、exception という名前のプロパティを定義しておけば、自動的に発生した例外を受け取る事ができる。
  • /layout/layout.html は共通レイアウトとして使用される。<te:includeChildBody/> でページがレイアウトに埋め込まれる。<te:include src="/layout/header.html"/> で指定したファイルをインクルードして取り込める。
  • 共通レイアウトを適用したくない場合は Page クラスで public string getLayout(){return null;} とする。

S2Dao のメモ

  • chura Project には H2 というデータベースが入ってる。DbLauncher プラグインをインストールしていればメニューから起動できる。jdbc:h2:tcp://localhost:9092/demo がデモ
  • Eclipse のメニュー Window > Show View > Other... : Dolteng > DatabaseView でデータベースビューを表示。んで、chura-tutorial > jdbc.dicon > PUBLIC > EMP > (right click) > Generate Scaffold Application > OKCRUD 処理を実行するアプリケーションが自動生成される。Scaffold は足場という意味。src/main/webapp/view/emp/ フォルダにいくつかファイルが自動生成される。
  • データベースの設定は src/main/resourcesjdbc.dicon にある。
  • src/main/java - tutorial.chura.entity にテーブルのエンティティ用のクラスが自動生成される。@Bean(table="EMP") のようにテーブル名をBeansアノテーションで指定する。カラム名とプロパティが一致しない場合は @Column("Identifier") public Integer id; というようにColumnアノテーションで指定。主キーであることを明示的に指定する場合は @id を使う。
  • @Id(value = IdType.SEQUENCE, sequenceName = "myseq")
  • @Id(IdType.IDENTYTY) 自動採番機能
  • 自動生成されたDaosrc/main/java tutorial.chura.dao.EmpDao にある。
  • EmpEditPage > AbstractEmpPage > AbstractCrudPage という継承ツリーになってる。
  • S2Dao はエンティティにversionNoのプロパティがあると、更新の時に楽観的排他制御を行う
  • DatabaseViewDEPT のメニューから New Dao or Entity を実行すると Dept エンティティクラスと DeptDao が自動生成される。
  • DeptDaoSqlアノテーションで SQL を明示的に書く。

    @Sql("select id as value, dept_name as label from dept")
    public List<Map> selectValueLabel();
    
  • EmpDaopublic EmpDto[] selectWithDept(); を追加、selectWithDept を選択しつつ Dolteng > Open Dao PairDaoクラス名_メソド名.sql ファイルが自動生成される。 さらにこのSQLファイルから Dolteng > Create New DtoDto を生成できるので EmpDto と命名する。

  • @Arguments("arg")

  • SQLファイルの /*バインド変数コメント*/

  • SQLファイルの /*BEGIN*/,/*END*/, /*IF arg != null*/ で条件分岐(OGNL)

  • Dxo#convert メソッドで エンティティとページのプロパティの値の相互変換が可能。

感想

お仕事で S2Dao を利用するために読んだんだけど、 S2Dao の部分については非常に役に立ちました。 Teeda はよく分かんないままサラッと進んでいった感じかな…

Share
関連記事