0

JSF 值绑定是单向的还是双向的?

当我清除我的支持 bean 数据时,视图仍然保留旧值。这是 JSF 的工作方式吗?我想知道一种将视图与支持 bean 同步的方法。

4

3 回答 3

1

是的,数据绑定是双向的。但这意味着什么,如果不回答两个关键问题:

  • 当阅读和写作发生时,
  • 它在什么条件下发生。

答案是:

  • 如果每个组件都有效,则数据在回发后从控件推送到 bean。
  • 数据是在渲染之前从 bean 中读取的,即在每个动作发生并触发每个标准事件(命令按钮、值更改事件等)之后。

这意味着与第一直觉相反: - 像输入这样的组件确实保持它们的状态,并且它与支持 bean 分离。它可以保留很长时间,甚至可以保留很多回发,而无需与支持 bean 进行任何同步(例如,当表单上的任何其他组件无法验证时)。

想象生命周期的最简单方法是:

  1. 组件使用请求数据和可能的其他一些依赖于配置的方式来恢复它们的状态[仅限回发]
  2. 如果转换和验证正常,则使用绑定将来自组件的数据复制到支持 bean,如果不是,则跳过下一步,但组件仍会记住它们的状态 [仅限回发]
  3. 执行动作(查看动作、命令)。在这个阶段,您总是可以从 bean 中读取数据并确保它是有效的(不是“连贯的”,更像是“孤立的每个组件都有一个可接受的值”)。您还可以更改 bean 中的值,以确保它们将在下一步中使用。
  4. 组件使用绑定从支持 bean 中提取数据并拉取数据。

要点是:

  • 如果您尝试将任何逻辑放入 getter 和 setter 中,那么您就会遇到问题。如果您的任何设置器设置了一些额外的属性,您最终会得到设置其他值的代码,结果可能取决于调用绑定的顺序(步骤 2);
  • 更改任何数据的唯一好时机是第 3 步:执行操作的时刻;
  • 如果您没有任何操作,您也可以使用 PreRenderView 事件,它在第 3 步和第 4 步之间被调用(如果您有一个纯 GET 页面,则可用于将一些数据移动到 bean 中,没有回发)。
  • 在转换器、验证器和 valuechangelisteners 中更改 bean 或依赖 bean 的值 - 至少很棘手。

如果您尝试将 JSF 与谷物一起使用,那么使用起来真的很愉快。如果试图违背常规并将 JSF 转变为您对 Web 框架应该如何工作的想法(例如在验证器中使用业务验证、更改转换器内部的模型、从构造函数读取数据库等),您将需要 BalusC 的大量帮助:-)

于 2013-03-03T12:32:40.800 回答
0

不太确定您要问什么,但是是的,如果您的 bean 不是请求范围,它们将使用以前的值填充您的 html 表单控件。

如果您的 bean 是视图范围或会话范围,您仍然可以通过在 bean 的操作方法(commandLink/commanButton 操作)中操作模型值来控制呈现的值

如果您希望在以后访问同一页面时清除这些值,您应该使您的页面 bean 请求范围。

如果您愿意,您可以通过使用绑定而不是值直接对 UIComponents 进行微管理以实现完全控制,从而允许您直接在 bean.eg 中创建和管理 UIComponents

<h:inputText binding="#{bean.inputComponent" />在你的代码中

public class myBean {
    private UIInput inputComponent;

    public UIComponent getInputComponent() {
        // create your UIComponent here, and manage values in your command methods
    }

    public void setInputComponent(UIComponent component) {
         inputComponent = component;
    }

}

于 2013-03-03T08:24:02.697 回答
0

JSF 做你告诉它做的事情。

为了刷新视图(在对 bean 进行一些更改之后),您需要通过从您的操作方法返回 null/void来回发到原始视图,或者指定客户端 ID(或其他可接受的值,如 @form ) 要执行(更新)并稍后呈现(刷新)为附加到您的组件的标签的属性,<f:ajax>该组件应该对您的 bean 进行更改。

于 2013-03-03T08:24:09.997 回答