データフォーマッタ

Overview

Platform 4.2+ が必要

フォーマッタ

フォー マッタは、データソースから取得したデータを表示用に変換します。たとえば、フォーマッタは数値オブジェクト 1123.8 を、ユーザーインターフェイスによる表示用に文字列 "$1,123.80" に変換できます。各バインディングには、データが経由するフォーマッタのチェーンがあります。

フォーマッタの宣言は、データ ソースの宣言に似ています。次の例に、フォーマッタを示します。

<formatter id=”customers” class=”com.nexaweb.plugin.data.formatter.MessageFormatter” format="There are {0} customers in the database"/>

次の表に、独自のフォーマッタを定義する方法を示します。
フォーマッタの定義メソッド
説明
用意されているタグ
Nexaweb には、定義済みの formatter タグが付属しています。
カスタム タグ
表示する UI 用の適切なフォーマットにデータを変換するタグを宣言するには、Nexaweb のプラグイン アーキテクチャを使用します。

独自のフォーマッタを定義する方法の詳細については、「フォーマッタの作成」を参照してください。

また、Nexaweb には UI での表示用にデータを変換するための次のフォーマッタタグが用意されています。
  • messageFormatter
  • decimalFormatter
  • dateFormatter
  • currencyFormatter
  • stringToDateFormatter
  • formatterChain
定義済みフォーマッタの詳細については、「用意されているタグ」を参照してください。

メモ: Nexaweb は、すべてのニーズを満たす検証を提供するわけではありません。たとえば、Nexaweb には州の略語、郵便番号、電話番号などのためのフォーマッタは用意されていません。ただし、Nexaweb が提供する formatter タグを使用すれば、これらの機能を実現するフォーマッタを簡単に作成できます。

 

Supplied Formatter Tags

Platform 4.2+が必要
用意されているフォーマッタ タグ

ここでは、Nexaweb で用意されているフォーマッタタグについて説明します。

フォーマッタ タグ

com.nexaweb.plugin.data.formatter API を使用して作成したフォーマッタクラスを宣言するには、フォーマッタタグを使用します。

フォーマッタタグには次の属性が含まれています。
属性
説明
ID
システム全体で一意な値を使用し、このフォーマッタを一意に識別します。
class
フォーマッタ インターフェイスを実装する Java クラスの名前を識別します。

フォーマッタ タグを使用して独自のフォーマッタ クラスを宣言することに加えて、異なる属性を使用する独自のタグを作成することもできます。

messageFormatter タグ

文字列メッセージで使用するパターンおよびフォーマットを指定するには、java.text.message フォーマットに基づく messageFormatter タグを使用します。

messageFormatterタグには次の属性が含まれています。
属性
説明
必須/省略可能
id
システム全体で一意な値を使用し、この messageFormatter を一意に識別します。
必須
format
有効な java.text.MessageFormat パターン文字列を定義します。
必須
locale
"en_US" などのロケール文字列です。
省略可能

出力

messageFormatterタグは常に java.lang.String オブジェクトを出力します。これは、このフォーマッタのクラスが java.text.MessageFormat クラスを使用するからです。

入力

次の表に、各フォーマット文字列で許可される入力の型を示します (このクラスでは java.text.MessageFormat クラスを使用するため、指定したフォーマット文字列によって許容される入力が決まります)。
フォーマット文字列
許容される入力
"There are {0} customers"
  • Object
  • Object[] { Object }
  • Object[] { Object, ...}
  • List( Object,... )
  • Vector( Object,... )
  • 要素が 1 つ以上の任意のプリミティブ配列
