2012-09-26 38 views
5

我正在維護一個JSF2 Ajax應用程序,並且我們大量使用h:commandLinksf:ajax標籤來執行所有操作 - 始終只是重新渲染所需的內容。如何更改h:commandLink的標準href =「#」屬性?

執行上的鏈接點擊右鍵並選擇「在新標籤頁中打開鏈接」等,當這並不當然打破了用戶的預期行爲

我明白,F:AJAX部隊在href屬性附加傷害導致a元素爲#,並在onclick函數中執行所有魔術發佈請求欺騙 - 我現在希望通過在產生的<a>標記的href屬性中放置一些有意義的鏈接來爲「打開鏈接...」動作提供回退支持。

這不會打破「正常」的onclick行爲,因爲生成的javascript始終以return false;結束,但允許我使用普通的GET請求將用戶發送到某個頁面,以防他們希望在新窗口中打開鏈接。

有沒有一種方法可以做到這一點?或者有人可能會指出我在正確的方向上,在JSF生命週期的哪個位置,我可能會使用階段偵聽器來執行此操作?

回答

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> 

需要注意的是這種緊密耦合的渲染器鑽嘴魚科。要成爲獨立的JSF實現,您需要創建一個全新的渲染器,而不是擴展Mojarra特定的渲染器類。


無關到具體的問題,可以考慮讀When should I use h:outputLink instead of h:commandLink?

+0

謝謝BalusC,延長CommandLinkRenderer工作完全達到預期的效果。 – bxr

+0

不客氣。 – BalusC