2013-03-03 64 views

回答

0

不完全确定你在问什么,但是,如果你的bean不是请求范围,他们会用你以前的值填充你的html表单控件。

如果你的豆视图范围或session范围,您仍可以通过在bean的行动贪利操纵模型值(commandLink/commanButton动作)

,如果您想要的值被清除的控制渲染值稍后访问同一页面时,应该让你的页面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; 
    } 

}

+0

这并不完全正确。请求范围的bean将被重新创建,并在下一次请求时被重新填充(通过客户端值),尽管视图范围的bean不会被重新创建,但从视图中恢复(不包括鸡蛋)。但数据将保持不变。 – skuntsel 2013-03-03 08:30:00

+0

ahh是的,我明白了你的观点,我编辑了我的答案,使其更清晰 - 但是如果你希望通过在操作方法中返回相同的viewid来完全重置视图,请参阅http://stackoverflow.com/questions/9458911/reset-jsf-backing-beanview-or-session-scope例如 – 2013-03-03 08:34:05

+0

当然,因为它不会是回发。但我理解OP的问题,他希望他在(听众)方法中产生的变化*在他看来反映出来。顺便说一句,你知道UI组件的绑定属性在查看作用域bean方面做了什么吗? – skuntsel 2013-03-03 08:40:18

0

JSF做你告诉它做什么。

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

0

是的,数据绑定是双向的。但是,这意味着小,没有回答两个关键问题:

  • 读写时发生,
  • 什么条件它发生。

而答案是:

  • 数据从控件被推入豆回传后,如果每一个组件是有效的。
  • 数据是在渲染之前从bean读取的,也就是在每个操作发生之后,每个标准事件触发(命令按钮,valuechange事件等)。

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

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

  1. 部件使用请求数据和可能的其他一些,配置相关的装置恢复它们的状态[回发仅]
  2. 如果转换和验证都很好,然后来自组件的数据被复制到使用绑定的后台bean,如果没有,则跳过下一步,但组件仍然记住它们的状态[仅回发]
  3. 动作被执行(查看动作,命令)。在这个阶段,你总是可以从bean中读取数据并确保它是有效的(不是“一致的”,更像是“每个组件都有一个可接受的值”)。您也可以更改bean中的值,确保它们将在下一步中使用。
  4. 组件使用绑定从后台bean中提取数据并将其提取。

的外卖店:

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

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

+0

请注意,如果属性处于提交表单中,绑定将仅为双向**,否则JSF将仅使用getter。 – 2013-03-04 04:22:33

+0

@LuiggiMendoza:不要忘记,服务器*需要插入!电力对于JavaServer Faces工作至关重要。 – fdreger 2013-03-09 21:27:05

+0

即使您为您的电子设备充电,登录到SO并添加此类评论,电力也至关重要! – 2013-03-09 21:57:44

相关问题