UIX開発者ガイド | ![]() 目次 |
![]() 前へ |
![]() 次へ |
JavaServer Pages(JSP)は、Webインタフェースを開発するためのテクノロジとしてよく知られています。大規模なエンタープライズ・アプリケーションを作成する場合は、uiXMLのような完全に宣言的なテクノロジの方が堅牢かつ高性能なアーキテクチャであると言えます。しかし、このテクノロジを使用しないというユーザーのため、uiXML開発者が使い慣れた構文によってUIXライブラリのほとんどの機能にアクセスできるタグ・ライブラリが用意されています。
ここでは、次の項目について説明します。
Tomcat 4やOC4J 9.0.3などのJSP 1.2準拠エンジンでは、WEB-INF/libディレクトリにUIX JARをインストールすれば、UIX JSPタグもインストールされます。他のタグ・ライブラリと同じように、そのライブラリに使用する接頭辞を宣言する必要があります。したがって、UIXタグ・ライブラリを使用する各JSPページの最上部付近に次の行を追加します。
<%@ taglib uri="http://xmlns.oracle.com/uix/ui" prefix="uix" %>
使用するサーブレット・エンジンでこれがサポートされていない場合、またはUIX JARを別の場所にインストールした場合は、追加のインストール操作を行う必要があります。uix.tld
ファイルをWebアプリケーションのWEB-INFサブディレクトリに移動し、WEB-INF/web.xmlファイルに次の行を追加します。
<taglib>
<taglib-uri>http://xmlns.oracle.com/uix/ui</taglib-uri>
<taglib-location>/WEB-INF/uix.tld</taglib-location>
</taglib>
(uix.tld
ファイルは、現在、開発バンドル内のuix2-src.zipのWEB-INF
ディレクトリ内にあります。インストール可能なメインの .zipファイルに移動してもかまいません。)
どちらの場合も、任意の接頭辞文字列を使用できます。ここでは、uixという文字列を使用します。
JSPタグ・ライブラリには、uiXMLの多くの機能がありません。機能がまだ実装されていないだけの場合もありますが、JSPタグ・テクノロジは、XMLコードでサポートされる機能を使用できないという点で、根本的に限界があります。
XMLでは、要素に対するデフォルトのネームスペースの概念がサポートされています。
<ui:form ...>
<ui:contents>
<!-- OK, enough with "ui:"; let's give ourselves a
default namespace -->
<stackLayout xmlns="http://xmlns.oracle.com/uix/ui">
<contents>
<textInput .../>
これによってXMLファイルでの入力作業が大幅に低減されますが、残念ながらJSPではこれがサポートされていません。すべての要素に対して接頭辞を使用する必要があります。
<ui:form ...>
<uix:contents>
<uix:stackLayout>
<uix:contents>
<uix:textInput .../>
uiXMLでは、簡略的なデータ・バインドを定義するために、属性にdata:という接頭辞を使用します。
<styledText data:text="foo@bar"/>
JSPでは、この構文は使用できません。かわりに、各属性名にBinding
という接尾辞を追加します。
<uix:styledText textBinding="foo@bar"/>
uiXMLの場合と同じように、データ・バインドは、表データのように1つの文字列で直接設定できない属性に対して使用できます。
<uix:table tableDataBinding="foo@bar"/>
また、uiXMLでは、ネームスペースとローカル名の両方でDataObject
を登録できます(この点について理解が不十分な場合は、「データ・バインド」のトピックを参照してください)。JSPでは実際にはネームスペースがサポートされないため、UIX JSPではネームスペースがサポートされません。DataObject
はすべて、空の文字列のネームスペース(NULLではなく""
)で登録する必要があります。
最後に、UIX JSPでは<boundAttribute>
要素がサポートされないことも付け加えておきます。この制限を回避する方法については、後述します。
uiXMLでは、UINode
の索引付けされたすべての子を包含するのに、<contents>
要素を使用します。この追加要素を使用すると、構文における潜在的なあいまいさが大幅に低減され、高品質のコード・インサイトを提供するツールの能力が向上します。さらにシステムも、これらの追加要素が解析時のパフォーマンスにあまり影響を与えないようなアーキテクチャになっています。解析結果はキャッシュされるため、ファイルが一度解析された後は、パフォーマンスにもメモリー使用にも影響はまったくありません。
しかし、JSPタグは個別にJavaコードに変換されてから、Java.classファイルに変換されます。追加された各タグによってJavaコードが増えるため .classファイルのサイズが大きくなります。このファイルの実行には時間がかかるだけでなく、ロードを継続するためにメモリーがより必要になります。さらに、回避策を講じなければ、Javaでのメソッド・サイズに一定の制限が生じることもあります。このため、ユーザー・インタフェースに必要なタグの数を減らす解決方法を見つける必要がありました。ほとんどすべての場合において最も単純な解決策の1つは、<uix:contents>
をオプションにすることでした。
ただし、重要な例外があります。一部の要素は、そのコンテキストに応じて「名前の付けられた子」のタグもしくはUINode
タグとして機能するため、意味を明確にするために<uix:contents>
が必要になります。たとえば、<uix:separator>
要素は一般に水平分割線を提供します。
<uix:form>
<uix:textInput .../>
<uix:separator/>
<uix:textInput .../>
</uix:form>
しかし、<uix:separator>
要素は<uix:flowLayout>
内で使用される場合、ラッパーとして機能します。<uix:separator>
の内部の要素はそれぞれ、フロー・レイアウト内の要素の各組の間でスタンプされます。たとえば、次のUIXでは「a between b between c」というテキストが生成されます。
<uix:flowLayout>
<uix:separator>
<uix:styledText text=" between "/>
</uix:separator>
<uix:text text="a"/>
<uix:text text="b"/>
<uix:text text="c"/>
</uix:flowLayout>
<uix:flowLayout>
内部に、その最初の意味の<uix:separator>
が必要な場合は、<uix:contents>
を使用する必要があります。
<uix:flowLayout>
<uix:contents>
<uix:text text="a"/>
<uix:separator/>
<uix:text text="b"/>
</uix:contents>
</uix:flowLayout>
状況によって<uix:contents>
を必要とする要素と、この状況を引き起こす各要素の親のリストを次に示します。
要素の名前 | 親の名前 |
---|---|
<uix:separator> |
<uix:flowLayout> 、<uix:stackLayout> 、<uix:styledList> |
<uix:contentFooter> |
<uix:pageLayout> |
uiXMLでは、コードの記述もクラスの再コンパイルも行うことなく実行時に新しいユーザー・インタフェース要素を定義できるテンプレート・テクノロジがサポートされています。しかし、JSPタグではタグごとに新しいJavaクラスが必要であり、静的に定義された属性セットも必要です。したがって、UIX JSP内ではテンプレート・テクノロジをサポートできません(ただし、「<uix:xml>タグ」を参照のこと)。
テンプレートを作成した開発者は、実際に、それらの要素をUIX JSP開発者に対して利用可能にできます。しかし、UIX JSP開発者はJSPタグ・クラスとJSP TLDファイルを手動で記述する必要があります。これらのクラスの詳細は、JSP仕様を参照してください。
uiXMLでは、擬似HTMLネームスペース内でのXMLの使用がサポートされています。これらの要素は、通常のuiXMLコンテンツと自由に混在させることができます。また、データ・バインドに使用することもできます。
<stackLayout>
<contents>
<html:p data:class="class@source">
<textInput ...>
</html:p>
</contents>
</stackLayout>
この機能はUIX JSPでは利用できません。かわりに<uix:rawText>
要素を使用してください。
前述のように、JSPタグでは固定の静的な属性セットしか許可されません。しかし、DataObjectおよびDataObjectListのuiXML構文では任意の属性セットを使用できます。
<table>
<tableData>
<row a="1" foo="true" style="OraErrorText" destination="..."/>
<row b="17" foo="false" style="OraErrorText" destination="..."/>
...
</tableData>
...
したがって、UIX JSPでの宣言によるDataObject
またはDataObjectList
属性の設定はサポートしていません。これらの属性はuiXMLの場合と同じようにデータ・バインドできます。また、JSPのこの制限を回避する方法については、「スクリプト可能な変数」を参照してください。
ただし、1つだけ例外として、特定タイプのDataObject
である<uix:tableFormat>
要素はサポートしています。
現在、UIX JSPではuiXMLの<provider>
要素はサポートされません。この回避策については、「スクリプト可能な変数」を参照してください。ただし、<uix:bundle>
要素は例外です。これについては後述します。
UIX JSPはレンダリング専用に使用されるもので、組込み型のイベント処理はサポートされていません。JSPを使用する開発者は、レンダリングのためにJSPに転送するヘッド・サーブレットとしてUIX Controllerを検討することをお薦めします。しかし、イベント処理をJSP内に直接実装するためのJSPタグを将来提供する予定はありません。
また、UIX JSP内ではctrl:属性および要素を使用できません。
現在、JSPフォームでUIX BC4J XMLタグは使用できません。JDeveloperチームは、これにかわるタグのセットを将来提供する予定です。
これらのショートカットを使用すると、uiXMLで1つの属性でボタンのテキストおよびプロンプトを設定できます。これらはまだUIX JSPではサポートされていません。
<uix:renderingContext>
タグuiXMLでは、ページごとに自動的にRenderingContext
が作成されます。また、そのコンテキストを構成するためのJava APIが用意されています。UIX JSPでは、そのページについてコンテキストを自動作成する必要があるため、このコンテキストを構成できるように、次の属性がサポートされています。
id
: この属性を定義した場合、ServletRenderingContext
というスクリプト可能な変数が、この属性で指定された名前で導入されます(例は後述します)。
configuration
: このレンダリング・コンテキストで使用されるConfiguration
オブジェクトの名前を定義します。Configuration
オブジェクトがすでに作成され、登録されている必要があります。
この要素は、RenderingContext
を使用するコンテンツを囲んでいる必要があります。この要素は省略することもできます。省略した場合は、デフォルトのRenderingContext
が設定されます。
例:
<uix:renderingContext configuration="YourConfigName"
id="rContext">
<%
// And add a data provider with Java code
rContext.addDataProvider(new FixedDataProvider(.....));
%>
<uix:stackLayout> ....
</uix:renderingContext>
JSPテクノロジに固有の制限を考慮して、uiXMLをJSPに直接埋め込んだり、UIX JSPタグ間に混在させることを可能にする<uix:xml>
タグが提供されています。
例:
<uix:header text="A header">
<uix:styledText text="A message"/>
<uix:xml>
<dataScope xmlns="http://xmlns.oracle.com/uix/ui"
xmlns:demo="http://example.org">
<provider>
<data name="demo:foo">
<method .../>
</data>
</provider>
<contents>
<messageTextInput data:text="text@demo:foo" .../>
...
</contents>
</dataScope>
</uix:xml>
</uix:header>
uiXMLの各ブロックで、必要なすべてのXMLネームスペースが事前定義されている必要があるので注意してください。また、XML内部でUIX JSPタグを使用することはできません。ただし、XML内部でのスクリプトレットの使用やディレクティブの追加は自由に行えます。
<% ResourceBundle bundle = ResourceBundle.getBundle(...); %>
<uix:xml>
<stackLayout xmlns="http://xmlns.oracle.com/uix/ui">
<contents>
<%@ include file="sample.uix" %>
<!-- Get the text from a ResourceBundle. Note that
you'd be much better off using a<dataScope> and
<bundle> data provider - for one thing, you'd
be able to cache the parsing results (see below) -->
<button text="<%=bundle.getString("buttonText")%>"/>
</contents>
</stackLayout>
</uix:xml>
</uix:header>
(<uix:xml>
内部での<jsp:include>
の使用は無効です。その理由については、JSP 1.1仕様のセクション5.4.5を参照してください。JSP標準タグ・ライブラリについては、このJSPの制限を回避するJSPタグの定義が計画されています。)
uiXMLの解析はかなり高速ですが、最高のパフォーマンスを必要とするアプリケーションの場合は、結果をキャッシュすると効果的です。キャッシュすると、リクエストのたびにXMLを解析しなおす必要がありません。キャッシュをサポートするには、開発者が、XML解析の結果を格納するscopeおよびvar属性を設定します。scope変数は、page、request(デフォルト)、sessionまたはapplicationのいずれかに設定する必要があります。var属性は、そのスコープに固有の値にする必要があります。キャッシュされたバージョンが見つかった場合、<uix:xml>
タグの内容は解析されずにスキップされます。<uix:xml>
タグでは、スクリプト可能な変数はサポートされません。この点において、またvarとscopeを選択するという点において、JSP標準タグ・ライブラリの現在の設計と一致しています。
ただし、このキャッシュには1つの欠点があります。アプリケーション・レベルまたはセッション・レベルでキャッシュされた場合、JSPが変更されて再ロードされたときにキャッシュ結果が自動的に破棄されないということです。このため、ページ開発の完了時にのみキャッシュを使用可能にすることをお薦めします。また、(前述のbundle.getString(...)
のように)スクリプトレットを使用するコードの場合、キャッシュを行う明らかなメリットはありません。
<uix:xml>には、uiXMLと比べて2つの大きな制限があります。UIX Componentsネームスペース(http://xmlns.oracle.com/uix/ui)および擬似HTMLネームスペース(http://www.w3.org/TR/REC-html40)内の要素と属性しかサポートしていないことと、まだテンプレートをサポートしていないことです。この2つの制限はどちらも、将来のリリースにおいて解消される予定です。
UIX JSPでのデータ・バインドを簡略化するため、サーブレット・オブジェクトに格納されているオブジェクトを取得するための4つのデータ・プロバイダがRenderingContext
上に自動的に登録されます。最初の3つのデータ・オブジェクトは、servletContext、httpSessionおよびservletRequestという名前で、それぞれapplication、sessionおよびrequestスコープに対応しています。4つ目のデータ・オブジェクトはpageContextという名前です。このデータ・オブジェクトはpageスコープに直接対応しているのではなく、page、request、session、applicationの順で実際に4つのスコープすべてを検索します(JSP Java APIに精通している開発者にとって、これはPageContext.findAttribute()
に対応するものです)。
例:
<%-- Set up some attributes --%>
<% application.setAttribute("someText", "Bar"); %>
<% request.setAttribute("someText", "Foo"); %>
<% session.setAttribute("nls",
new BundleDataObject(ResourceBundle.getBundle("MyResources",
locale))); %>
<!-- Get some text out of the page context; this will
search up to (and eventually find) "Foo", and not
get to the "Bar" stored at the application level -->
<uix:styledText textBinding="someText@pageContext"/>
<!-- Get a key off of a ResourceBundle that's stored at the session
level -->
<uix:styledText textBinding="aBundleKey@nls@servletContext"/>
これらのデータ・バインドは<uix:xml>
ブロックに対しても使用可能です。
UINode
を定義するすべてのUIX JSPタグでは、id属性を使用してスクリプト可能な変数を定義します。たとえば、<uix:table>
タグを作成し、id属性をmyTableに設定した場合、myTableという名前のTableBean
変数が生成されます。
<uix:table id="myTable">
<%
myTable.setTableData(new ArrayDataSet(.....));
%>
...
</uix:table>
これらの変数には、タグ内のスクリプトレットからのみアクセスできます。
スクリプト可能な変数を使用すると、「宣言によるDataProvider」で説明されているような、UIX JSPがuiXMLの<provider>
要素を現在サポートしていないという制限を回避できます。たとえば、スクリプト可能な変数を使用することにより、データ・プロバイダを<uix:dataScope>
上に設定できます。
<uix:dataScope id="myScope">
<%
DataObject data = YourDataDemo.getYourData();
TableDataProvider provider = new TableDataProvider();
// associate dataObject with namespace and name
// all DataObjects in UIX JSP should be registered
// with a namespace of the empty string ("", not null).
provider.put("","bar", data);
// set the data provider on <uix:dataScope>
using the variable myScope
myScope.setProvider(provider);
%>
...
</uix:dataScope>
すべてのUIX JSP変数は、インラインJavaコードを使用して計算できます。
<uix:labeledFieldLayout columns="<%= 1 + 1 %>" >
...
任意のJavaコードと混在できることを特徴とみなすか問題とみなすかは、概念的な問題として残されています。
<uix:buildTree>
および<uix:ref>
タグを使用すると、ある場所で構築したUIXコンポーネント・ツリーを別の場所で再利用できます。また、これらのタグを使用すると、1回作成したツリーを繰り返し再利用できます。
<uix:buildTree>
は、nodeID(必須)およびscope(オプション)の2つのパラメータを取ります。nodeIDは後でツリーを参照するのに使用され、scopeはツリーの使用可能期間を定義するものです。<uix:xml>
の場合と同様に、scopeは、page、request、sessionまたはapplicationのいずれかに設定します。また、<uix:xml>
の場合と同様に、同じスコープと同じ識別子で使用可能なツリーがすでに存在する場合は、<uix:buildTree>
は何も行わないので、ツリーを再構築する手間が省けます。ただし、<uix:xml>
とは異なり、構築したツリーは<uix:buildTree>
によって直接レンダリングされるのではなく、格納されるだけです。
ツリーをレンダリングするためのタグは、<uix:ref>
です。このタグは空となる必要があり、サポートされるのはrefID属性のみです。通常、これは旧<uix:buildTree>
のnodeIDと一致します。
<uix:buildTree nodeID="boilerplate">
<uix:styledText text="Some boilerplate text"/>
</uix:buildTree>
<uix:stackLayout>
<uix:styledText text="Some text"/>
<uix:ref refID="boilerplate"/>
<uix:styledText text="Some more text"/>
<uix:ref refID="boilerplate"/>
</uix:stackLayout>
また、<uix:ref>
を使用して、Javaコード内に直接構築されたUINode
を参照することもできます。
<%
StyledTextBean bean = new StyledTextBean("Boilerplate text");
request.setAttribute("bean", bean);
%>
<uix:ref refID="bean"/>
uiXMLでは、通常、どのような場合にページ全体を記述し、どのような場合にページの一部のみを記述するかを認識します。したがって、ページのクリーン・アップに際して、スタイルシートが追加されていることや、正しい<HTML>
タグが追加されていることなどいくつかの点を確実に処理できます。またuiXMLでは、Configuration
オブジェクトの設定など、RenderingContext
を操作するためのプログラム的ツールが用意されています。
UIX JSPタグではそのような環境が保証されないため、コーディングの方法は少し異なります。一般に、ページには<uix:renderingContext>
タグと<uix:document>
タグの両方を利用する必要があります。UIコンテンツ全体のルートとして<uix:renderingContext>
タグを使用し、すぐ内側に<uix:document>
を挿入します。ページの大部分は次の例のようになります。
<uix:renderingContext>
<uix:document>
<uix:metaContainer>
<%-- If you need to add any "META" tags, they go inside -->
<%-- of<uix:head> -->
<uix:head title="The title of your page"/>
</uix:metaContainer>
<%-- And here's the content of your page -->
<uix:pageLayout>
...
</uix:pageLayout>
</uix:document>
</uix:renderingContext>
UIX JSPを使用してきたユーザーは、この例に<uix:styleSheet>
がないことに少しとまどうかもしれません。スタイルシートは<uix:head>
タグによって自動的に追加されますので、自分で追加する必要はありません。
Configuration
を設定する必要がある場合は、<uix:renderingContext>
のconfiguration属性を使用します。その他のプロパティについては、<uix:renderingContext>
のidを設定します。これにより、タイプServletRenderingContext
のスクリプト可能な変数にアクセスできます。
<uix:renderingContext id="rContext" configuration="myConfig">
<%-- Now we'll call a few methods --%>
<% rContext.setURLEncoder(...);
rContext.addDataProvider(...); %>
...
</uix:renderingContext>
UIX JSPを別のUIX JSPに組み込むと便利な場合がありますが、<jsp:include>
の単純な使用はサポートされていません。コンパイル時に静的な組込みを行うだけであれば、<%@ include file="..."%>
を使用できます。あるUIXツリーを別のUIXツリーに動的に組み込む場合は、<uix:include node="foo.jsp"/>
を使用します。
<uix:tableLayout>
<uix:rowLayout>
<uix:include node="myCellFormat.jsp"/>
</uix:rowLayout>
</uix:tableLayout>
UIX JSPでは、Javaコードで作成されたUINodeや、<uix:buildTree>
を使用して格納されたUINodeにアクセスするために、<uix:include>
上の"nodeBinding"
属性もサポートされています。
uiXMLでは、<bundle>
要素を使用したテキストの自動ローカライズがサポートされています。これにより、ResourceBundle
が汎用データ・バインド・アーキテクチャ内にDataProvider
として結合されます。UIX JSPでは一般に宣言によるDataProvider
はサポートされませんが、<uix:bundle>
タグはサポートされます。ただし、構文は幾分異なります。
<uix:bundle>
タグは、<uix:renderingContext>
要素のすぐ内側でのみ使用できます。このタグは空の要素であり、classおよびnameの2つの属性をサポートしています。どちらの属性も必須です。classはリソース・バンドルの完全なクラス名であり、nameはデータ・オブジェクトの名前です。
<uix:renderingContext id="rc">
<uix:bundle name="nls"
class="yourPackage.YourResourceBundleName"/>
...
<uix:link textBinding="someText@nls"
destination="http://www.oracle.com"/>
...
</uix:renderingContext>
1ページ内に<uix:bundle>
要素はいくつでも使用できますが、もちろん、それぞれ専用のnameが必要です。UIXは、ページの現在のロケールに基づいて、リソース・バンドルの正しいバージョンを自動的に選択します(UIXのデフォルトのロケールをオーバーライドするには、スクリプト可能な変数と、ServletRenderingContext
で使用可能なsetLocaleContext()
メソッドを使用してください)。
uiXMLでは、XMLのルールに準拠するための属性内のテキストが必要です。たとえば、引用符は"としてエスケープする必要があります。未満を表す記号(<)は<として記述します。アンパサンド(&)は&として記述します。
UIX JSPにはルールがほとんどないため、これらの文字をエスケープする必要はありません。ただし、RAWのHTML内の属性の値についてはエスケープする必要があります。また、二重引用符は例外で、エスケープが必要です。不思議なことに、二重引用符はHTMLでもXMLでもなくJavaの表記規則を使用してエスケープします。したがって、二重引用符には先頭にバックスラッシュを付ける必要があります。
<button text="Press \"Here\"">
uiXMLとUIX JSPではどちらでも、RAWのHTMLをドキュメントに挿入するための<rawText>
要素がサポートされています。uiXMLはXMLです。つまり、コンテンツは整形式のXMLである必要があります。開発者は手動でテキストをエスケープする(たとえば、<
を<
に変更する)か、またはCDATAセクションを使用する必要があります。
<rawText><![CDATA[
Here's some HTML:<a href="http://www.oracle.com">Oracle</a>
and it can go <b>on and on and on</b>...
]]></rawText>
UIX JSPでは、コンテンツを整形式にする必要はありません。この場合も、これを特徴とみなすか問題とみなすかは開発者次第ですが、同時にこれは、UIX JSPを使用するときCDATAセクションが不要だということでもあります。
<uix:rawText>
Here's some HTML: <a href="http://www.oracle.com">Oracle</a>
and it can go <b>on and on and on</b>...
</uix:rawText>