1

これは本当のヘッドスクラッチャーです...ボタンとしてスタイル設定されたコマンドリンクがいくつかあるので、メンテナンスを容易にするために、いくつかのパラメーターとともに含めることができる小さなhtmlフラグメントを作成して、適切にスタイル設定されたコマンドをレンダリングしますリンク。

アクションの結果がビューを変更する場合を除いて、これはうまく機能します。その時点で、「インクルード」バージョンはナビゲートするためのクリックに従うことを断固として拒否し、その理由はわかりません! アクションの結果が検証エラーになった場合、エラーが表示されるため、アクションが確実に呼び出されています。私のログではこれが確認されていますが、検証エラーがない場合、インクルードを使用しない元のバージョンは次のバージョンに移動します。ページは問題ありませんが、include を使用するバージョンはナビゲートしません。非常に単純な「hello.xhtml」ページを 2 ページ目として試してみたので、新しいビューの内容とは何の関係もないことがわかっています。

わかりやすくするために編集: ページでいくつかのボタンを使用していますが、そのほとんどは現在のページの状態を変更するだけで、すべて正常に機能しています。「インクルード」バージョンで問題が発生するのは、結果がビューの変更である場合のみです。

Portal Server 6.1/WAS 7.0 上で JSF 1.2 を実行しています。

私はこれを理解するのにあまりにも長い時間を費やしたので、何かアイデアがあるかどうかを確認してください.

更新: コメントを読み進めるのを節約するために、答えは、ナビゲーション ルールで from-action を使用していたことです。これは、commandLink で使用されている文字列と一致するだけ #{bean[action]}です。#{applicationPage.doContinue}

いくつかのコード。

私のボタンテンプレート:

<ui:composition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xml:lang="en" lang="en">

    <ui:remove>
        Functional Button with arrow icon.
        Parameters:
        linkId           = The id for the commandLink.
        linkText         = The text to display on the button.
        linkTitle        = title text to display
        bean             = The bean name containing the action handler.
        action           = The action handler to call.
    </ui:remove>
    <div class="btn functionalButton">
        <h:commandLink id="#{linkId}" action="#{bean[action]}" title="#{linkTitle}" styleClass="functional">
                #{linkText}
                <span class="arrow icon" />
            <span class="tl" />
            <span class="tr" />
            <span class="bl" />
            <span class="br" />
        </h:commandLink>
    </div> 

</ui:composition>

ページでの使用例:

<ui:include src="/WEB-INF/facelets/content/functionalButton.xhtml">
    <ui:param name="linkId" value="applicationSubmit" />
    <ui:param name="bean" value="#{applicationPage}" />
    <ui:param name="action" value="doContinue" />
    <ui:param name="linkText" value="#{msg['button_FF060_continue']} " />
</ui:include>

このバージョンはビューを変更しません。

インクルードを使用する前は、コードは次のように見えましたが (これは解決され、まったく同じ html にレンダリングされるはずです)、このバージョンではビューが問題なく変更されます。

<div class="btn functionalButton">
    <h:commandLink id="applicationSubmit" styleClass="functional" action="#{applicationPage.doContinue}" title="#{msg['button_FF060_continue']}">
     #{msg['button_FF060_continue']} 
        <span class="arrow icon" id="arrow_continue" />
        <span class="tl" />
        <span class="tr" />
        <span class="bl" />
        <span class="br" />
    </h:commandLink>
</div>
4

1 に答える 1

1

更新:これは、アクションに関連付けられている が元の EL 式を次のように参照している場合に発生する可能性があり<from-action>ます。<navigation-case>

<from-action>#{applicationPage.doContinue}</from-action>

実際のメソッド式として解釈されるのではなく、属性で定義した文字列リテラルとして解釈されactionます。したがって、インクルード/タグ ファイルを使用する場合は、action属性で使用したようにリテラル EL 式に変更する必要があります。

<from-action>#{bean[action]}</from-action>

または、より良いかもしれませんが、それを削除してください。それぞれが同じ結果を返す可能性があるが異なる宛先が必要な複数のアクションがない場合、これは役に立ちません。<to-view-id>また、結果値として拡張子なしを使用することもお勧めします。これにより、JSF 2.0 への将来の移行が容易になります。これは、既に暗黙的に行われているためです。




以下の元の回答は、将来の参照用に保持されます

よくわかりませんが、おそらく Facelets 1.x は単純にそれを食べません。これは Facelets 2.x で機能します。この方法でインクルード ファイルを (ab) 使用したことがないので、経験からしかわかりません。

代わりにタグファイルとして使用することをお勧めします。追加の利点は、これにより最終的に構文がより明確になり、IDE オートコンプリートで属性名と説明を提供できるようになることです。あなたがする必要があるのは、/META-INF/my.taglib.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC
    "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
    "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">

<facelet-taglib>
    <namespace>http://example.com/jsf/facelets</namespace>
    <tag>
        <tag-name>functionalButton</tag-name>
        <source>/WEB-INF/facelets/content/functionalButton.xhtml</source>
    </tag>
</facelet-taglib>

(属性の定義はオプションです。必要に応じて、<attribute>内部<tag>に追加します。これらのファイルを/tagsサブフォルダーなどに配置することもお勧めします/WEB-INF/facelets/tags

/WEB-INF/web.xml以下のように登録すると

<context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>/META-INF/my.taglib.xml</param-value>
</context-param>

その後、次のように使用できるようになります。

xmlns:my="http://example.com/jsf/facelets"
...
<my:functionalButton linkId="applicationSubmit" bean="#{applicationPage}" 
    action="doContinue" linkText="#{msg['button_FF060_continue']} " />
于 2012-06-11T14:59:59.363 に答える