私は多くのページに含めるヘッダーにこのボタンがあります:
<input type="button" value="My Button" onclick="window.location.href='mypage.xhtml'"
相対パスを使用し、呼び出し元のページが同じディレクトリにある場合に機能します。絶対パスを使用したり、commandButtonタグを使用したりするにはどうすればよいですか?私は試してみました:
/mypage.xhtml
動作しない(404エラー)
私は多くのページに含めるヘッダーにこのボタンがあります:
<input type="button" value="My Button" onclick="window.location.href='mypage.xhtml'"
相対パスを使用し、呼び出し元のページが同じディレクトリにある場合に機能します。絶対パスを使用したり、commandButtonタグを使用したりするにはどうすればよいですか?私は試してみました:
/mypage.xhtml
動作しない(404エラー)
ELにコンテキストパスを動的に出力させます。ドメインルートを基準にしたものになります。
<input type="button" value="My Button" onclick="window.location.href='#{request.contextPath}/mypage.xhtml'">
<h:button>
または、コンテキストパスについて心配する必要がない、とにかく同じHTMLを生成するJSF独自のコンポーネントを使用することをお勧めします。
<h:button value="My Button" outcome="/mypage.xhtml" />
リクエストパラメータを渡す必要がある場合は<f:param>
、そのために使用できます。
<h:button value="My Button" outcome="/mypage.xhtml">
<f:param name="foo" value="bar" />
</h:button>
は使用しないでください<h:commandButton>
。通常のGETリクエストは送信しませんが、リダイレクトする必要のあるPOSTリクエストを送信するため、事実上2つのHTTPリクエストが送信され、2番目のリクエストではすべてのリクエストパラメータが失われます。
したがって、JSF commandButtonを使用してプロジェクト内のあるページに移動する場合は、action属性を使用する必要があり、パラメーターを渡すこともできます。
<h:commandButton action="/details.jsf?faces-redirect=true" value="details">
<f:attribute name="id" value="#{bean.id}" />
</h:commandButton>
アプリの外部のページに移動する場合は、バッキングBeanのどこかにJavaコードを追加して、フロントエンドからトリガーする必要があります。
FacesContext.getCurrentInstance().getExternalContext().redirect("http://google.com";);
注:このタスクにはJavaScriptは必要ありません