getRequestDispatcher ("") .forward не работает в JSF 2.0 - PullRequest
0 голосов
/ 19 марта 2012

У меня есть следующие коды в моем приложении, которое использует JSF 2.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();

способ ..

Это ошибка JSF 2.0 ??

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Я никогда не пытался отправить перенаправление таким способом, потому что это не стандартное решение для навигации в 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>

После обработки логина в someAction навигационный поток будет перенаправлен на newPage.xhtml. Все, что вам нужно сделать, это правильно вызвать действие из формы пользовательского интерфейса.

2. Укажите перенаправление через внешний контекст

Этот метод ближе к тому, что вы ищете:

public void someAction(){
    // Logic here
    try{
        FacesContext.getCurrentInstance().getExternalContext().redirect("newPage");
    } catch (Exception e){
        e.getMessage();
    }
}
0 голосов
/ 19 марта 2012

Прежде всего, когда вам нужно использовать javax.servlet.* классы внутри управляемого JSF-компонента, тогда происходят большие изменения, которые вы делаете неправильно или излишне усложняете. Помните об этом в следующий раз, когда вам понадобится добавить строку import javax.servlet...;.

Что касается вашей конкретной проблемы, то в вашем конкретном случае вы просто должны вернуть идентификатор представления, чтобы выполнить пересылку.

public String someAction() {
    // ...

    return "SomePage";
}

Альтернативой является ExternalContext#dispatch() метод, но он также чрезмерно усложняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...