0

我对“JSF bean 生命周期操作”的顺序有一个复杂的问题。

我有两个不同范围的bean。第一个,我们称之为会话managerBean范围bean。第二个,具有视图范围(实际上是许多不同的 bean)。每个页面加载都会执行一些操作,并且很少有其他视图范围 bean 在其构造函数中使用此操作的结果。someBeansomeBeanManagerBean

一切正常,直到我开始从 java bean 获取 xhtml 文件中的表单 ID。现在,在创建之后managerBean采取行动,并且只有在重新加载页面时我才会得到预期的结果(刷新时,使用第一个工作结果也是如此)。 someBeansomeBeanManagerBean

这是它现在的样子:

<!-- mainTemplate is a main templete of the page which is rendered once
     per page view (every other actions are taken via ajax). This is a place
     of ManagerBean work after re rendering the page -->
<ui:composition template="/mainTemplate.xhtml"> 
    <ui:define name="mainContent">

        <h:form id="#{someBean.formID}">
            some inputs
        </h:form>

        (...)
    </ui:define>
</ui:composition>

因此,当表单 id 为常量 String 时,一切都像我想要的那样工作,而现在却不行。看起来 JSF 必须先计算 ID 并在此之后采取任何其他(包括ManagerBean操作)。

我的问题是:有没有办法改变这种情况?如果有什么不清楚的地方,请询问。我试图简化问题,因为它有很多因素。也许我所有的想法都是错误的(我想在每页采取一些行动以及在它之后采取一些行动的方式)。

任何帮助都会很好!

4

1 回答 1

1

JSF UI 组件的id(and binding) 属性在视图构建时进行评估。视图构建时间是 XHTML 源代码变成 JSF UI 组件树的那一刻。JSF UI 组件的所有其他属性value和所有事件都在视图构建时间之后preRenderView评估/执行,通常在视图呈现时间期间(当 JSF UI 组件树需要生成 HTML 输出时)。这不是你可以通过转动一个设置来改变的东西。这就是 JSF 的工作方式。您无法渲染尚未构建的东西。您只能通过正确的方式编写代码来改变这一点。

我想不出任何现实世界的场景为什么需要像这样使 ID 属性动态化。如果它在 a 内部<c:forEach>,或者是动态组件生成的一部分,那么可以,但这似乎只是一个静态形式。所以我首先建议忘记它,只在视图中对 ID 进行硬编码并依赖其他变量(可能是隐藏的输入字段?取决于具体的功能要求,这在问题的任何地方都没有提到,也没有根据到目前为止发布的代码)。

如果您确实需要使其动态化,那么您需要将formID属性从视图范围的 bean 中分离出来,并将其移动到一个不同的独立 bean,也许是一个应用程序范围的 bean。

也可以看看:

于 2013-11-12T17:32:21.407 回答