"There are {0,number} customers"
  • Number
  • Object[] { Number }
  • Object[] { Number, ...}
  • List( Number )
  • Vector( Number )
  • 任意のプリミティブ型数値配列 (たとえば、int[]{int,...)
"There are {1} customers"
  • String
  • Object[] { Object, Object }
  • Object[] { Object, Object, ...}
  • List(Object,Object,...)
  • Vector(Object,Object,...)
  • 要素が 2 つ以上の任意のプリミティブ配列
"There are {0, number} customers with {1} cars"
  • Object[] { Number, String }
  • List(Number,String,...)
  • Vector(Number,String,...)

メ モ: 1.4 以降の JVM では、Nexaweb は文字列を数値に解析することが可能な限り、数値が求められるすべての箇所で、getFormatsByArgumentIndex() メソッドを使用して文字列オブジェクトを受け取ります。また、Newxaweb は Long.parseLong(String) またはデフォルトの DateTime インスタンスで文字列を解析することが可能な限り、日付が求められるすべての箇所で、文字列を受け取ります。

JVM 1.3 以前の環境では、Nexaweb は引数を求められる型に変換できるとは限りません。これは MessageFormat API で十分な情報が提供されないからです。Nexaweb は、元の引数でフォーマット設定が失敗した場合、引数の変換を試みます。ただし、これがうまくいくのは一部のケース (getFormats() と getFormatsByArgumentIndex() が同じフォーマット配列を返す場合) に限られます。たとえば、"My string with a date: {0,date}, a number {1,number} and some string {2}"というフォーマット文字列の場合、getFormats() と getFormatsByArgumentIndex() は同じ結果を返します。

しかし、"My string with some string {2}, a number {1,number} and a date: {0,date}" というフォーマット文字列の場合、これらのメソッドは同じ値を返しません。

いずれのフォーマット文字列でも、getFormatsByArgumentIndex() は同じフォーマットの配列 [DateFormat,NumberFormat,null] (null はフォーマットなし、または String のみを表します) を返します。しかし、getFormats() は最初の例では [DateFormat,NumberFormat,null]、2 番目の例では [null, NumberFormat,DateFormat] をそれぞれ返します。したがって、JVM 1.3 以前の環境で最良の結果を得るには、MessageFormatter に適切な引数の型を渡します。

currencyFormatter タグ

数値から通貨文字列を作成するには、java.text.NumberFormat に基づく currentyFormatter タグを使用します。

currentyFormatterタグには次の属性が含まれています。
属性
説明
必須/省略可能
id
システム全体で一意な値を使用し、この currencyFormatter を一意に識別します。
必須
locale
"en_US" などのロケール文字列です。
省略可能

decimalFormatter タグ

10 進数のフォーマット文字列を作成するには、java.text.DecimalFormat に基づくdecimalFormatterタグを使用します。
decimalFormatterタグには次の属性が含まれます。
属性
説明
必須/省略可能
id
システム全体で一意な値を使用し、この messageFormatter を一意に識別します。
必須
format
"##.0#%" などの 10 進数フォーマット パターンです。
必須
locale
"en_US" などのロケール文字列です。
省略可能

dateFormatter タグ

文字列から日付を作成するには、java.text.DateFormat に基づくdateFormatterタグを使用します。

dateFormatterタグには次の属性が含まれます。
属性
説明
必須/省略可能
id
システム全体で一意な値を使用し、この dateFormatter を一意に識別します。
必須
locale
"en_US" などのロケール文字列です。
省略可能
format
このフォーマッタへの入力が Date 型または Long 型の場合、dateFormatter はこのパターンを使用して、フォーマット設定を実行する SimpleDateFormat インスタンスを構築します。
メモ: format を指定した場合、dateFormatInstancedateStyletimeStyleの各属性は無視されます。
すべてのロケールが SimpleDateFormat をサポートするわけではありません。したがって完全な汎用性を実現するには、formatではなく、無視されると指摘した属性を使用します。
省略可能
stringToDateFormat
こ のフォーマッタへの入力が String 型の場合、埋め込みの StringToDateFormatter はこのパターンを使用して String を Date に変換します。一般に、DateFormatter への引数が String の場合、次の手順が実行されます。
  1. 埋め込みの StringToDateFormatter が stringToDateFormat (指定されている場合) を使用して、String を Date に変換します。stringToDateFormatが指定されている場合は、SimpleDateFormat インスタンスを構築します。それ以外の場合は、デフォルトのパターンを使用して SimpleDateFormat インスタンスが構築されます。このインスタンスでは、属性値 lenient および timeZone が設定されます。この SimpleDateFormat インスタンスを使用した解析が失敗した場合、StringToDateFormatter は次の処理も試みます。

    - String を Long として解析し、解析済みの Long を使用して Date オブジェクトを構築します。
    - RFC1123 フォーマット "EEE, dd MMM yyyy HH:mm:ss z" を使用します。
    - RFC1036 フォーマット "EEEEEEEEE, dd-MMM-yy HH:mm:ss z" を使用します。ASCTIME フォーマット "EEE MMM d HH:mm:ss yyyy" を使用します。

    これら 3 つのフォーマッタのデフォルトのロケールは Locale.US、タイムゾーンは GMT です。

  2. 手順 1 で返された Date オブジェクトを、format (指定されいてる場合)、または dateFormatInstance、dateStyle、timeStyle の各属性の組み合わせを使用して、フォーマット設定します。フォーマット設定を行うために選択された DateFormat インスタンスは、locale属性と timeZone 属性の値を継承します。
省略可能
stringToDateLocale
埋め込みの StringToDateFormatter が文字列引数を解析するために使用するロケールです。
省略可能
dateFormatInstance
日付のフォーマットを、日付のみ、時間のみ、または日付と時間の両方として指定します。
値: date、time、または date,time
デフォルト: date
メモ: format属性を使用した場合、dateFormatInstanceは無視されます。詳細については、format 属性の説明を参照してください。
省略可能
dateStyle
dateFormatInstance 属性で指定する日付フォーマットの一部として日付を含める場合は、この属性を使用して、フォーマット設定される日付文字列の長さを指定します。
値: short、medium、long、または full
 
timeStyledateFormatInstance属性で指定したdata formatにtimeを含む場合、この属性を使用しformatted timeの長さを指定します。
値: short、medium、long、または full
デフォルト: medium
メモ:format属性を使用した場合、この属性は無視されます。詳細については、format 属性の説明を参照して下さい。
 
LenientDateFormatterへの入力が文字列の場合、StringToDateFormatterがlenient parsingを行うかどうか指定する
値: true | false
デフォルト:true
 
timeZoneこの Dateformatterへの入力をパースおよび/またはフォーマットするために使用する time zone 文字列を指定する
値:time zone 文字列、例えば PST
この属性を使用しない場合、TimeZone.getDefault() がデフォルト TimeZone を提供する。
 

stringToDateFormatter Tag

Nexaweb Java アプリケーションにのみ利用可能

stringToDateFormatter タグを使用し、テキストスタイルフォーマットなしに文字列からdateを作成します。
stringToDateFormatter タグは次の属性を含みます。

属性説明必須/省略可能
idシステム全体で一意な値を使用し、このdateFormatter を一意に識別します。必須
formatformat() method の文字列引数をDateに変換するために使用する特別なパターン。
この属性を指定するかどうかに拘らず、NexawebはStringをDateに変換するために、次のステップに従います。:
  • 指定したformatもしくはデフォルトフォーマットで構築されたSimpleDateFormat instance を使用しParseする。locale,lenientand timeZone属性値はこのinstanceに設定される。
  • 文字列をLong型としてParseし、parseされたLong型を使用しDate objectを構築する
  • RFC1123 formatを使用: "EEE, dd MMM yyyy HH:mm:ss z"
  • RFC1036 formatを使用: "EEEEEEEEE, dd-MMM-yy HH:mm:ss z"
  • ASCTIME formatを使用: "EEE MMM d HH:mm:ss yyyy"

これら3つのデフォルトformatterのlocaleはLocaleになる。USとtimezoneはGMT。

省略可能
locale"en_US"などのロケール文字列です。Optional
lenientDateFormatterへの入力が文字列の場合、lenient属性はStringToDateFormatter により実施されたparseがlanientかどうかを指定します。Lanientとは?
値: true | false
デフォルト: true
Optional
timeZoneこのDateformatterへの入力をParsingおよび/またはformattingするために使用するtime zone文字列を指定する
値:time zone文字列、例えばPST
この属性を使用しない場合、TimeZone.getDefault()がデフォルトTimeZoneを提供する。
省略可能

 

Creating a Formatter

データをフォーマット設定するモジュールの定義
Nexaweb では、データ バインディング フレームワークの一部として、データを UI での表示用に変換する独自の機能を実装できます。たとえば、データ ソースから返されたカスタム オブジェクトを適切な文字列に変換する独自のフォーマッタを実装することができます。フォーマッタの機能を実装するには、API セクションで定義されている必須インターフェイス (com.nexaweb.plugin.data.formatter.Formatter) を実装する必要があります。

Nexaweb には、定義済みの formatter タグが付属しています。このタグを使用し、実装するインターフェイスを利用することができます。それには、実装のクラスを formatter タグの class 属性として指定します。

フォーマッタタグ

最も基本的なフォーマッタ タグである formatter は、フォーマッタの実装クラスと ID を使用してフォーマッタを定義します。
属性
説明
必須/省略可能
id
フォーマッタを一意に識別します。開発者は、システム全体で一意な値を指定するよう注意する必要があります。
必須
class
フォーマッタの実装を識別します。
必須

さらに、開発者は独自のフォーマッタ タグ定義を作成することもできます。