当使用immedaite = true设置命令按钮时,哪个类包含在APPLY REQUEST VALUES阶段调用操作方法的逻辑?

时间:2014-01-29 16:11:05

标签: jsf jsf-2

我正在浏览Mojarra JSF-impl 2.1.19的内容以了解内部情况。但我无法找到在APPLY REQUEST VALUES阶段调用action方法的逻辑(ApplyRequestValuesPhase.execute方法......以及里面调用的方法)本身当命令按钮设置为属性immedaite = true时。任何人都可以帮我找到它。

提前致谢。

1 个答案:

答案 0 :(得分:1)

它是执行解码和操作事件排队作业的渲染器。如果特别是Mojarra实施<h:commandButton>,那就是ButtonRenderer。以下是decode()方法的相关摘录:

77     public void decode(FacesContext context, UIComponent component) {
78 
79         rendererParamsNotNull(context, component);
80 
81         if (!shouldDecode(component)) {
82             return;
83         }
84 
85         String clientId = decodeBehaviors(context, component);
86 
87         if (wasClicked(context, component, clientId) && !isReset(component)) {
88             component.queueEvent(new ActionEvent(component));
89 
..             
97         }
98 
99     }

请参阅,它进一步委托组件自己的queueEvent()方法。 <h:commandButton>的组件类是从HtmlCommandButton延伸的UICommand。它的queueEvent()方法依次实现如下:

335    public void queueEvent(FacesEvent e) {
336        UIComponent c = e.getComponent();
337        if (e instanceof ActionEvent && c instanceof ActionSource) {
338            if (((ActionSource) c).isImmediate()) {
339                e.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
340            } else {
341                e.setPhaseId(PhaseId.INVOKE_APPLICATION);
342            }
343        }
344        super.queueEvent(e);
345    }

请参阅?执行动作事件的目标阶段根据组件的immediate属性确定并设置在那里。