JSF 组合不使用 StateHelper 存储状态
JSF composite does not store state with StateHelper
我正在开发一个 JSF 组合,它获取一个复杂的数据结构作为参数:
<cc:interface componentType="MyComponent">
<cc:attribute name="myModel" required="true" type="my.package.Model" />
</cc:interface>
支持组件使用 init() 方法处理此模型,该方法通过事件在组合中调用:
<cc:implementation>
<f:event type="postAddToView" listener="#{cc.init}" />
[...]
</cc:implementation>
在这个 init() 方法中,我检查模型是否已经被处理(因为我不想每次用户停留在页面上时都这样做,例如通过 ajax 请求)。因此,我通过 StateHelper.put():
存储处理后的模型
public void init()
{
if (getMyModel() == null)
{
MyModel model = processModel(...);
setMyModel(model);
}
}
@SuppressWarnings("unchecked")
public MyModel getMyModel()
{
return (MyModel) getStateHelper().get("MyModel");
}
public void setMyModel(MyModel MyModel)
{
getStateHelper().put("MyModel", MyModel);
}
我现在预计,如果在 Ajax 请求期间(在同一视图范围内)调用 init() 方法,它不会第二次处理模型,因为我已将其存储在通过 StateHelper 的视图范围。但无论我尝试什么,如果我单击命令 link 并产生 void/null 结果,getMyModel() 方法总是 returns 为空。
有什么想法吗?
在支持组件中实现 restoreState()
方法并设置断点揭示了问题。 postAddToView
事件在 调用 restoreState()
之前处理。使用 preRenderView
解决了我的问题。
我正在开发一个 JSF 组合,它获取一个复杂的数据结构作为参数:
<cc:interface componentType="MyComponent">
<cc:attribute name="myModel" required="true" type="my.package.Model" />
</cc:interface>
支持组件使用 init() 方法处理此模型,该方法通过事件在组合中调用:
<cc:implementation>
<f:event type="postAddToView" listener="#{cc.init}" />
[...]
</cc:implementation>
在这个 init() 方法中,我检查模型是否已经被处理(因为我不想每次用户停留在页面上时都这样做,例如通过 ajax 请求)。因此,我通过 StateHelper.put():
存储处理后的模型public void init()
{
if (getMyModel() == null)
{
MyModel model = processModel(...);
setMyModel(model);
}
}
@SuppressWarnings("unchecked")
public MyModel getMyModel()
{
return (MyModel) getStateHelper().get("MyModel");
}
public void setMyModel(MyModel MyModel)
{
getStateHelper().put("MyModel", MyModel);
}
我现在预计,如果在 Ajax 请求期间(在同一视图范围内)调用 init() 方法,它不会第二次处理模型,因为我已将其存储在通过 StateHelper 的视图范围。但无论我尝试什么,如果我单击命令 link 并产生 void/null 结果,getMyModel() 方法总是 returns 为空。 有什么想法吗?
在支持组件中实现 restoreState()
方法并设置断点揭示了问题。 postAddToView
事件在 调用 restoreState()
之前处理。使用 preRenderView
解决了我的问题。