Jsf 2 getRequestDispatcher(";).forward在JSF2.0中不起作用

Jsf 2 getRequestDispatcher(";).forward在JSF2.0中不起作用,jsf-2,Jsf 2,在我使用JSF2.0的应用程序中,我有以下代码 HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext() .getRequest(); HttpServletResponse response = (HttpServletResponse)FacesContext.getCu

在我使用JSF2.0的应用程序中,我有以下代码

    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext()
                    .getRequest();
            HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
......

try {
            request.getRequestDispatcher("SomePage.xhtml").forward(request, response);
        } catch (ServletException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
但是,当你排队的时候

 request.getRequestDispatcher("SomePage.xhtml").forward(request, response);
正在执行我得到以下异常

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at javax.faces.component.AttachedObjectListHolder.restoreState(AttachedObjectListHolder.java:165)
    at javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:1432)
    at com.sun.faces.application.view.StateManagementStrategyImpl$1.visit(StateManagementStrategyImpl.java:265)
    at com.sun.faces.component.visit.FullVisitContext.invokeVisitCallback(FullVisitContext.java:151)
由于一些应用限制,我不能使用

FacesContext.getCurrentInstance().getExternalContext().redirect();
方法


这是JSF2.0的错误吗???

我从未尝试过以这种方式发送重定向,因为这不是JSF2中导航的标准解决方案

以下是一些可以在JSF 2.0环境中正常工作的方法:

1。在导航链接中指定重定向命令

?faces redirect=true
附加到您的导航中,这应该可以完成任务

public String someAction(){
    // Logic here
    return "newPage" + "?faces-redirect=true"
}

<h:form id = "form">
    <h:inputText>...</h:inputText>
    <h:commandButton action = "#{controller.someAction}" />
</h:form>

首先,每当您需要在JSF管理的bean中使用
javax.servlet.
类时,就会发生很大的变化,导致您的操作方式错误或不必要的过度复杂。下次需要添加
importjavax.servlet…,请记住这一点

至于您的具体问题,在您的特定情况下,您应该返回视图ID以便执行转发

public String someAction() {
    // ...

    return "SomePage";
}

另一种选择是
ExternalContext#dispatch()
方法,但这也不必要地过于复杂。

好的,在执行前向操作之前,似乎需要调用一些JSF生命周期方法,因为我能够使用正常的JSF导航执行前向操作。知道哪种方法吗???@BalusC谢谢!我在那里看到了
.redirect()
,这不知怎么地误导了我
public String someAction() {
    // ...

    return "SomePage";
}