2011-04-03 19 views
1

我只是想轉換導航的URL參數,例如2010年,像「2010/11賽季」這樣的字符串。我想到了一個轉換器,使用這樣的:Seam:你如何使用轉換器從頁面參數派生一個值?

<ui:define name="navigation"> 
    <li> 
    <s:link view="/season-list.xhtml" value="#{seasonHome.id}" styleClass="selected" rendered="#{not empty seasonHome.id}" converter="#{startYearLabelConverter}" /> 
    </li> 
    ... 
</ui:define> 

轉換代碼:

@Name("startYearLabelConverter") 
@BypassInterceptors 
@Converter 
public class StartYearLabelConverter implements javax.faces.convert.Converter 
{ 
    @Override 
    public Object getAsObject(FacesContext fc, UIComponent uic, String s) 
    { 
     // "Season 2010/11" -> 2010 (as new Integer) 
     ... 
    } 

    @Override 
    public String getAsString(FacesContext fc, UIComponent uic, Object obj) 
    { 
     // 2010 (as Integer) -> "Season 2010/11" 
     ... 
    } 
} 

顯然S:鏈接不具有的 「轉換器」 的屬性。它如何作爲「最佳實踐」而不必重複EL代碼,如s:link ... value="Season #{seasonHome.id}/#{(seasonHome.id + 1).toString().substring(2)}"

回答

0

轉換器是用於「綁定」屬性 - 您讀取和寫回它們。你給出的例子不需要轉換器。

所有你所要做的就是在你的SeasonHome豆寫一個方法:

public String getSeasonDescription() { 
    return "Season " + id + "/" + new Integer(id + 1).toString().substring(2); 
} 

,然後用它在你的XHTML:

<ui:define name="navigation"> 
    <li><s:link view="/season-list.xhtml" value="#{seasonHome.seasonDescription}" styleClass="selected" rendered="#{not empty seasonHome.id}" converter="#{startYearLabelConverter}" /> 
    </li> 
    ... 
</ui:define> 
+0

它被綁定。使用轉換器僅用於輸出是完全正確的。 – 2013-06-21 10:26:38

0

,我們也建立了一些自定義的轉換器。而且我們發現,如果您像這樣向轉換器添加另一個簡單的format()方法,可以很好地調用它們。

@Name("myConverter") 
@Converter(forClass = XXX.class) 
@BypassInterceptors 
public class MyConverter implements javax.faces.convert.Converter { 

/* standard asObject/asString methods skipped */ 

public String format(XXX value) { 
    return this.getAsString(null, null, value); 
} 

然後我們把這種轉換器通過它的bean名稱來格式化值:

<f:param 
    value="#{myConverter.format(value)}" /> 

我不知道,如果你需要在FacesContext在你的轉換器,但它不應該是一個問題在需要時獲取實例。

此致敬禮, 亞歷山大。

相關問題