перенаправление ajax не работает - PullRequest
0 голосов
/ 01 августа 2010

Это мой код jsf: -

  <h:commandButton id="cmdLogin" value="Login" actionListener="#{indexBean.login}">
                            <f:ajax execute="@form" render="@all" />
                        </h:commandButton>

Это мой метод входа в indexBean: -

 public void login(){

                HttpServletResponse objHttpServletResponse = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
                objHttpServletResponse.sendRedirect("Restricted/Home.jsf");

    }

Я получаю одно предупреждение в javascript emptyResponse: An empty response was received from the server. Check server error logs..Почему этот тип перенаправления не работает?

РЕДАКТИРОВАТЬ: - Интересно, когда я перенаправить из Face-config.xml, это работает!, я изменил actionListener кнопки команды на action и изменил тип возврата login на String и вернул home из метода входа в систему.Кто-нибудь может сказать сейчас, является ли это желаемым поведением в JSF?Почему перенаправление с faces-config.xml работает, а простое перенаправление в управляемых - нет?

1 Ответ

2 голосов
/ 01 августа 2010
HttpServletResponse objHttpServletResponse = (HttpServletResponse)
                              FacesContext.getCurrentInstance()
                                          .getExternalContext()
                                          .getResponse();
objHttpServletResponse.sendRedirect("Restricted/Home.jsf");

Здесь вы выходите из API JSF и переходите к API сервлета, где JSF не будет обрабатывать все, что вы делаете.Когда вы вызываете этот метод, сервер возвращает ответ 302 вместо ответа AJAX, которого ожидал JavaScript API.

Правильный механизм для выполнения программного перенаправления в JSF - использовать ExternalContext :

FacesContext.getCurrentInstance()
            .getExternalContext()
            .redirect("yourUrl");

Если вы используете этот механизм с вызовом AJAX в JSF 2.0, сервер отправит ответ, подобный следующему:

<?xml version="1.0" encoding="utf-8"?>
<partial-response><redirect url="yourUrl"></redirect></partial-response>

Вы можете использоватьтакие инструменты, как Firebug и Fiddler для проверки ответов вашего сервера.


Обратите внимание, что подпись этого метода неверна: public void login().В спецификации говорится, что методы действия должны объявлять тип возвращаемого объекта (тот факт, что ваша реализация не выдает ошибку, просто означает, что вам повезло).

...