返回到支持 bean 中的相同视图,我应该 return null 还是空字符串或视图 ID?

Returning to same view in backing bean, should I return null or empty string or view ID?

当我的 commandButtons for signuplogin 在他们的支持 bean 中调用他们的方法时,我想在成功时重定向到 index,并保持不变失败时查看。一切正常,我 return "index?faces-redirect=true" 就成功了。我现在意识到失败的情况,我有不同的可能性:我可以 return "signup"(或 "login"),"" 也可以,甚至当我 return null 我得到了相同的结果。至少我无法检测到任何差异。

有什么共同的样式return,当结果应该是相同的视图时?

I could return "signup" (or "login"), also "" works, and even when I return null I get the same result. At least I can not detect any differences.

null 和非 null 结果实际上存在技术差异。 null(或void)结果将重用相同的视图。非 null 结果将丢弃当前视图并创建一个全新的视图,即使它 return 具有相同的视图标识符。 “视图”在这里是 UIViewRoot 实例,包括它的所有状态。空字符串表示“当前视图 ID”。

值得注意的是 @ViewScoped bean 受此影响。它们将与视图一起被丢弃并重新创建。但是,如果您使用的是 @RequestScoped bean,那么您确实不会注意到 bean 行为的任何技术差异。当视图被丢弃时它不会被丢弃,但只有在请求结束时才会被丢弃。换句话说,即使在同一个请求中重新创建同一个视图,也会使用同一个 @RequestScoped bean。

正确的方法取决于具体的功能需求。如果你想 return 到相同的视图,只需 return nullvoid (不是空字符串)。在这种情况下通常不需要创建新视图。仅当您在当前视图中具有视图构建时间标签(JSTL 和朋友),其模型值已在 bean 操作方法中更改时,您才需要通过 returning 一个空的来强制重建视图细绳。如果您想导航到不同的视图,return 所需的视图标识符,最好与 faces-redirect=true 一起确定它是否是幂等的(可添加书签)。

另请参阅:

  • How to navigate in JSF? How to make URL reflect current page (and not previous one)
  • Difference between View and Request scope in managed beans