我只想将导航的URL参数(例如2010)转换为类似"Season 2010/11"的字符串。我想到了一个转换器,用法如下:
<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:link 没有"转换器"属性。如何将其作为"最佳实践"完成,而不必像s:link ... value="Season #{seasonHome.id}/#{(seasonHome.id + 1).toString().substring(2)}"
那样重复EL代码?
转换器用于"绑定"属性 - 您读取和写回它们。您给出的示例不需要转换器。
你所要做的就是在你的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>
我们还构建了一些自定义转换器。我们发现,如果您像这样向转换器添加另一种简单的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,但在需要时获取实例应该不是问题。
此致敬意亚历山大。