这是我的阶段监听器
public class AdminPhaseListener implements PhaseListener {
private static final long serialVersionUID = -1161541721597667238L;
public void afterPhase(PhaseEvent e) {
System.out.println("after Phase " + e.getPhaseId());
}
public void beforePhase(PhaseEvent e) {
System.out.println("before Phase " + e.getPhaseId());
if(e.getPhaseId()== PhaseId.RESTORE_VIEW)
{
}
}
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}
单击我页面中的命令按钮,我调用一个操作方法并进行一些处理但是根本没有调用action方法,但是在服务器日志中,我可以看到我的PhaseListener打印的所有消息阶段。
如果我的视图没有改变,它会在RESTORE_VIEW阶段之后停止吗?
任何想法?
添加如何显示命令按钮的代码:
<table width="100%">
<h:column rendered="#{adminBean.displayResultsSize > 0}">
<tr>
<td colspan="14" height="5" nowrap="nowrap" class="WhiteRow"></td>
</tr>
<tr>
<td colspan="14" height="1" nowrap="nowrap" align="center"
bgcolor="#999999"></td>
</tr>
<h:inputHidden id="removeUserId" value="#{adminBean.removeUserId}"/>
<h:inputHidden id="removeIBD" value="#{adminBean.removeIBD}"/>
<h:inputHidden id="removeAPA" value="#{adminBean.removeAPA}"/>
<tr>
<td colspan="14" height="30" nowrap="nowrap"
class="FilterColumnGrayHeader" align="center">
<input type="button" disabled="disabled" id="button_edit"
value="Edit Details" class="disabledfield"
onclick="populateEditRow();">
</input> <h:commandButton type="submit" class="disabledfield" immediate="true"
id="button_remove" value="Remove" onclick="populateRemoveRow();" action="#{adminBean.remove}">
</h:commandButton>  
</td>
</tr>
<tr bgcolor="#000000">
<td colspan="14" height="1" nowrap="nowrap" align="center"
bgcolor="#999999"></td>
</tr>
<tr>
<td height="10"></td>
</tr>
</h:column>
</table>
答案 0 :(得分:33)
我引用了this answer:
每当
UICommand
组件无法调用相关操作时,请验证以下内容:
UICommand
个组件必须放在UIForm
组件内(例如h:form
)。- 您不能嵌套彼此的多个
UIForm
组件(请注意包含文件!)。- 不应该发生任何验证/转换错误(使用
h:messages
来完成所有操作)。- 如果
UICommand
组件放置在UIData
组件中,请确保DataModel
(UIData
的{{1}}属性后面的对象完全相同)保留下来。- 在应用请求值阶段,组件的
value
和rendered
属性以及所有父组件不应评估为disabled
。- 请确保请求 - 响应链中没有
false
或任何PhaseListener
更改了JSF生命周期以跳过调用操作阶段。- 请确保同一请求 - 响应链中没有
醇>EventListener
或Filter
以某种方式阻止Servlet
的请求。
另一个原因可能是您没有运行您认为正在运行的代码。
答案 1 :(得分:5)
这通常意味着页面上存在验证错误。尝试设置immediate="true"
以克服错误,或使用<h:messages>
显示出现的错误。
答案 2 :(得分:0)
检查是否在组件的任何设置器上生成错误。