Шов: Как вы используете конвертеры для получения значения из параметра страницы? - PullRequest
1 голос
/ 03 апреля 2011

Я просто хочу преобразовать параметр URL для навигации, например, 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: ссылка не имеет атрибута "конвертер".Как это сделать в качестве «лучшей практики» без необходимости повторять код EL, например s:link ... value="Season #{seasonHome.id}/#{(seasonHome.id + 1).toString().substring(2)}"?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2011

мы также создали несколько пользовательских конвертеров.И мы обнаружили, что их можно вызывать довольно красиво, если вы добавите еще один простой метод 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);
 }

Затем мы вызываем этот преобразователь по имени его компонента для форматирования значения:*

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

Я не знаю, нужен ли вам FacesContext в вашем конвертере, но не должно быть проблемой получить экземпляр, когда он вам нужен.

С уважением, Александр.

0 голосов
/ 14 июня 2011

Конвертеры предназначены для «связанных» свойств - вы читаете и записываете их обратно. Приведенный вами пример не нуждается в конвертере.

Все, что вам нужно сделать, это написать в своем бобе 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...