2

たとえば、ロジックを実行してから/page.html#elementidを押したいとします。

<h:commandLink action="#{myBean.action}" value="Go"/>

public String action()
{
   // Some logic here
   return "/page.xhtml#elementid";
}

私はこれに関する例を見つけることができません、そして解決策があるかどうか疑問に思いますか?

4

1 に答える 1

2

#elementidURIフラグメントはクライアント側にも送信する必要があります。これはここでは発生していません。基本的に、サーバー側の転送を実行しています。代わりに、クライアント側のリダイレクトを実行する必要があります。

public void action() throws IOException {
    // ...

    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.redirect(ec.getRequestContextPath() + "/page.xhtml#elementid");
}

または、条件付きでJavaScriptをレンダリングして、URIフラグメントを設定することもできます。

public String action() {
    // ...

    hash = "elementid";
    return "/page.xhtml";
}

page.xhtml

<h:outputScript target="body" rendered="#{not empty bean.hash}">
    location.hash = "#{bean.hash}";
</h:outputScript>

ちなみに、<h:link>URIフラグメントは明示的にサポートされています。

<h:link value="Go to page" outcome="page" fragment="elementid" />

ただし、GETリクエストが発生するため、事前初期化ビジネスアクションは、(ポスト)コンストラクターまたはに基づいてターゲットページに関連付けられたBeanで実行する必要があります<f:viewParam>

于 2012-10-03T11:39:55.020 に答える