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

Posted

技术标签:

【中文标题】返回支持 bean 中的相同视图,我应该返回 null 或空字符串还是视图 ID?【英文标题】:Returning to same view in backing bean, should I return null or empty string or view ID? 【发布时间】:2016-08-08 16:09:35 【问题描述】:

当我的commandButtons 为signuplogin 在他们的支持bean 中调用他们的方法时,我想在成功时重定向到index,并在失败时保持相同的视图。一切正常,我成功返回"index?faces-redirect=true"。我现在意识到失败的情况,我有不同的可能性:我可以返回"signup"(或"login"),"" 也可以,即使我返回null,我也会得到相同的结果。至少我无法发现任何差异。

有没有通用的样式返回什么,什么时候结果应该是同一个视图?

【问题讨论】:

【参考方案1】:

我可以返回"signup"(或"login"),"" 也有效,即使我返回null,我也会得到相同的结果。至少我无法发现任何差异。

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

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

正确的方法取决于具体的功能要求。如果要返回相同的视图,只需返回nullvoid(不是空字符串)。在这种情况下,通常不需要创建新视图。仅当您在当前视图中具有视图构建时间标记(JSTL 和朋友),其模型值已在 bean 操作方法中更改时,您才需要通过返回空字符串来强制重建视图。如果您想导航到不同的视图,请返回所需的视图标识符,最好与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 What's the view build time?

【讨论】:

我最近将一个应用程序更新到 JSF2,其中很多操作都返回一个空字符串。现在它每次都打印以下消息:No navigation case match for viewId X, action Y and outcome @xuso:咬紧牙关,把它们都做成void

以上是关于返回支持 bean 中的相同视图,我应该返回 null 或空字符串还是视图 ID?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Bean作用域实例

SQL SELECT MAX() 返回多条记录

sec:authorize 总是在浏览器中为百里香视图中的 isAuthenticated() 和 isAnonymous() 返回相同的视图

JSF 中“返回”导航链接的最佳实践

查询驱动视图和实际视图不返回相同的结果

从不同区域返回视图