1

ページネーター複合コンポーネントを作成しようとしています。コンポーネントは、使用可能なページごとに commandLink をレンダリングする必要があります。次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:cc="http://java.sun.com/jsf/composite"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <cc:interface>
        <cc:attribute name="action" targets="jumpButton" required="true"/>
        <cc:attribute name="bean" type="java.lang.Object" required="true"/>
    </cc:interface>
    <cc:implementation>
        <ui:repeat value="#{cc.attrs.bean.pages}" var="page">
            <h:commandLink id="jumpButton"
                           actionListener="#{cc.attrs.bean.jumpToPage(page)}">
                <h:outputText value="#{page}"/>
            </h:commandLink>
        </ui:repeat>
    </cc:implementation>
</html>

コンポーネントは、次のようなさまざまなページで使用されます。

<ccc:paginator bean="#{myBean}"
               action="/index?faces-redirect=true&amp;includeViewParams=true"/>

または:

<ccc:paginator bean="#{myOtherBean}"
               action="/dir/index?faces-redirect=true&amp;includeViewParams=true"/>

faces-redirect=true と includeViewParams=true の使用に注意してください。これは、私の知る限り、複合コンポーネントの commandLinks で直接使用することはできません。

問題は、jumpButton が ui:repeat 内にあるためターゲットにできないことです。メッセージが表示されます:

javax.servlet.ServletException: /index?faces-redirect=true&includeViewParams=true : Unable to re-target MethodExpression as inner component referenced by target id 'jumpButton' cannot be found.

ui:repeat の外で id="jumpButton" を使用してコマンド リンクを作成すると、複合コンポーネントとボタンが正常に機能します。複合コンポーネントを ui:repeat 内のコマンド リンクで動作させるにはどうすればよいですか?

解決

マネージド Bean の jumpToPage アクション:

public String jumpToPage(String path, Integer page) {
    ...
    setCurrentPage(page);
    return path;
}

複合コンポーネント:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:cc="http://java.sun.com/jsf/composite"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <cc:interface>
        <cc:attribute name="bean" type="java.lang.Object" required="true"/>
        <cc:attribute name="path" type="java.lang.String" required="true"/>
    </cc:interface>
    <cc:implementation>
        <ui:repeat value="#{cc.attrs.bean.pages}" var="page">
            <h:commandLink id="jumpButton"
                           action="#{cc.attrs.bean.jumpToPage(cc.attrs.path, page)}">
                <h:outputText value="#{page}"/>
            </h:commandLink>
        </ui:repeat>
    </cc:implementation>
</html>

コンポーネントの使用例:

<ccc:paginator bean="#{myBean}"
               path="/index?faces-redirect=true&amp;includeViewParams=true"/>
<ccc:paginator bean="#{myOtherBean}"
               path="/dir/index?faces-redirect=true&amp;includeViewParams=true"/>
4

1 に答える 1

2

内のアクション属性を削除する必要があります<cc:interface>。bean 属性を介してアクションを呼び出すため、これは必要ありません。

更新 1

アクションの結果は、Bean の戻り値として定義することもできます。このような:

public class MyBean {
    public String jumpToPage(int page){
       // ...
       return "/index?faces-redirect=true&amp;includeViewParams=true";
    }
}

そして、action代わりに使用しますactionListener

 <h:commandLink id="jumpButton" action="#{cc.attrs.bean.jumpToPage(page)}">
     <h:outputText value="#{page}"/>
 </h:commandLink>
于 2013-08-20T20:56:51.333 に答える