Seam:如何使用转换器从页面参数中获取值?

时间:2011-04-03 10:35:23

标签: jsf seam converter

我只想转换导航的网址参数,例如2010年,像“赛季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没有“converter”属性。如何在不必像s:link ... value="Season #{seasonHome.id}/#{(seasonHome.id + 1).toString().substring(2)}"重复EL代码的情况下将其作为“最佳实践”来完成?

2 个答案:

答案 0 :(得分:0)

转换器用于“绑定”属性 - 您可以读取和写回它们。你给出的例子不需要转换器。

你要做的就是在SeasonHome bean中写一个方法:

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>

答案 1 :(得分: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,但在需要时获取实例应该不是问题。

祝你好运, 亚历山大。