JSF:handleNavigation,dispatch,setView在PhaseListener中不起作用

时间:2014-04-16 18:48:47

标签: jsf-2.2 forwarding phaselistener

我绝望地尝试编写一个在RESTORE_VIEW之前运行的JSF阶段监听器,它根据登录状态,永久登录状态,请求视图等转发到不同的页面......这有点复杂但是很容易所有这些都没有,以下任何一个转发正确:

这个似乎只有在faces-config中还有一个导航案例才能起作用,因为它最终会出现" ...没有找到导航案例......"

String path = "/user/login.xhtml";
FacesContext context = event.getFacesContext(); // PhaseEvent event;

context.getApplication().getNavigationHandler().handleNavigation(context, null, path);

以下内容相同:

context.getExternalContext().dispatch(path);

在最后一个中,getViewRoot()始终返回null:

context.getViewRoot().setViewId(path);

那么如何在不定义导航案例的情况下转发?

事实证明重定向有效:

  String requestUrlString = ((HttpServletRequest)(FacesContext.getCurrentInstance().getExternalContext().getRequest())).getRequestURL().toString();
  URL requestUrl = new URL(requestUrlString);
  String linkUrlString = requestUrl.getProtocol() + ":" + "//"
          + requestUrl.getHost() + ":" + requestUrl.getPort()
          + context.getExternalContext().getApplicationContextPath() + "/faces" + path + ".xhtml";
  context.getExternalContext().redirect(linkUrlString);

1 个答案:

答案 0 :(得分:0)

试试这个:

FacesContext ctx = FacesContext.getCurrentInstance();
ctx.getExternalContext().redirect(outcome);
ctx.responseComplete();