2011-03-04 98 views
0

我很想知道是否可以更改所有生成的鏈接的href屬性。修改JSF h:鏈接href結果

假設我有一個網頁看起來是這樣的:

<div> 
    <h:link outcome="/foo.xhtml" value="a link" /> 
    ... 
    <h:link outcome="/bar.xhtml" value="another link" /> 
</div> 

輸出結果會是這樣的:

<div> 
    <a href="/foo.jsf">a link</a> 
    ... 
    <a href="/bar.jsf">another link</a> 
</div> 

我現在正在試圖改變所產生的URL作爲生成內容中的href屬性,並假設將一個目錄添加到所有生成的鏈接(取決於它們的內容),以便我得到輸出

<div> 
    <a href="/a-new-location/foo.jsf">a link</a> 
    ... 
    <a href="/another-new-location/bar.jsf">another link</a> 
</div> 

是否有一種快速簡單的方法來實現這一點,還是必須完全自行實現組件和渲染器,並複製標準實現使用的邏輯?

+0

什麼版本的JSF使用? – DaTroop 2011-03-04 15:27:40

+0

@DaU:讀取標籤。 – BalusC 2011-03-04 15:47:30

+0

哎呀!我總是忘記看標籤 – DaTroop 2011-03-07 09:53:34

回答

0

只是一個快速的說明,讓你知道,我用我自己的ViewHandler實現,覆蓋getBookmarkableURL方法,並執行經父ViewHandler生成的URL更換更換標準ViewHandler解決了這個問題。

0

我認爲沒有使用渲染器修改的直接解決方案。

我提出了一個解決方案,它在href是一個有效的JSF頁面時起作用,並且您希望在導航處理程序評估之前對結果進行轉換。

首先,成果轉化的豆:

@ManagedBean 
@ApplicationScoped 
public class OutcomeTransformer { 

    public String getNewOutcome(String outcome){ 
     if(outcome.equals("/page.xhtml")){ 
      return "/directory/"+outcome; 
     }else if(outcome.equals("/anotherPage.xhtml")){ 
      return "/anotherDirectory/"+outcome; 
     }else{ 
      return outcome; 
     } 
    } 

} 

Seccond,使用複合組件,用於包裝的鏈接。 h:鏈接的結果由bean轉換。

<cc:interface> 
    <cc:attribute name="outcome"/> 
    <cc:attribute name="value"/> 
</cc:interface> 

<cc:implementation> 
    <h:link outcome="#{outcomeTransformer.getNewOutcome(cc.attrs.outcome)}" value="#{cc.attrs.value}"/> 
</cc:implementation> 

最後,這裏是一個使用頁面。

<ez:myLink outcome="page.xhtml" value="A page"/> 
<br/> 
<ez:myLink outcome="anotherPage.xhtml" value="Another page"/> 

當然,您可以直接在h:link中使用表達式,但對於複合組件,轉換的所有邏輯僅在一個地方。