我知道这类问题在这里已经被问了几百万次,但我找不到相关帖子中我的问题的解决方案。
JSF 1.2
我有一个请求范围的bean,其方法用作valueChangeListener:
class DoStuff{
...
public void step1ChkStuffIncluded_CheckedChanged(ValueChangeEvent event){
StuffDocument cd = (StuffDocument)getInfo("StuffDocument");
if(cd == null){
Logger.Error("DoStuff", "step1ChkStuffIncluded_CheckedChanged", "No stuff document (null)");
return;
}
if (step1ChkStuffIncludedChecked){
cd.handleChecked();
}
else{
cd.handleUnchecked();
}
}
...
}
由selectBooleanCheckbox
组件如下(.jspx):
...
</h:panelGroup>
<h:panelGroup rendered="#{DoStuff.pnlStep1}">
<p>
<label for="step1ChkStuffIncluded">#{DoStuff.step1ChkStuffIncludedText}</label>
<h:selectBooleanCheckbox
id="step1ChkStuffIncluded"
onchange="submit();"
value="#{DoStuff.step1ChkStuffIncludedChecked}"
valueChangeListener="#{DoStuff.step1ChkStuffIncluded_CheckedChanged}">
</h:selectBooleanCheckbox></p>
</h:panelGroup>
<div id="someDiv">
...
,其中
xmlns:h="http://java.sun.com/jsf/html"
每当bean的范围是session时,都会执行setter和复选框的监听器,但不会在请求范围内执行。不幸的是,我无法找到除此之外的任何线索。
非常感谢任何建议。欢迎要求进一步澄清。
答案 0 :(得分:2)
您在父组件上有rendered="#{DoStuff.pnlStep1}"
。在处理表单提交期间,JSF将作为攻击保护的一部分,确定输入组件(及其所有父项)是否根据服务器端条件进行呈现。如果它没有渲染,那么在处理过程中它将被完全跳过。
它在会话范围的bean中工作但在请求范围的bean中失败表示rendered="#{DoStuff.pnlStep1}"
后面的值是根据在显示表单的请求期间出现的某些基于请求的变量/条件确定的,但是在处理表格提交请求期间缺席。
要解决此问题,您需要确保在处理表单提交的请求期间为rendered="#{DoStuff.pnlStep1}"
后面的值保留完全相同的变量/条件。有几种方法可以实现这一点,具体取决于条件的性质以及您提交表单的方式。其中一种方法是将基于请求的变量/条件作为请求参数传递回<f:param>
或<h:inputHidden>
。
规范的JSF 2.0修复方法是将bean放在JSF 1.2中不可用的视图范围中,但可以使用Tomahawk的<t:saveState>
组件进行模拟。