Home of: [工房 "藤車"] > [SourceForge.net における PageMixer]

URI のはめ込み

本節では、PageMixer において、 配置された Struts の "Action" に対応する URI を、 "a"、"img"、"form" あるいは "link" といった HTML タグ要素の属性値としてはめ込む方法を説明します。

概要

クラス図

本節におけるクラス図を以下に示します。

Class diagram
クラス図 (クリックで拡大表示)

クラス名

本チュートリアルでは、 クラスは全てクラス名のみで表記されています。 完全な名称は以下の通りです。

PageMixer フレームワークのクラス

NotationFull name
ActionConfigKey jp.ne.dti.lares.foozy.pagemixer.servlet.ActionConfigKey
ActionInsetFilter jp.ne.dti.lares.foozy.pagemixer.struts.ActionInsetFilter
ConsumerContext jp.ne.dti.lares.foozy.pagemixer.mixer.ConsumerContext
HTMLSymbolSet jp.ne.dti.lares.foozy.pagemixer.HTMLSymbolSet
HashMapConsumerContext jp.ne.dti.lares.foozy.pagemixer.mixer.HashMapConsumerContext
StrutsConsumerContext jp.ne.dti.lares.foozy.pagemixer.struts.StrutsConsumerContext

チュートリアルの固有クラス

NotationFull name
Bootstrap pagemixer.filter.Bootstrap
DummySetup pagemixer.filter.DummySetup

はめ込み対象の決定

PageMixer フレームワークでは、 配置された Struts の "Action" の URI はめ込みに、 "ActionInsetFilter" の派生クラスが利用できます。 以下にしめす幾つかの派生クラスバリエーションが定義済みです。

上記クラスは既に具象クラスですので、 どの HTML タグに URI を埋め込むかを決めるだけです。

PageMixer 3.1 版以降では、 Action URI をはめ込みたくないタグに、 "nonaction" ないし "external" 属性を "true" 値で指定することで、 対象タグに対する上記のフィルタ群の URI はめ込みを抑止することが出来ます。

これにより、 上記のフィルタ群をデフォルトコンストラクタで作成した上で、 はめ込みを HTML ソース側で制御することが出来ます。

JSP からの HTML ページの生成方法

本チュートリアルでは、 はめ込みと表現していますが、 ActionInsetFilter およびその派生クラスは、 実際には、 HTML ページ中で既に属性値が持っている URI 情報を、 その属性値によって関連付けられた Action のための本当の URI に変換しています。

そのため、 "struts-config.xml" ファイルの ("forward" 要素の)"path" 要素、 あるいは("action" 要素の) "input" 要素と同じ値の属性値を指定しなければなりません。

例えば、 Struts の struts-mailreader における "index.jsp" には、 以下のようなコードが記述されています。


<html:link
  page="/editRegistration?action=Create"
><bean:message key="index.registration"/></html:link>

Struts の struts-mailreader における index.jsp(部分)

そこで、以下のような HTML ページを生成しなければなりません。


<a
  href="/editRegistration?action=Create"
>メールリーダーデモアプリケーションへの登録</a>

index.jsp に対応する "index.ja.html"(部分)

この HTML ソースは、 大変簡素で、且つ一般的な HTML エディタとの親和性が高いですよね?

URI はめ込み抑止の例を以下に示します。


<a
  href="static-page.html"
  nonaction="true"
>非 Action(但し「内部」)資源へのリンク</a>

<a
  href="http://pagemixer.sourceforge.net/index.ja.html"
  external="true"
>外部資源へのリンク</a>

はめ込みの抑止

"nonaction" 属性は、 フィルタによる Action URI のはめ込みのみを抑止しますが、 一方で "external" 属性は、 URL リライティングによるセッション ID 保証も抑止します。

備考: URL リライティングは外部サイトへの "REFERER" HTTP 経由でセッション ID を漏洩させるかもしれないため、 "external" 属性はセキュリティ的には不十分です。

厳密なセキュリティのためには、 他のサイトへのユーザ誘導の際は HTTP リダイレクトを使用してください。

これ以外の Action URI はめ込みに関する ActionInsetFilter の機能 (例えば "module" の指定)に関する詳細は、 API ドキュメントを参照してください。

擬似設定

ActionInsetFilter は、 "ConsumerContext" を "ActionConfigKey" で検索することで、 Action へのパスを取得します。

StrutsConsumerContext を用いる場合、 特に明示的な準備をせずとも "ActionConfigKey" は正しく機能します。 しかし、 "HashMapConsumerContext" や他の ConsumerContext 実装を用いる場合、 対応する ActionConfig を明示的に格納する必要があります。

"DummySetup" クラスは、 ConsumerContext を PageMixer - Struts 連携デモンストレーション ("src/demo/struts/war/WEB-INF" 配下の "web.xml" および "struts-config.xml" に記述されています)と同じ状態に設定します。

繋いで混ぜる

以上で必要なものが全て揃いました。 HTML ページ中の "<a>" タグに、 "href" 属性値として URI をはめ込む実行コードは以下のようになります。


Bootstrap bootstrap =
new Bootstrap.Default(filename){
    protected void prepare(ConsumerContext context)
    {
        DummySetup.setup(context,
                         new String[0],
                         0);
    }
};
ActionInsetFilter.A filter = new ActionInsetFilter.A();
bootstrap.execute(filter);

繋いで混ぜる

入力となるサンプル HTML ファイルは、 配布物の "src/demo/struts/war/WEB-INF/page" 配下にあります。 上記例における "filename" 変数の値として、 サンプルファイルへのパスを指定してください。

HTMLページにおけるデータのはめ込みに関する詳細は、 "Token へのデータはめ込み" あるいは "PageMixer の利用" の他の節をご覧下さい。


次節「エラー情報の取り扱い」へ