2

単一の Web アプリケーション内でプールされた CSS および JS ファイルの集合体を使用するポートレットがいくつかあります。現在、各ポートレットは適切な head タグを doHeaders() に追加します。ただし、これにより、複数のポートレットが同じページにある場合、head 内で重複タグが発生します。

現在、ポートレットはGateIn で実行されるeXoにデプロイされています。eXo には独自の JS AMD フレームワークとポートレット スキン システムがありますが、リスクを軽減するために、doHeaders() を使用して head 要素を追加し、可能な限りプラットフォームに依存しないようにしています。

head 要素は次の方法で追加されます。

@Override
public void doHeaders(RenderRequest request, RenderResponse response)
{
    Element element = response.createElement("link");
    element.setAttribute("type", "text/css");
    element.setAttribute("rel", "stylesheet");
    element.setAttribute("href", request.getContextPath() + "/service/resource/themes/stylesheet.css");
    response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, element);
}

頭から重複したエントリを削除するか、そもそも重複が書き込まれないようにする必要があります。

重複したヘッド要素を削除できる共通の RenderFilter を作成しようとしています。しかし、 RenderResponseから現在の Element プロパティにアクセスできないようです。setProperty() または addProperty() しかできません。

RenderFilter を記述して、個々のポートレットの doHeaders() メソッドを置き換え、CSS および JS プール全体をヘッドに追加することもできます。しかし、このロジックがユーザー セッション ページのレンダリングごとにのみ実行されることを保証することはできません。

4

1 に答える 1

2

私が現在実装しているソリューションは、プールがまだ書き込まれていない場合に JS および CSS リソース プール全体をヘッドに書き込む RenderFilter です。保留中のヘッド要素の検出は、プラットフォームに依存しない方法で実行できることがわかったものではないため、これはやや最適ではありません。ただし、JSR-286 はこの場合に何をすべきかを指示していないため、冗長な head 要素をどうするかを決定するのは完全にプラットフォームの委譲次第です。

eXo の PortalRequestContext を使用すると、保留中の head 要素のリストを取得できます。リソース プールを識別するためのメタ要素を追加することにより、RenderFilter は、プールを書き込む必要があるか、または既に書き込まれているかを判断できます。

基本的な検出ロジックは次のとおりです。

boolean addHeaderElements = true;
if (Util.getPortalRequestContext() != null && Util.getPortalRequestContext().getExtraMarkupHeaders() != null)
{
    for (Element markupHeaderElement : Util.getPortalRequestContext().getExtraMarkupHeaders())
    {
        if (markupHeaderElement.getTagName().equalsIgnoreCase("meta") &&
            markupHeaderElement.getAttribute("name") != null &&
            markupHeaderElement.getAttribute("name").equalsIgnoreCase("project-name"))
        {
            addHeaderElements = false;
            break;
        }
    }
}

これは、ファイル単位で動作するように作成することもできますが、私のポートレットのリソース プールは一般的に共有されており、オール オア ナッシング アプローチを使用できます。

于 2013-11-06T17:33:55.810 に答える