我当前正在处理JSF 2.2应用程序。根据要求,我为我的应用程序创建了自定义视图处理程序(使用ViewHandlerWrapper
)。所有方法都只是传递给默认视图处理程序,但汇总除外,我对以下内容进行覆盖 -
private viewHandler viewHandlerWrapped = null;
renderView(FacesContext facesContext, UIViewRoot viewToRender) {
String viewId = viewToRender.getViewId();
if (viewId == some condition) {
/* Do calculation to derive viewId */
}
UIViewRoot viewRoot = viewHandlerWrapped.createView(facesContext,viewId+"?faces-redirect=true");
facesContext.setViewRoot(viewRoot);
//now let system render the view
viewHandlerWrapped.renderView(facesContext,viewRoot);
}
以上工作正常,渲染&导航正在按预期进行。唯一的问题是faces-redirect=true
不起作用。URL似乎总是后面的一个。
我经历了Stackoverflow或Internet中给出的许多答案。但是我找不到解决方法。
我认为我做错了什么,例如?faces-redirect=true
在创建视图时可能不是正确的方法。但是我不确定可以做些什么来纠正这一点。
有人可以帮我吗?
在努力工作超过4周后,我终于找到了一种获得正确URL的方法(而不是上一个)。我正在此处更新我的答案,以防其他人陷入相同的问题 -
"看来我们在创建和渲染页面时使用的方式无法按照我的使用方式使用faces-redirect=true
。它应该以表单操作的形式加以后缀。因此,我已将代码更改为如下 -
1)单击按钮时返回操作。
public string doAction {
----
return "action?faces-redirect=true";
}
2)更新代码以尽可能使用隐式导航。这样,由于导航正在隐式进行,我不需要构建自定义ViewHandler。所以,我取消了ViewHandler。
使用以上两个简单的步骤,现在在浏览器上显示正确的URL。