JSP+XML構造のWebサイトの例
著者:Eve Cole
更新時間:2009-07-02 17:11:58
XML (Extensible Markup Language) は、ある種の W3C 標準のように見えるかもしれません。現時点では実用的な影響はほとんどなく、後で役立つようになるとしても、長い時間がかかるでしょう。しかし、実際にはすでに使われています。そのため、XML がお気に入りの HTML エディターに追加されるまで待たずに使用を開始できます。社内のさまざまな問題やB2Bシステムの問題を解決できるようになりました。
Sparks.com では、XML を使用して、Java オブジェクトから HTML データ表示まで、異種システム間でのデータ表現を標準化しています。
特に、データが非常に基本的な XML 構造で標準化されている場合、データの共有と操作がより簡単になることがわかりました。その過程で、XML を使用する多くの効果的な方法を発見しました。以下では、現在のアプリケーションについて詳しく説明します。
標準化 XML を使用する前に、使用する情報とは異なる XML データ形式を作成します。
動的XMLの生成
データベースから HTML を生成することは新しいことではありませんが、XML を生成することは新しいことです。ここでは具体的な生成手順を紹介します。
XSL をテンプレート言語として使用する
XSL (Extensible Stylesheet Language) は、XML データを表示するための形式を定義する良い方法であり、複数の静的テンプレートとして記述した方が効率的です。
HTMLの生成
XML と XSL は HTML と同じです。正しくないように聞こえるかもしれませんが、ユーザーに表示される HTML ページは、実際には XML と XSL を組み合わせた結果です。
1. 標準化
XML の威力はその柔軟性から生まれます。しかし、残念ながら、柔軟性が高すぎるため、どうやって問題を解決すればよいのか白紙のままになってしまうことがあります。
どの XML プロジェクトでも、最初のステップは標準データ形式を作成することです。これを行うには、次の決定を下す必要があります。
&&&
データを確認します。
標準の XML 形式がないため、開発者は独自の形式を自由に開発できます。ただし、形式が 1 つのアプリケーションでのみ認識される場合は、その形式を使用するためにそのアプリケーションのみを実行できます。 XML 形式を読み取ることができる他のプログラムがあれば、明らかに便利です。 XML 形式を変更すると、それを使用するシステムも変更する必要がある場合があるため、可能な限り完全な形式を作成する必要があります。ほとんどのシステムは認識できないタグを無視するため、XML の形式を変更する最も安全な方法は、タグを変更するのではなく追加することです。
ここをクリックして XML データ形式の例を表示します
Sparks.com では、さまざまな製品プレゼンテーションに必要なすべての製品データを調べました。すべてのページがすべてのデータを使用するわけではありませんが、すべてのデータに適した非常に完全な XML データ形式を開発しました。たとえば、製品詳細ページには、製品参照ページよりも多くのデータが表示されます。ただし、各ページの XSL テンプレートは必要なフィールドのみを使用するため、どちらの場合でも同じデータ形式を使用します。
DTDを使用するかどうか
Sparks.com では、単に正しい XML ではなく、よく整理された XML を使用します。これは、前者には DTD が必要ないためです。 DTD は、ユーザーがクリックしてからページを表示するまでの間に処理レイヤーを追加します。このレイヤーには多大な処理が必要であることがわかりました。もちろん、XML 形式で他の企業と通信するときに DTD を使用するのは依然として良いことです。 DTD では、送受信時にデータ構造が正しいことを保証できるためです。
解析エンジンの選択 使用できる解析エンジンがいくつかあります。どちらを選択するかは、ほぼ完全にアプリケーションのニーズによって決まります。 DTD を使用する場合は、解析エンジンによって XML が DTD によって検証されるようにする必要があります。検証を別のプロセスに入れることもできますが、パフォーマンスに影響を及ぼします。
SAX と DOM は 2 つの基本的な解析モデルです。 SAX はイベントベースであるため、XML が解析されるとイベントがエンジンに送信されます。次に、イベントが出力ファイルと同期されます。 DOM 解析エンジンは、動的 XML データと XSL スタイル シートの階層ツリー構造を作成します。 DOM ツリーにランダムにアクセスすることで、あたかも XSL スタイルシートで決定されたかのように XML データを提供できます。 SAX モデルに関する議論は主に、DOM 構造の過剰なメモリ削減と XSL スタイル シートの解析時間の高速化に焦点を当てています。
しかし、SAX を使用する多くのシステムは、SAX の機能を最大限に活用していないことがわかりました。これらのシステムは、これを使用して DOM 構造を構築し、DOM 構造を通じてイベントを送信します。このアプローチでは、XML 処理の前にスタイルシートから DOM を構築する必要があるため、パフォーマンスが低下します。
2. 動的XMLの生成
XML 形式が確立されたら、それをデータベースから動的に移植する方法が必要です。
XML ドキュメントの生成は、文字列を処理できるシステムのみが必要なため、比較的簡単です。 Javaサーブレット、Enterprise JavaBeanサーバー、JDBC、RDBMS(リレーショナルデータベース管理システム)を利用したシステムを構築しました。
&&&&
(XSL の適用に関する詳細については、「テンプレート言語としての XSL」を参照してください。)
XML の生成例 Java で XML docstring を作成する実際のコードは、いくつかのメソッドとクラスに分割できます。
XML 生成プロセスを開始するコードは、EJB メソッドに配置されます。このインスタンスは、生成された XML 文字列を保存するための StringBuffer をすぐに作成します。
StringBuffer xml = 新しい StringBuffer();
xml.append(XmlUtils.beginDocument("/browse_find/browse.xsl", "browse", request));
xml.append(product.toXml());
xml.append(XmlUtils.endDocument("参照");
out.print(xml.toString());
次の 3 つの xml.append() 変数自体は、他のメソッドへの呼び出しです。
ファイル ヘッダーの生成 最初の追加メソッドは、XmlUtils クラスを呼び出して XML ファイル ヘッダーを生成します。 Java サーブレットのコードは次のとおりです。
public static String beginDocument(String スタイルシート、String ページ)
{
StringBuffer xml = 新しい StringBuffer();
xml.append("<?xml version="1.0"?> ")
.append("<?xml-stylesheet href="")
.append(スタイルシート).append(""")
.append(" type ="text/xsl"?> ");
xml.append("<").append(ページ).append("> ");
xml.toString() を返します。
}
このコードは XML ファイル ヘッダーを生成します。 <?xml> タグは、このファイルをバージョン 1.0 をサポートする XML ファイルとして定義します。コードの 2 行目は、データを表示するための正しいスタイル シートの場所を指します。最後に含まれるのは項目レベルのタグ (この例では <browse>) です。ファイルの最後では、<browse> タグのみを閉じる必要があります。
<?xml version="1.0"?> <?xml-stylesheet href="/browse_find/browse.xsl" type="text/xsl"?> <browse>
製品情報を入力し、ファイル ヘッダーを完成させた後、コントロール メソッドは Java オブジェクトを呼び出して XML を生成します。この例では、product オブジェクトが呼び出されます。製品オブジェクトは 2 つのメソッドを使用して XML 表現を生成します。最初のメソッド toXML() は、<product> タグと </product> タグを生成して製品ノードを作成します。次に、internalXML() を呼び出し、製品 XML に必要なコンテンツを提供します。 innerXML() は、一連の StringBuffer.append() 呼び出しです。 StringBuffer も文字列に変換され、コントロール メソッドに返されます。
パブリック文字列 toXml()
{
StringBuffer xml = new StringBuffer("<製品> ");
xml.append(internalXml());
xml.append("</product> ");
xml.toString() を返します。
}
パブリック String externalXml()
{
StringBuffer xml = 新しい
StringBuffer(" ")
.append(productType).append(" ");
xml.append(" ").append(idValue.trim())
.append(" ");
xml.append(" ").append(idName.trim())
.append(" ");
xml.append(" ").append(page.trim())
.append(" ");
パン?
xml.append(" ").append(金額).append(" ");
xml.append(" ").append(ベンダー).append(" ");
xml.append(" ");
xml.append(" ").append(pubDesc).append(" ");
xml.append(" ").append(venDesc).append(" ";
パン?
xml.toString() を返します。
}
最後に、ファイルを閉じた後に XMLUtils.endDocument() メソッドが呼び出されます。この呼び出しにより XML タグが閉じられ (この場合)、最終的に構造化 XML ファイルが完成します。コントロール メソッドからの StringBuffer 全体も文字列に変換され、元の HTTP リクエストを処理したサーブレットに返されます。
3. XSL をテンプレート言語として使用する
HTML 出力を取得するには、生成された XML ファイルを、XML データの表現方法を制御する XSL テンプレートと組み合わせます。当社の XSL テンプレートは、慎重に編成された XSL タグと HTML タグで構成されています。
テンプレートの構築を開始する XSL テンプレートの先頭は、次のコードのようになります。コードの最初の行は必須であり、このファイルを XSL スタイル シートとして定義します。 xmlns:xsl= 属性は、このファイルで使用される XML 名前空間を参照し、version= 属性は名前空間のバージョン番号を定義します。ファイルの最後でタグを閉じます。
<xsl:template> で始まるコードの 2 行目は、XSL テンプレートのパターンを決定します。 Match 属性は必須であり、ここでは XML タグ <basketPage> を指します。私たちのシステムでは、<basketPage> タグに <product> タグが含まれており、これにより XSL テンプレートが <product> タグに埋め込まれた製品情報にアクセスできるようになります。もう一度、ファイルの最後にある <xsl:template> タグを閉じる必要があります。
次に、よく整理された HTML を見てみましょう。 XML 解析エンジンによって処理されるため、適切に構成された XML のすべてのルールに準拠する必要があります。基本的に、これはすべての開始タグに対応する終了タグが必要であることを意味します。たとえば、通常は閉じられない <P> タグは、</P> で閉じる必要があります。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
バージョン="1.0">
<xsl:template match="バスケットページ">
<html>
<頭>
<title>ショッピングバッグ / 数量の調整</title>
</head>
<ボディの色=
</xsl:テンプレート>
</xsl:スタイルシート>
テンプレートの本文内には、データ表示のロジックを提供するために使用される XSL タグが多数あります。よく使用される 2 つのタグについて以下で説明します。
選ぶ
<xsl:choose> タグは、従来のプログラミング言語の if-then-else 構造の始まりに似ています。 XSL では、choose タグは、コードが入る部分で、割り当てによってアクションがトリガーされることを示します。属性が割り当てられた <xsl:when> タグがchooseタグの後に続きます。割り当てが正しい場合は、<xsl:when> の開始タグと終了タグの間の内容が使用されます。割り当てが間違っている場合は、<xsl:otherwise> の開始タグと終了タグの間の内容が使用されます。セクション全体は </xsl:choose> で終わります。
この例では、when タグは XML で数量タグをチェックします。数量タグに true の値を持つエラー属性が含まれている場合、数量タグには以下にリストされている表のセルが表示されます。属性の値が true でない場合、XSL はタグ間のコンテンツを表示します。以下の例では、error 属性が true でない場合、何も表示されません。
<xsl:選択>
<xsl:when test="quantity[@error='true']">
<td bgcolor="src=""/></td>
<td valign="top" bgcolor="<font face="Verdana, Arial" size="1" color="<b>*在庫が不足しています。</b></font>
</td>
</xsl:いつ>
<xsl:その他>
</xsl:その他>
</xsl:選択>
それぞれについて
<xsl:for-each> タグを使用すると、同様の XML データの複数の状況に同じスタイル シートを適用できます。私たちにとって、一連の製品情報をデータベースから取り出して、Web ページ上で統一的にフォーマットすることができます。以下に例を示します。
<xsl:for-each select="パッケージ">
<xsl:apply-templates select="製品"/>
</xsl:for-each>
for-each ループは、プログラムがラベルに遭遇すると開始されます。このループは、プログラムがラベルに遭遇すると終了します。このループが実行されると、ラベルが表示されるたびにこのテンプレートが適用されます。
4. HTMLの生成
将来のある時点で、ブラウザには XML 解析エンジンが統合されるでしょう。この時点で、XML および XSL ファイルをブラウザに直接送信でき、ブラウザはスタイル シートにリストされているルールに従って XML データを表示します。ただし、それまでは、開発者はサーバー側システムに解析機能を作成する必要があります。
Sparks.com では、XML パーサーを Java サーブレットに統合しました。このパーサーは、XSLT (XSL Transformation) と呼ばれるメカニズムを使用して、XSL タグで指定されたとおりに XML データを XSL テンプレートに追加します。
Java サーブレットが HTTP リクエストを処理するとき、サーブレットは動的に生成された XML を取得し、それが解析エンジンに渡されます。 XML ファイル内の指示に基づいて、解析エンジンは適切な XSL スタイルシートを探します。パーサーは DOM 構造から HTML ファイルを作成し、このファイルは HTTP リクエストを行ったユーザーに送信されます。
SAX モデルの使用を選択した場合、パーサーは XML ソースを読み取り、XML タグごとにイベントを作成します。イベントは XML データに対応し、データは最終的に XSL タグに従ってスタイル シートに挿入されます。