JSF 1.2 - JSF 2.3 с собственным компонентом сохранения Tomahawk-Savestate?

У нас есть большое веб-приложение, которое все еще использует JSF 1.2 с Myfaces и Tomahawk. Миграция самого JSF кажется не большой проблемой, но поскольку томагавк больше не разрабатывается, нам нужно избавиться от всех наших сохранений. Я знаю, что мы должны использовать Viewscope или аналогичные области для удаления состояния сохранения, но это вызывает проблему, заключающуюся в том, что поведение отличается от нашего использования состояния сохранения. Мы сохранили только несколько конкретных значений внутри состояния сохранения, а не весь компонент.

Поэтому, если мы мигрируем, заменив состояние сохранения областью действия, мы должны проверить каждый сайт, работает ли он так, как должен.

Можно ли разработать собственный компонент сохранения состояния, который будет работать с JSF2.3? Если да, мы могли бы просто заменить t:savestate новым компонентом и перенести старые представления при их перестроении.


person antii    schedule 07.01.2021    source источник


Ответы (1)


Можно ли разработать собственный компонент состояния сохранения, который будет работать с JSF2.3?

да.

Вот пример запуска, основанный на исходном коде <t:saveState>:

@FacesComponent(createTag=true)
public class SaveState extends UIParameter {

    public SaveState() {
        setRendererType(null);
    }

    @Override
    public Object saveState(FacesContext context) {
        Object[] values = new Object[2];
        values[0] = super.saveState(context);

        if (getValueExpression("value") != null) {
            values[1] = getValue();
        }

        return values;
    }

    @Override
    public void restoreState(FacesContext context, Object state) {
        Object values[] = (Object[]) state;
        super.restoreState(context, values[0]);
        ValueExpression valueExpression = getValueExpression("value");

        if (valueExpression != null) {
            valueExpression.setValue(context.getELContext(), values[1]);
        }
    }

}

Чтобы использовать его, объявите для предопределенного пространства имен XML http://xmlns.jcp.org/jsf/component:

<anyElement ... xmlns:my="http://xmlns.jcp.org/jsf/component">
    ...
    <my:saveState value="#{bean.property}" />
    ...
</anyElement>

Это все. Благодаря функции createTag=true компонента @FacesComponent вы не не нужно явно регистрировать пользовательский компонент в каком-либо файле XML.

Альтернативой может быть использование OmniFaces <o:inputHidden>, но это может потребовать явного преобразователя, поскольку он передается как параметр HTTP-запроса, а не через состояние JSF.

person BalusC    schedule 08.01.2021
comment
Я попробую. Спасибо за Ваш ответ! - person antii; 13.01.2021
comment
Это работает, спасибо! Единственная проблема, с которой я столкнулся сейчас, заключается в том, что теги jstl-core оцениваются до восстановления состояния сохранения. - person antii; 01.02.2021