返回支持 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 【问题描述】:当我的commandButton
s 为signup
和login
在他们的支持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。
正确的方法取决于具体的功能要求。如果要返回相同的视图,只需返回null
或void
(不是空字符串)。在这种情况下,通常不需要创建新视图。仅当您在当前视图中具有视图构建时间标记(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?的主要内容,如果未能解决你的问题,请参考以下文章
sec:authorize 总是在浏览器中为百里香视图中的 isAuthenticated() 和 isAnonymous() 返回相同的视图