5

私は JSF2 Ajax アプリケーションを保守しており、すべてのアクションにh:commandLinksおよびf:ajaxタグを多用しています。常に必要なものだけを再レンダリングしています。

もちろん、これは、リンクを右クリックして「新しいタブでリンクを開く」などを選択したときに、ユーザーが期待する動作を壊します。

f:ajax は、結果のa要素の href 属性を強制#し、onclick 関数ですべての魔法のポスト リクエストのトリックを実行することを理解しています。意味のあるものを配置して、「リンクを開く...」アクションのフォールバック サポートを提供したいと考えています。結果の<a>タグの href 属性にリンクします。

これは、生成された JavaScript が常に終了するため、「通常の」オンクリックの動作を損なうことはありませんreturn false;が、新しいウィンドウでリンクを開きたい場合に備えて、通常の GET 要求を使用してユーザーをページに送信できます。

これを行うためのビルドはありますか?または、フェーズリスナーを使用して、JSFライフサイクルのどこに飛び込んでこれを行う必要があるかについて、誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

2

最も簡単なのは、それに応じてメソッドを拡張com.sun.faces.renderkit.html_basic.CommandLinkRendererしてオーバーライドすることです。renderAsActive()Mojarraはオープンソースです。メソッドをコピーして、その行を編集するだけwriter.write("href", "#", "href")です。"#"洞察に応じて文字列を置き換えます。

public class MyCommandLinkRenderer extends CommandLinkRenderer {

    @Override
    protected void renderAsActive(FacesContext context, UIComponent command) throws IOException {
        // ...
    }

}

実行するには、次のように登録しますfaces-config.xml

<render-kit>
    <renderer>
        <component-family>javax.faces.Command</component-family>
        <renderer-type>javax.faces.Link</renderer-type>
        <renderer-class>com.example.MyCommandLinkRenderer</renderer-class>
    </renderer>
</render-kit>

これにより、レンダラーがMojarraに緊密に結合されることに注意してください。JSFの実装に依存しないようにするには、Mojarra固有のレンダラークラスを拡張するのではなく、まったく新しいレンダラーを作成する必要があります。


具体的な問題とは関係なく、「h:commandLinkの代わりにh:outputLinkを使用する必要があるのはいつですか?」を読むことを検討してください。

于 2012-09-26T13:37:51.743 に答える