JSF 1.2 到 JSF 2.3 与 Tomahawk-Savestate 自己的 savestate 组件?

JSF 1.2 to JSF 2.3 with Tomahawk-Savestate own savestate component?

我们有一个大型 Web 应用程序,它仍在使用带有 Myfaces 和 Tomahawk 的 JSF 1.2。 JSF 本身的迁移似乎不是什么大问题,但由于不再开发 tomahawk,我们必须摆脱所有 savestate 用法。 我知道我们应该使用 Viewscope 或类似的范围来删除保存状态,但这会导致行为与我们的保存状态使用不同的问题。 我们只在 savestate 中存储了一些特定的值,而不是整个 bean。

因此,如果我们通过将保存状态替换为范围来进行迁移,我们必须测试每个站点是否仍能正常工作。

是否可以开发自己的可与 JSF2.3 一起使用的 savestate 组件? 如果是,我们可以用新组件替换 t:savestate 并在重建它们时迁移旧视图。

Would it be possible to develop an own savestate component that'll work with 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]);
        }
    }

}

为了使用它,根据http://xmlns.jcp.org/jsf/component的预定义XML名称space声明:

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

就是这样。由于 @FacesComponentcreateTag=true 功能,您无需在任何 XML 文件中显式注册自定义组件。

另一种方法是使用 OmniFaces <o:inputHidden>,但这可能需要一个显式转换器,因为它是作为 HTTP 请求参数而不是通过 JSF 状态传递的。