JSF 值绑定是单向的还是双向的?
当我清除我的支持 bean 数据时,视图仍然保留旧值。这是 JSF 的工作方式吗?我想知道一种将视图与支持 bean 同步的方法。
是的,数据绑定是双向的。但这意味着什么,如果不回答两个关键问题:
答案是:
这意味着与第一直觉相反: - 像输入这样的组件确实保持它们的状态,并且它与支持 bean 分离。它可以保留很长时间,甚至可以保留很多回发,而无需与支持 bean 进行任何同步(例如,当表单上的任何其他组件无法验证时)。
想象生命周期的最简单方法是:
要点是:
如果您尝试将 JSF 与谷物一起使用,那么使用起来真的很愉快。如果试图违背常规并将 JSF 转变为您对 Web 框架应该如何工作的想法(例如在验证器中使用业务验证、更改转换器内部的模型、从构造函数读取数据库等),您将需要 BalusC 的大量帮助:-)
不太确定您要问什么,但是是的,如果您的 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;
}
}
JSF 做你告诉它做的事情。
为了刷新视图(在对 bean 进行一些更改之后),您需要通过从您的操作方法返回 null/void来回发到原始视图,或者指定客户端 ID(或其他可接受的值,如 @form ) 要执行(更新)并稍后呈现(刷新)为附加到您的组件的标签的属性,<f:ajax>
该组件应该对您的 bean 进行更改。