# Reffi (RIA Extension Framework Fundamental Implementation) API

このドキュメントはMVCフレームワーク「Reffi（Nexaweb版）」のAPI仕様書です。

参照先:
説明

Common
jp.co.fujitsu.reffi.common.exception: アプリケーションにて共通で利用するExceptionクラスを提供します。
jp.co.fujitsu.reffi.common.util: 共通ユーティリティクラスを提供します。

このドキュメントはMVCフレームワーク「Reffi（Nexaweb版）」のAPI仕様書です。

## コンセプト

このフレームワークは以下のコンセプトとモチベーションで開発されています。

1. 明瞭なクライアント側MVCアーキテクチャ

   構成をView（xal + Action）、Controller、Modelに分けることで、 出来上がる成果物が自然に機能レイヤ分け、パッケージ分けされます。

2. ユーザインターフェース開発とコード開発の分離

   xalの開発、業務ロジックの開発を分離することで、デザイナとプログラマの分業が図れるようになります。

3. 開発ガイドラインとなる雛形処理フローの提供

   業務ロジックが決められたシステムロジックに沿って処理されることで、 処理フロー設計を省略出来ることを目指しています。
   又、決められたメソッドのオーバーライドによる業務ロジックの実装は、 メソッド名の命名等、地味ながらレビュー時コストが掛かる作業を省きます。

## 全体概要

ReffiにおいてMVCを構成する要素はBaseAction、BaseController、BaseModelの3クラスから成ります。
各クラスが受け持つ役割と、継承先の業務クラスとの関係は以下のようになります。

BaseAction

    ・擬似イベントハンドラの提供
    prepare

    ・実行モデル群予約メソッドの提供
    reserveModels

    ・Validationオブジェクト設定メソッドの提供
    validators

    ・実行前のモデルを操作する為のフックメソッド提供
    nextModel

    ・モデル処理結果ハンドラの提供
    successForward

    ・モデル処理失敗ハンドラの提供
    failureForward

←制御

BaseController

    ・初期化処理メソッドの提供
    initialize

    ・イベント紐付けメソッドの提供
    bind

    ・全イベントハンドリングのファサード
    handlerFacade

    ・アクションの実行
    executeAction

    ・登録モデル群の実行
    runModels～

    ・モデルの結果をアクションへ通知
    modelSuccess、modelFailure

→実行

BaseModel

    ・処理フローの提供
    preproc、mainproc、postproc

    ・モデル正常終了通知メソッドの提供
    fireModelSuccess

    ・モデル異常終了通知メソッドの提供
    fireModelFailure

↑継承 |  | ↑継承 |  | ↑継承 |

具象Action（一イベント毎に一個）

    ・業務処理内容に応じてBaseActionのメソッドを実装

具象Controller（アプリケーションに一個）

    ・初期化処理の実装

    ・イベント紐付け情報の定義

具象Model（任意でn個）

    ・mainprocを実装して機能実装

具象Modelに関しては、HTTP通信、Pub/Subの機能を実装した機能モデルをReffiパッケージで提供しています。
単純に上記を行うだけであれば、具象モデルを作成する必要は有りません。

## 開発の流れ

Reffiを使ってNexawebアプリケーションを構築する場合、以下の手順を踏みます。
題材はアプリケーション起動後、「Hello World Window」という名前のウィンドウが表示され、 ウィンドウ内の「Hello World」ボタンが押下されると、ラベルにHello Worldが表示されるものです。

