Apcoordinator ユーザーズガイド |
目次 |
第3部 Webアプリケーションの開発 | > 第15章 UJIタグを使ったプログラミング | > 15.5 タグによるXMLデータの利用 |
画面部品タグやコンポーネントタグでは、通常のデータBeanと同様にXMLデータBeanを使用することができ、XMLデータを表示したり、入力データでXMLを更新したりすることが可能です。XML内のどのデータをタグで使用するかは、XPathを使って指定します。 以下のタグでXMLデータが利用できます。
タグ | 機能 |
---|---|
uji:table | 表形式のデータを画面に展開 |
uji:tree | ツリー構造のデータを画面に展開 |
uji:list | リスト形式のデータを画面に展開 |
uji:switch | 条件によって異なる画面を展開 |
uji:composite | XMLデータBeanの一部の取り出し |
uji:compositeName | XMLデータBeanの一部を更新するための入力項目名を生成 |
uji:value | 画面展開中の値を表示 |
uji:getProperty | XML要素の内容を表示 |
uji:name | 画面展開中のデータを更新するための入力項目名を生成 |
uji:input | クライアントスクリプトを記述する場合にHTMLのINPUTタグの代わりに使用 |
uji:textarea | クライアントスクリプトを記述する場合にHTMLのTEXTAREAタグの代わりに使用 |
uji:select | クライアントスクリプトを記述する場合にHTMLのSELECTタグの代わりに使用 |
uji:fieldString | 文字列入力フィールド |
uji:fieldEJString | 外字対応文字列入力フィールド |
uji:fieldLong | 整数入力フィールド |
uji:fieldDouble | 実数入力フィールド |
uji:fieldBigInteger | 十進整数入力フィールド |
uji:fieldBigDecimal | 十進数入力フィールド |
uji:fieldDate | 日付・時刻入力フィールド |
uji:fieldTextArea | 複数行テキスト入力フィールド |
uji:checkBox | チェックボックス |
uji:radioButton | ラジオボタン |
uji:pushButton | プッシュボタン |
uji:anchor | アンカー |
uji:comboBox | コンボボックス |
uji:listBox | リストボックス |
uji:buttonList | ボタンリスト |
uji:recordView | レコードビュー |
uji:tableView | テーブルビュー |
uji:treeView | ツリービュー |
次のいずれかのタグを使用してXMLデータの更新を行う場合、XMLデータに名前空間を使用することはできません。
- uji:getProperty
- uji:fieldTextArea
- uji:comboBox
- uji:listBox
- uji:buttonList
uji:fieldEJStringタグでXMLデータを利用し、かつ、Fujitsu XML プロセッサを使用する場合は、XMLデータの文字コードに以下のどちらかを使用してください。
- UTF-8
- UTF-16
以下のXMLを例にして、基本的な入出力の方法を説明します。
XML(catalog.xml)
<?xml version="1.0" encoding="iso-2022-jp" ?> <catalog> <item> <name>赤ワイン</name> <content>1000ml</content> </item> <price>2000</price> </catalog>
このXMLデータのname要素を表示し、price要素の内容を入力するアプリケーションを例として説明します。ビジネスクラスでは、XMLデータBeanを作成します。以下の例では、XMLをWEB-INFフォルダ直下に置いたファイル"catalog.xml"から読み込み、作成したXMLデータBeanに"body"という名を付けています。
ビジネスクラス
import java.io.File;
import java.io.BufferedInputStream;
import java.io.FileInputStream; import javax.servlet.ServletContext; import com.fujitsu.uji.DispatchContext;
import com.fujitsu.uji.http.HttpDispatchContext; import com.fujitsu.uji.xml.XmlDataBean; .... public void startup(DispatchContext context) { try { // ロードするファイルを表すFileオブジェクトを作成 ServletContext sc = ((HttpDispatchContext)context).getServletContext(); String root = sc.getRealPath("/"); File file = new File(root, "/WEB-INF/catalog.xml"); // XMLデータBeanを作成 XmlDataBean xmlBean = new XmlDataBean(); // XMLデータを読み込み BufferedInputStream in = new BufferedInputStream(new FileInputStream(file)); xmlBean.loadFrom(in); // 出力するデータBeanを設定 context.setResponseBean("body", xmlBean); } catch (Exception e) { e.printStackTrace(); } } ....
入出力ページでは、name要素の表示にはuji:getPropertyを、price要素の入力にはuji:fieldStringを使用します。以下は入出力ページの例です。
入出力ページ
<%@ page contentType="text/html; charset=shift_jis" %>
<%@ taglib uri="uji-taglib" prefix="uji" %>
<uji:useBean id="body" cls="com.fujitsu.uji.xml.XmlDataBean" request="true" />
<form method="post"> <input type="hidden" name="uji.id" value="body"> <input type="hidden" name="uji.verbs" value="update"> 商品情報<br> 品名: <uji:getProperty bean="body" xpath="item/name"/> <br> 価格: <uji:fieldString bean="body" xpath="price"/>円 <br> <input type="submit" name="update" value="更新"> </form>
uji:getPropertyタグで表示するXMLデータの要素を指定するには、タグのbeanアトリビュートとxpathアトリビュートを使用します。beanアトリビュートにはXMLデータBeanに付けた名前を指定します。そのXMLデータBean内のどの要素を表示するかは、xpathアトリビュートにXPathで指定します。このXPathは、beanアトリビュートで指定したXMLデータBeanのルート要素からの相対パスで指定します。
xpathアトリビュートを省略した場合には、beanで指定したXMLデータBeanのルート要素がタグで使用されます。beanアトリビュートを省略した場合は、カレントオブジェクトが代わりに使用されます。
XMLデータBean使用時は、コマンドマップとページマップの書き方が通常とは異なります。詳しくは関係定義ファイルの書き方を参照してください。
ブラウザの表示は次のようになります。
文字列入力フィールドやテキストエリアなどの入力部品用のタグでXMLデータを使用すると、入力されたデータでXMLが更新されます。上記の例ではuji:fieldStringがprice要素を使用しています。したがって、ブラウザで"5250"と入力して更新ボタンを押すと、XMLデータBean内のprice要素が更新されて次のようになります。
XML(catalog.xml)
<?xml version="1.0" encoding="iso-2022-jp" ?> <catalog> <item> <name>赤ワイン</name> <content>1000ml</content> </item> <price>5250</price> </catalog>
フォームを作成する際は、通常のデータBeanを利用した場合と同様に、必要に応じてリクエストパラメタuji.id、uji.verbsが送信されるようにしてください。<input type="hidden">タグを記述することによってこれらのリクエストパラメータを送信させることができます。新規作成したXMLデータBeanに入力データを格納する場合は、リクエストパラメタuji.bean、uji.xmlBeanの値を以下のように与えてください。
<form method="post"> <input type="hidden" name="uji.bean" value="com.fujitsu.uji.xml.XmlDataBean"> <input type="hidden" name="uji.xmlBean" value="catalog"> <input type="hidden" name="uji.verbs" value="add"> 商品情報<br> 品名: <uji:getProperty bean="body" xpath="item/name"/> <br> 価格: <uji:fieldString bean="body" xpath="price"/>円 <br> <input type="submit" name="add" value="追加"> </form>
XMLデータBeanを使う場合は、コマンドマップとページマップの書き方が通常とは異なります。データBeanのクラス名(com.fujitsu.uji.xml.XmlDataBean)の代わりにXMLデータBeanのルート要素の要素名を使い、その要素名の先頭に"/"を付加します。ルート要素が"catalog"であるXMLデータBeanを使った例を示します。
コマンドマップ
/catalog;add=sample.CatalogHandler.add
ページマップ
/catalog;=catalogForm.jsp
以下は、リストやテーブルなどの複数のデータの組を必要とするタグです。これらのタグでXMLデータを利用するには、それぞれのタグに合わせた構造のXMLを使用する必要があります。
タグ 説明 uji:comboBox コンボボックス uji:listBox リストボックス uji:buttonList ボタンリスト uji:recordView レコードビュー uji:tableView テーブルビュー uji:treeView ツリービュー uji:table 表形式のデータを画面に展開 uji:list リスト形式のデータを画面に展開 uji:tree ツリー構造のデータを画面に展開
各タグが必要とするXMLデータの構造はUJIタグリファレンスを参照してください。ここでは、uji:comboBoxを例にしてXMLデータの表示方法、入力方法、必要となるXMLデータの構造を説明します。
以下は、コンボボックスを表示するのに必要なXMLデータとタグの例です。
表示されるコンボボックス
XML
<root> <selected>野球</selected> <sports> <data>野球</data> <data>サッカー</data> <data>テニス</data> </sports> </root>
タグ
<uji:comboBox bean="body" xpath="sports" selectedXPath="selected"/>
コンボボックスの選択肢として表示されるデータはuji:comboBoxのxpathアトリビュートで指定します。xpathで指定した要素の子要素がそれぞれ選択肢として使用されます。上記の例では、sports要素内のdata要素3個が選択肢になります。
selectedXPathアトリビュートは、選択状態の保存先となる要素をXPathで指定します。この指定はbeanアトリビュートで指定したXMLデータBeanのルート要素からの相対指定です。上記の例では、selected要素が保存先となります。リクエスト処理時には、コンボボックスで選択された選択肢の表示文字列によってselected要素の内容が書き換えられます。画面表示時には、デフォルトで選択されている選択肢としてselected要素の内容が使われます。
コンボボックスに表示される文字列と、selectedXPathで指定した要素に保存される文字列を別にしたい場合は、uji:comboBoxのvalueAttrアトリビュートを使います。選択肢となる要素の属性名をvalueAttrに指定すると、その属性の値が選択状態の保存時に使われます。上記の例で「野球」が選択されたときにselected要素に「baseball」が保存されるようにするには、以下のように記述します。
XML
<root> <selected>baseball</selected> <sports> <data code="baseball">野球</data> <data code="soccer">サッカー</data> <data code="tennis">テニス</data> </sports> </root>
タグ
<uji:comboBox bean="body" xpath="sports" selectedXPath="selected" valueAttr="code"/>
選択された要素の属性に選択状態を保存するには、selectedXPathで@に続けて属性名を記述します。前述のコンボボックスで、「野球」が選択されたときに要素"<data>野球</data>"のselected属性の値がtrueになるようにするには、以下のように記述します。
XML
<root> <sports> <data selected="false">野球</data> <data selected="true">サッカー</data> <data selected="false">テニス</data> </sports> </root>
タグ
<uji:comboBox bean="body" xpath="sports" selectedXPath="@selected"/>
xpathアトリビュートやselectedXPathアトリビュートで指定する要素は、以下の条件を満たす必要があります。
uji:comboBoxに限らず、どのタグでも使用する要素は複合要素または単純要素です。混合要素を使用するタグはありません。
uji:comboBoxのように項目クラスが必須となるタグでも、XMLデータBeanを使用する場合は項目クラスが必須ではありません。ただし、項目クラスを使用した方が性能が上がります。また項目クラスを使用して表示属性などを動的に変更することも可能です。項目クラスでXMLを利用する方法についてはXML用の項目クラスを参照してください。
xpathアトリビュートで指定された要素や、selectedXPathアトリビュートで指定された要素または属性が存在しなかった場合、データの表示と更新は次のように実行されます。
目次 |