引用此 好文章,
新视图范围应该解决
正是那些问题。一个@ViewScoped
豆子只要你活着就会活着
将表单提交到同一视图
一次又一次。换句话说,作为
只要行动方法的时候
bean返回null或者甚至是void
将在下一个请求中出现。
导航到不同的视图后,
然后豆子将被摧毁。
我想到了这些问题:
- 如果我目前的观点是
index.xhtml
,如果我明确指定 return "index";
要么 <h:commandButton action="index.xhtml" ..>
,基本上返回到相同的视图,bean将再次重新创建..为什么?
- 视图操作的bean能否在重定向中存活?
- 如果可以,我该如何指定呢?我无法想象做类似的事情
return "?faces-redirect=true"
要么 <h:commandButton action="?faces-redirect=true" ..>
,是的,我想跳过定义导航 faces-config.xml
使用 <redirect/>
。
如果我当前的视图是index.xhtml,并且如果我明确指定返回“index”;或者,基本上返回到相同的视图,bean将再次重新创建..为什么?
如果明确指定结果(读取:视图),则将创建新视图。你必须从action方法返回null或void(或者只是省略 action
命令组件的属性)。
我必须承认,我理解你的困惑,并且“视图”一词可以根据具体情况进行不同的解释。我想我迟早会修改链接文章中的措辞。
Viewscoped bean可以在重定向中存活吗?
不可以。会话范围内的bean可以和 闪光范围 也(一旦重定向完成后立即结束,那也许就是你 其实 在提出这个问题时需要你想到的功能要求)。
如果提供了javax.faces.ViewState,则视图状态可以在重定向后继续存在。我发现目前最简单的解决方案是实现导航处理程序。
在faces-config.xml中:
<faces-config>
<application>
...
<navigation-handler>com.intersult.jsf.util.RedirectNavigationHandler</navigation-handler>
</application>
...
</faces-config>
Java类:
public class RedirectNavigationHandler extends ConfigurableNavigationHandler {
private NavigationHandler parent;
public RedirectNavigationHandler(NavigationHandler parent) {
this.parent = parent;
}
@Override
public void handleNavigation(FacesContext context, String from, String outcome) {
if (!context.getPartialViewContext().isPartialRequest()) {
if (outcome == null)
outcome = context.getViewRoot().getViewId();
if (!outcome.endsWith("?faces-redirect=true"))
outcome += "?faces-redirect=true";
String viewState =
context.getExternalContext().getRequestParameterMap().get(ResponseStateManager.VIEW_STATE_PARAM);
outcome += "&javax.faces.ViewState=" + viewState;
}
parent.handleNavigation(context, from, outcome);
}
}
这会产生一些影响:每次重定向都不再是一个独立的请求。它取决于视图状态,它不能被必然恢复。所以有一个后备策略,如果它已过期,例如。重定向视图过期的异常。