为什么从action方法返回空字符串不会重新创建视图?

时间:2017-02-05 19:42:13

标签: jsf jsf-2

我有一个JSF页面,其中包含多个文本字段(p:inputtext)和一个提交按钮。该页面由ViewScoped辅助bean支持。当命中提交按钮时,将调用一个返回空字符串(“”)的操作方法。

根据this answer of BalusC,返回一个空字符串将刷新视图并重新创建ViewScoped辅助bean。

但是,当我提交填好的表单时,重新加载的页面仍会保留我的所有文本输入。这怎么可能?由于重新创建了支持bean和视图,因此表单不应为空吗?

2 个答案:

答案 0 :(得分:0)

@dmatob是对的。当您有一个由ViewScoped bean支持的JSF页面时:

  • 如果方法返回null,则不会重新创建bean(值保持不变)但重新加载页面。
  • 如果方法返回相同或另一个页面,则将重新创建bean(它会重置值)并重新加载页面。

我几个小时前面对的是:尝试在方法成功执行时重置值。所以在看完周围后,我发现了一些最终成功的东西:

您必须使用 操作 而不是 actionListener (差异here

<p:commandButton value="Save" action="#{backingBean.save()}" />

因此该方法必须返回一个String

public String save(){
  if(validations==true){
     return "currentpage.xhtml?faces-redirect=true";
  }
  return null;
}

当一切正常时,它将重新创建bean,刷新页面并重置值。否则该方法返回null,因此它将刷新页面,但是bean。

[已编辑]

如果方法返回null或空String,则不会重新创建bean:PostConstruct(init事件)不会被触发,这意味着值保持不变。在另一种情况下,如果它返回一个String(重定向到某个页面),则调用init事件,以便初始化值。

在两种情况下都重新加载JSF页面:当返回null / empty String时。

希望它能帮到你......让我知道; - )

答案 1 :(得分:-1)

在视图范围内的bean中,仅当您的action方法返回null时,bean才会再次初始化。

如果您希望action方法返回到提交的表单并重新加载bean,那么您的方法必须返回包含该表单的页面的名称。