【发布时间】:2011-06-14 23:07:17
【问题描述】:
嗨,
我对在 JSF bean 中调用 ActionListener 方法有疑问。例如 JSF 表单的每个请求或提交都会经历六个阶段的生命周期。但是,当我们触发特定事件(如动作侦听器或值更改侦听器)时,是否有与该请求相关联的生命周期?
请澄清一下。
【问题讨论】:
标签: jsf
嗨,
我对在 JSF bean 中调用 ActionListener 方法有疑问。例如 JSF 表单的每个请求或提交都会经历六个阶段的生命周期。但是,当我们触发特定事件(如动作侦听器或值更改侦听器)时,是否有与该请求相关联的生命周期?
请澄清一下。
【问题讨论】:
标签: jsf
在调用动作阶段调用任何动作侦听器,在真正的动作方法之前。要调用哪些动作侦听器方法取决于与提交关联的UICommand 组件的actionListener 属性。
在验证阶段调用任何值更改侦听器(或在 immediate="true" 为特定 UIInput 组件应用请求值阶段)在成功转换/验证提交的值和 仅当提交的值与初始值不同时。要调用哪些值更改侦听器方法取决于与提交关联的UIInput 组件的valueChangeListener 属性。
不,它们没有自己的生命周期。当它们完成执行并返回时,它仍然处于生命周期的同一阶段。在调用valueChangeListener 之后,JSF 将继续转换/验证下一个UIInput 组件,或者如果没有,则继续下一阶段。调用actionListener 后,JSF 将继续处理下一个actionListener,如果没有,则调用实际操作方法。
更新:再次阅读您的 cmets 后,我想我现在看到了您对特别是 value change listener 的怀疑。您似乎认为默认情况下它会在客户端更改事件期间立即向服务器端触发一个全新的请求。默认情况下它会 not 这样做。您只能通过添加一小段 JavaScript 代码 来实现这一点,该代码在 HTML 输入字段的更改事件期间提交整个 HTML 表单。
onchange="this.form.submit()"
这部分与JSF无关。这是一个简单的 HTML 属性。在网络浏览器中打开页面,右键单击并选择查看源代码。你会看到它就在那里。在浏览器中禁用 JavaScript 或在 JSF 代码中将其删除,您会发现它不再起作用。您需要自己按提交按钮才能运行。
【讨论】:
ExternalContext#redirect()或FacesContext#responseComplete(),才会让JSF跳出生命周期。第一个将放弃并丢弃整个请求,让浏览器在给定的 URL 上触发一个全新的 GET 请求。默认情况下,第二个将导致空白页。当您自己已经将某些内容(例如二进制文件)写入响应并希望避免 JSF 呈现视图(从而损坏二进制文件)时,通常会使用此方法(在操作方法中)。