我正在浏览Mojarra JSF-impl 2.1.19的内容以了解内部情况。但我无法找到在APPLY REQUEST VALUES阶段调用action方法的逻辑(ApplyRequestValuesPhase.execute方法......以及里面调用的方法)本身当命令按钮设置为属性immedaite = true时。任何人都可以帮我找到它。
提前致谢。
答案 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
属性确定并设置在那里。