1. 初期ページ(index.xal等)に具象コントローラを登録

   「controller」というidでBaseControllerを継承した具象コントローラをMCO登録します。
   （このケースではdemo.client.controllerパッケージのDemoControllerクラスとしています。）
   具象コントローラはアプリケーション内で唯一のMCOとなります。以降、コントローラの登録作業は発生しません。

       <xal xmlns="http://openxal.org/ui/java">
           <mco:mco xmlns:mco="http://openxal.org/core/mco" id="controller" src="demo.client.controller.DemoController"/>
           <rootPane>
           <window name="hwWindow" height="300px" title="Hello World Window" width="300px" x="10px" y="10px">
               <freePane>
                   <button name="hwWindow.btnHelloWorld" height="25px" text="Hello World" width="100px" x="80px" y="20px"/>
                   <label name="hwWindow.lblHelloWorld" height="20px" width="100px" x="80px" y="80px"/>
               </freePane>
               </window>
           </rootPane>
       </xal>

   この例ではControllerの他、hwWindowという名前のウィンドウ、hwWindow.hwHelloWorldという名前のボタン、 hwWindow.lblHellowWorldという名前のラベルを配置しています。
   （name属性値を「ウィンドウ名.エレメント名」としているのは、エレメント名のユニーク性を確保する為です。 規約では有りません。）

2. 具象コントローラを作成

   1で登録記述した具象コントローラを作成します。
   BaseControllerを継承したクラスとして作成して下さい。

       package demo.client.controller;

       import jp.co.fujitsu.reffi.client.nexaweb.controller.BaseController;

       public class DemoController extends BaseController {
       }

   BaseControllerはAbstractMcoを継承したクラスです。
   1でmco登録したことにより、BaseControllerインスタンスはNexawebのMcoContainer内に常駐するようになります。

3. 具象コントローラにイベント、アクションの紐付けを追加

   bindメソッドをオーバーライドして、引数EventBinderに対してイベント登録を行います。
   下記例は、1で配置したhwWindow.btnHelloWorldボタンが押下されると、HelloWorldActionが起動される紐付けを定義しています。

       package demo.client.controller;

       import jp.co.fujitsu.reffi.client.nexaweb.controller.BaseController;
       import jp.co.fujitsu.reffi.client.nexaweb.controller.EventBinder;
       import demo.client.menu.action.HelloWorldAction;

       public class DemoController extends BaseController {
           @Override
           protected void bind(EventBinder eventBinder) {
               // 「hwWindow.btnHelloWorld」エレメントが「onCommand」イベントを発行すると「HelloWorldActionクラス」が起動する紐付けを行います
               eventBinder.addEventBinding("hwWindow.btnHelloWorld", "onCommand", HelloWorldAction.class);
           }
       }

   これでエレメント、イベントタイプ、起動アクションの紐付け登録が行われました。

4. 具象アクションを作成

   最後に、イベント発生時実際に起動するアクションクラスを作成します。 アクションクラスはBaseActionを継承して作成します。

       package demo.client.helloworld.action;

       import jp.co.fujitsu.reffi.client.nexaweb.action.BaseAction;
       import jp.co.fujitsu.reffi.client.nexaweb.controller.ParameterMapping;

       import com.nexaweb.xml.Element;

       public class HelloWorldAction extends BaseAction {
           // 汎用イベントハンドルメソッド、prepareをオーバーライドします。
           @Override
           protected boolean prepare(ParameterMapping prepareMapping) throws Exception {
               // アクションを起こしたコンポーネントが存在するウィンドウからラベルエレメントを取ります。
               Element lblHelloWorld = getElementByNameFromOwnWindow("hwWindow.lblHelloWorld");
               // ラベルエレメントに対して「Hello World」テキスト属性を設定します。
               lblHelloWorld.setAttribute("text", "Hello World");

               return true;
           }
       }

   prepareメソッドはモデル実行前の前処理や、エレメント操作等のクライアント内で完結する処理等、 汎用的なイベントハンドリングメソッドとして使用出来ます。

   以上で一イベントの処理実装は終了です。イベントが増える毎に3～4を繰り返します。
   このケースではモデルは使用していません。HTTP通信等の機能モデルを使用した業務処理を実装する場合は、
   別途当リファレンス内のサンプルを参照して下さい。

Copyright(C) Fujitsu All Rights Reserved.