このフィーチャーは Platform 4.5.39 以降を要します。NFC は Platform4.5 では廃止され、xal 構文対応のため再導入されました。
Nexaweb Platform に付属するMVC (Model View Controller) を使用すると、データソースを Nexaweb クライアントのUI コンポーネントに接続できます。このオプションのコンポーネントは、Nexaweb Foundation 77Class パッケージに含まれています。MVC フレームワークは、View インスタンスとModel インスタンスで構成されるコントローラインスタンスに基づいています。View インスタンスと Model インスタンスは、Java Bean イベントなどのデータプロバイダイベントを使用してコントローラと通信します。コントローラは、これらのイベントのそれぞれに反応し、View から Model に、またはModel からView に適切な変更を伝達します。
Model (モデル)
com.nexaweb.nfc.mvc.model パッケージ内のモデルクラスには、Java Bean オブジェクトやXML ドキュメントと連係するための基本的なデータプロバイダと値プロバイダが含まれています。データプロバイダは、ビューの補助データを示すもので、コントローラにより提供される必要があります。値プロバイダは、コンテキスト固有の追加情報に基づいて、識別したデータオブジェクトからビューコンポーネントで使用される値を選択します。たとえば、リストベースの値プロバイダを使用して、Bean データプロバイダから返される1 つのBean オブジェクトからさまざまなプロパティを選択し、Bean が対応する行にさまざまなセルを作成します。
com.nexaweb.nfc.mvc.model パッケージ内のモデルクラスには、Java Bean オブジェクトやXML ドキュメントと連係するための基本的なデータプロバイダと値プロバイダが含まれています。データプロバイダは、ビューの補助データを示すもので、コントローラにより提供される必要があります。値プロバイダは、コンテキスト固有の追加情報に基づいて、識別したデータオブジェクトからビューコンポーネントで使用される値を選択します。たとえば、リストベースの値プロバイダを使用して、Bean データプロバイダから返される1 つのBean オブジェクトからさまざまなプロパティを選択し、Bean が対応する行にさまざまなセルを作成します。
com.nexaweb.nfc.mvc.model パッケージ内のモデルクラスには、Java Bean オブジェクトやXML ドキュメントと連係するための基本的なデータプロバイダと値プロバイダが含まれています。データプロバイダは、ビューの補助データを示すもので、コントローラにより提供される必要があります。値プロバイダは、コンテキスト固有の追加情報に基づいて、識別したデータオブジェクトからビューコンポーネントで使用される値を選択します。たとえば、リストベースの値プロバイダを使用して、Bean データプロバイダから返される1 つのBean オブジェクトからさまざまなプロパティを選択し、Bean が対応する行にさまざまなセルを作成します。
View (ビュー)
ビューは、com.nexaweb.nfc.components パッケージに含まれているNFC (Nexaweb Foundation Class) コンポーネントによって表示されます。com.nexaweb.nfc.mvc.renderers パッケージに含まれている付属のレンダラは、値プロバイダを使用して抽出される値に基づくコンポーネントの表示方法の変更を容易にします。CellRenderer クラスなど、テキストベースなサブコンポーネントのデフォルトレンダラは、単に、これらの値のString 表現をテキストに入力します。これにより、コンポーネントにデータを入力するためのコード記述量を最小限にすることができます。必要になれば、カスタムレンダラを使用することで、コンポーネントについてのより複雑な決定(色など) を柔軟に行うことができます。
コントローラ
標準のコントローラは、com.nexaweb.nfc.mvc.controllers パッケージに含まれています。コントローラは、モデルインターフェイスの各タイプのインスタンスで構成する必要があります。たとえば、TableController は、IDataProvider、IValueProvider、および作成するテーブルで構成する必要があります。
Nexaweb には、次のコントローラが用意されています。
- ListBoxController - データプロバイダと値プロバイダからリストボックスを作成します。
- TableController - データプロバイダとリスト値プロバイダからテーブルを作成します。
- TreeController - 入れ子になったデータプロバイダと値プロバイダからツリーを作成します。
- TreeTableController - 入れ子になったデータプロバイダとリスト値プロバイダからtreeTable を作成します。入れ子になったデータプロバイダと値プロバイダからメニューを作成します。
- MenuController -
また、コントローラは、ワンタイム(コンポーネントを作成して、それ以降の変更はなし)、ワンウェイ(コンポーネントを作成して、すべてのデータ変更を反映)、またはツーウェイ(モデルからビュー、およびビューからモデルへのデータの送信が可能) でバインドするように構成できます。
サンプル
このサンプルでは、NFC フレームワークを使用して、XML データをサーバーから読み取りテーブルにロードするMVC ベースのアプリケーションを実装します。詳細については「NFC」を参照してください。
データは、XML フォーマットで保存されます。
<customers> <customer> <first_name>Robert</first_name> <last_name>Buffone</last_name> <customer_id>1</customer_id> </customer> <customer> <first_name>John</first_name> <last_name>Constantine</last_name> <customer_id>37</customer_id> </customer> <customer> <first_name>Dave</first_name> <last_name>Gennaco</last_name> <customer_id>47</customer_id> </customer> </customers>
このプロジェクトのUI XML を次に示します。
<nxml> <mco:declarations xmlns:mco="http://nexaweb.com/mco"> <mco:mco id="customerTableController" src="CustomerTableControl"/> </mco:declarations> <rootPane> <borderLayout/> <panel borderPosition="center"> <borderLayout/> <table height="105" width="200" x="90" y="200" borderPosition="center" onCreate="mco://customerTableController.handleTable(this)"> <column> <header text="Customer ID"/> </column> <column> <header text="First Name"/> </column> <column> <header text="Last Name"/> </column> </table> </panel> </rootPane> </nxml>
プロジェクトの MCO のJava ファイルは以下のようなものです(CustomerTableControl.java):
import java.util.Vector; import com.nexaweb.client.mco.AbstractMco; import com.nexaweb.nfc.components.*; import com.nexaweb.nfc.mvc.controllers.*; import com.nexaweb.nfc.components.Application; import com.nexaweb.nfc.mvc.model.*; import com.nexaweb.xml.*; /** * Class to control a table using the model view controller * classes in NFC. */ public class CustomerTableControl extends AbstractMco { private static Vector s_data = new Vector(); /** * Populate some sample beans to use with the data provider. */ static { s_data.add(new Customer(1, "Robert", "Buffone")); s_data.add(new Customer(37, "John", "Constantine")); s_data.add(new Customer(47, "Dave", "Gennaco")); } /** * Use this class to load the data and control the table * element using MVC. * * @param tableElement The table element. */ public void handleTable(Element tableElement) { // Get the application context used by NFC for this session Application app = Application.getApplication(getSession()); // Get the table to control (the view) Table customerTable = (Table) app.getComponent(tableElement); // This will be the order in which the values are extracted from each // customer record (the column order) using the indexed value provider String [] valueSelectionList = {"id","firstName","lastName"}; try { // Create a data provider to present the list of customers. // This is the model. BeanDataProvider customerDataProvider = new BeanDataProvider(); customerDataProvider.setData(s_data); // Create an indexed value provider to select each piece of // information // for each column BeanValueProvider customerValueProvider = new BeanValueProvider( valueSelectionList); // Set up the table controller TableController tableController = new TableController( customerDataProvider, customerValueProvider, customerTable); // Fire the refresh, this will populate the table with values // retrieved from the data providers by signalling the controller // from the model side customerDataProvider.fireRefreshEvent(); } catch (Exception e) { System.out.println("Exception controlling table"); e.printStackTrace(); } } /** * Customer class, to simulate a bean or DTO for use in this example. * * @author dgennaco */ public static class Customer{ private int _id; private String _firstName; private String _lastName; public Customer(int id, String first, String last) { _id = id; _firstName = first; _lastName = last; } public void setId(int id) { _id = id; } public void setFirstName(String first) { _firstName = first; } public void setLastName(String last) { _lastName = last; } public int getId() { return _id; } public String getFirstName() { return _firstName; } public String getLastName() { return _lastName; } } }