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>
就是这样。由于 @FacesComponent
的 createTag=true
功能,您无需在任何 XML 文件中显式注册自定义组件。
另一种方法是使用 OmniFaces <o:inputHidden>
,但这可能需要一个显式转换器,因为它是作为 HTTP 请求参数而不是通过 JSF 状态传递的。
我们有一个大型 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>
就是这样。由于 @FacesComponent
的 createTag=true
功能,您无需在任何 XML 文件中显式注册自定义组件。
另一种方法是使用 OmniFaces <o:inputHidden>
,但这可能需要一个显式转换器,因为它是作为 HTTP 请求参数而不是通过 JSF 状态传递的。