Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Next »

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

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

  • No labels