【问题标题】:ActionListener phases in JSFJSF 中的 ActionListener 阶段
【发布时间】:2011-06-14 23:07:17
【问题描述】:

嗨,

我对在 JSF bean 中调用 ActionListener 方法有疑问。例如 JSF 表单的每个请求或提交都会经历六个阶段的生命周期。但是,当我们触发特定事件(如动作侦听器或值更改侦听器)时,是否有与该请求相关联的生命周期?

请澄清一下。

【问题讨论】:

    标签: jsf


    【解决方案1】:

    在调用动作阶段调用任何动作侦听器,真正的动作方法之前。要调用哪些动作侦听器方法取决于与提交关联的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 代码中将其删除,您会发现它不再起作用。您需要自己按提交按钮才能运行。

    【讨论】:

    • 好的。例如,当我们更改组合框中的值时。它将触发 ValueChangeListener。您的意思是说这将触发对服务器的完整新请求,并且页面将被重新加载。它将从 Resore View 阶段开始。我说的对吗?
    • 不,不会。至少,默认情况下不是。只有在值变化监听方法内部调用ExternalContext#redirect()FacesContext#responseComplete(),才会让JSF跳出生命周期。第一个将放弃并丢弃整个请求,让浏览器在给定的 URL 上触发一个全新的 GET 请求。默认情况下,第二个将导致空白页。当您自己已经将某些内容(例如二进制文件)写入响应并希望避免 JSF 呈现视图(从而损坏二进制文件)时,通常会使用此方法(在操作方法中)。
    • 嗨 BalusC,我想你还没有理解我的问题。在这里我的意思是说,当更改值时,它会从恢复视图等开始新的生命周期阶段吗?在您之前的评论中,您必须在 Apply Request Values 阶段调用值更改侦听器。为此,它已经开始了生命周期。我对么。这个问题可能看起来很简单,我想把基本面弄清楚。
    • 没有。它不会,它保持在同一生命周期的同一阶段(并且值更改侦听器默认情况下不在应用请求值阶段调用,而是在验证阶段调用)。
    • 是的,这只是正常生命周期的一部分。生命周期不会根据您触发 HTTP 请求的方式而改变(通过让 JavaScript 在您更改下拉/输入值时提交表单,或者通过自己按下按钮提交表单)。不管怎样,唯一的 HTTP 请求是一样的。
    猜你喜欢
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2012-12-10
    • 2011-10-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多