MVC Framework

このフィーチャーは Platform 4.5.39 以降を要します。NFC は Platform4.5 では廃止され、xal 構文対応のため再導入されました。

Nexaweb Platform に付属するMVC (Model View Controller) を使用すると、データソースを Nexaweb クライアントのUI コンポーネントに接続できます。このオプションのコンポーネントは、Nexaweb Foundation Class パッケージに含まれています。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 を次に示します。

<xal xmlns="http://openxal.org/ui">
<mco:declarations xmlns:mco="http://openxal.org/core/mco">
<mco:mco id="customerTableController" src="CustomerTableControl"/>
</mco:declarations>
<borderPane>
<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>
</borderPane>
< /xal>

プロジェクトの 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;
}
}
}