たとえば、ロジックを実行してから/page.html#elementidを押したいとします。
<h:commandLink action="#{myBean.action}" value="Go"/>
と
public String action()
{
// Some logic here
return "/page.xhtml#elementid";
}
私はこれに関する例を見つけることができません、そして解決策があるかどうか疑問に思いますか?
#elementid
URIフラグメントはクライアント側にも送信する必要があります。これはここでは発生していません。基本的に、サーバー側の転送を実行しています。代わりに、クライアント側のリダイレクトを実行する必要があります。
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>
。