清除我的支持bean时,View保留旧值

时间:2013-03-03 08:01:12

标签: jsf jsf-2 el

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

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

3 个答案:

答案 0 :(得分:0)

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

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

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

如果您愿意,可以通过使用绑定而不是值直接对UIComponents进行微观管理以实现完全控制,从而允许您直接在bean中创建和管理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;
    }

}

答案 1 :(得分:0)

JSF做你告诉它做的事。

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

答案 2 :(得分:0)

是的,数据绑定是双向的。但这并不能解决两个关键问题:

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

答案是:

  • 如果每个组件都有效,数据会在回发后从控件推送到bean中。
  • 在呈现之前从bean读取数据,即在每个操作发生之后以及每个标准事件被触发(命令按钮,值更改事件等)。

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

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

  1. 组件使用请求数据以及可能的其他一些与配置相关的方法[仅回发]
  2. 来恢复其状态
  3. 如果转换和验证没问题,那么使用绑定将组件中的数据复制到支持bean,否则,跳过下一步,但组件仍然记住它们的状态[仅回发]
  4. 执行
  5. 操作(查看操作,命令)。在这个阶段,你总是可以从bean中读取数据并确保它是有效的(不是“连贯的”,更像是“隔离的每个组件都具有可接受的值”)。您还可以更改bean中的值,确保它们将在下一步中使用。
  6. 组件使用
  7. 绑定从后台bean中提取数据并将其拉出来。
  8. 外卖是:

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

    如果你尝试使用JSF和谷物一起使用,那么使用起来真的很愉快。如果试图反对谷物并将JSF转向你对web框架应该如何工作的想法(比如在验证器中使用业务验证,在转换器中更改模型,从构造函数中读取数据库等),你将需要很多BalusC的帮助: - )