JSF值绑定是单向的还是双向的?
当我清除备份bean数据时,视图仍然保留旧的值。JSF就是这样工作的吗?我想知道一种方法来同步视图与备份bean
是的,数据绑定是双向的。但是,如果不回答两个关键问题,这就没有什么意义了:
- 当读写发生时,
- 在什么条件下发生。
答案是:
- 如果每个组件都有效,则数据在回发后从控件推送到bean。
- 在渲染之前从bean中读取数据,即在每个动作发生和每个标准事件(命令按钮,值交换事件等)触发之后。
这意味着与第一直觉相反:-像输入这样的组件保持它们的状态,并且它与支持bean分离。它可以保持很长时间,甚至多次回发,而不需要与支持bean进行任何同步(例如,当表单上的任何其他组件无法验证时)。
想象生命周期的最简单方法是:
- 组件使用请求数据和可能的其他一些依赖于配置的方法来恢复它们的状态[仅限回发]
- 如果转换和验证没问题,那么使用绑定将来自组件的数据复制到支持bean;如果没有,则跳过下一步,但组件仍然记住它们的状态[postback only]
- 操作被执行(查看操作、命令)。在这个阶段,您总是可以从bean中读取数据,并确保它是有效的(不是"一致的",更像是"每个组件都有一个可接受的值")。您还可以更改bean中的值,以确保它们将在下一步中使用。 组件使用
- 绑定从备份bean中提取数据并拉出数据。
要点是:
- 如果你试图在getter和setter中加入任何逻辑,你就有问题了。如果你的任何setter设置了一些额外的属性,你的代码将设置一些其他的值,结果可能取决于调用绑定的顺序(步骤2);
- 唯一适合更改任何数据的时刻是步骤3:执行操作的时刻;
- 如果你没有任何动作,你也可以使用preenderview事件,它在步骤3和4之间被调用(如果你有一个纯GET页面,可以用来将一些数据移动到bean中,没有回发)。
- 在转换器、验证器和值交换监听器中更改bean或依赖bean的值至少是棘手的。
如果您尝试按照规律使用JSF,那么使用它将是一种真正的乐趣。如果你试图违背你的想法,让JSF适应你对web框架应该如何工作的想法(比如在你的验证器中使用业务验证,在转换器中改变模型,从构造函数中读取数据库等),你将需要大量BalusC的帮助:-)
不太确定您在问什么,但是,如果bean不在请求范围内,它们将用先前的值填充html表单控件。
如果您的bean是视图作用域或会话作用域,您仍然可以通过操作bean的操作方法(commandLink/commanButton操作)中的模型值来控制呈现的值
如果希望在以后访问同一页面时清除这些值,则应该设置页面bean请求作用域。
如果你愿意,你可以通过使用绑定而不是值直接对ui组件进行微管理,从而完全控制ui组件,从而允许你直接在bean中创建和管理ui组件。例如
<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;
}
}
JSF执行您的命令。
为了刷新视图(在您对bean进行一些更改之后),您需要通过从您的操作方法返回null/void来执行回发到原始视图,或者指定要执行(更新)并稍后呈现(刷新)的组件的客户端id(或其他可接受的值,如@form)作为附加到您的组件的<f:ajax>
标签的属性,该组件应该对bean进行更改。