从 JSF 操作返回 null 和 "" 之间的区别

Posted

技术标签:

【中文标题】从 JSF 操作返回 null 和 "" 之间的区别【英文标题】:Difference between returning null and "" from a JSF action 【发布时间】:2012-02-03 09:00:34 【问题描述】:

据我了解,当 JSF 操作返回 ""(空字符串)时,用户会停留在当前页面上,但视图会刷新。但是,当操作返回 null 时,用户仍停留在当前页面上,但旧视图被重用。我的问题是:

    上述说法是否正确(准确)? 如果是,那么这意味着什么?具体来说,使用其中一种与另一种对页面上的数据(例如 JSF UI 组件中的值,或存储在 DataTable 中的请求范围 bean 中的数据)有什么影响? 在什么情况下应该使用一种而不是另一种?

【问题讨论】:

【参考方案1】:

上述说法是否正确(准确)?

是的。除了返回null,您也可以只返回void


如果是,那么这意味着什么?具体来说,使用一个与另一个对页面上的数据有什么影响(例如 JSF UI 组件中的值,或存储在 DataTable 中的请求范围 bean 中的数据)?

没有请求范围的 bean。它只对 JSF2 视图范围的 bean 有影响。返回 nullvoid 时,视图范围的 bean 实例将保留在下一个请求中,否则将重新创建。


在什么情况下应该使用一种而不是另一种?

如果您想在后续请求中保留 JSF2 视图范围的 bean。

另见:

Communication in JSF 2.0 - Managed bean scopes

【讨论】:

所以如果我使用没有视图范围的 JSF 1.2,那么可以肯定地说真的没有区别吗? 功能上,没有。但从技术上讲,您已经发现了一个差异。创建新视图的成本很小。在回发时始终将nullvoid 返回到相同的视图。 仅供参考:应用程序操作在 JSF2 规范中具有以下约束:1.该方法必须是公开的。 2. 方法不能带参数。 3. 该方法必须返回 Object。 我记得如果您尝试使用 void 返回类型,但不记得哪个供应商/版本,至少有一个导航 API 实现崩溃了。 @McDowell:实际上,任何可以用MethodExpression 表示的东西都是合法的行动方法,即使是在EL 2.2 中尽可能采用参数的方法。该规范引用可能是 JSF 1.0 的遗留物。 这种区别对待响应值是否包含在规范中,或者它只是实现的东西?

以上是关于从 JSF 操作返回 null 和 "" 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

从 JSF 页面获取请求和会话参数和属性

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

JSF:使用带有 ICEfaces 的 AJAX 推送 (ICEpush)

JSF 2.2 将提交的空字符串值解释为 null 不起作用

从 servlet 过滤器重定向到 jsf 会返回未呈现为 html 的实际 jsf 代码

RestKit 从 JSON 响应返回空值作为“<null>”