JSF中的ActionListener阶段

3

你好,

我对在JSF bean中调用ActionListener方法有疑问。例如,每个JSF表单的请求或提交都经过六个阶段的生命周期。但是,当我们触发特定事件(如action listener或value change listener)时,是否与该请求相关联的任何生命周期?

请解释一下。

1个回答

10
任何操作监听器在调用实际动作方法之前,在调用操作阶段被调用。决定要调用哪些操作监听器方法是基于与提交相关联的UICommand组件的actionListener属性。
任何值更改监听器在验证阶段(或特定UIInput组件的immediate =“true”时应用请求值阶段)成功转换/验证提交的值后被调用,仅当提交的值与初始值不同时才调用。决定要调用哪些值更改监听器方法是基于与提交相关联的UIInput组件的valueChangeListener属性。
并且,它们没有自己的生命周期。当它们执行并返回时,仍然处于生命周期的同一阶段。在调用valueChangeListener之后,JSF将继续转换/验证下一个UIInput组件,如果没有,则继续执行下一个阶段。在调用actionListener之后,JSF将继续下一个actionListener,如果没有,则调用实际动作方法。
更新:再次阅读您的评论后,我认为现在我了解了您对值更改监听器的疑虑。您似乎认为它默认情况下会在客户端更改事件期间立即触发全新的服务器端请求。默认情况下不会这样做。只有通过添加一小段JavaScript代码,在HTML输入字段的更改事件期间提交整个HTML表单,才能实现这一点。
onchange="this.form.submit()"

这部分与JSF无关,它是一个简单的HTML属性。在Web浏览器中打开页面,右键单击并选择查看源代码。您将看到它在那里。在浏览器中禁用JavaScript或在JSF代码中删除它,您会发现它将不再起作用。您需要自己按下提交按钮才能使其全部运行。


1
不会的。至少默认情况下不会。只有在值更改监听器方法内调用ExternalContext#redirect()FacesContext#responseComplete()时,它才会让JSF跳出生命周期。第一个将放弃和丢弃整个请求,并让浏览器在给定的URL上触发全新的GET请求。第二个默认情况下将导致空白页面。这通常在操作方法中使用(例如,当您已经自己向响应写入了某些内容(例如二进制文件)并希望避免JSF呈现视图(从而破坏二进制文件)时)。 - BalusC
不,它不会,它仍然处于相同生命周期的同一阶段(而且默认情况下,在应用请求值阶段不会调用值更改监听器,而是在验证阶段)。 - BalusC
那么,当我们在下拉框中更改值时,它会直接在验证阶段调用值更改方法吗?同时不会刷新整个页面吗?如果我理解有误请指正。 - Krishna
我已经猜到了这样的结果。请查看我的答案更新,你可能错过了。 - BalusC
1
是的,这只是正常生命周期的一部分。无论您如何触发HTTP请求(通过让JavaScript在更改下拉/输入值时提交表单,还是自己按按钮提交表单),生命周期都不会改变。无论哪种方式,唯一的HTTP请求都是相同的。 - BalusC
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接