JSF 2: перенаправление страницы после вызова ajax - PullRequest
1 голос
/ 28 октября 2011

Я застрял в проблеме навигации, аналогичной этой .В нескольких словах, я пытаюсь перенаправить навигацию с одной страницы на другую, используя ajax с h:commandLink.Вот базовый компонент

@ManagedBean
public class StartBean {

    public void search(){
        FacesContext
            .getCurrentInstance()
            .getExternalContext()
            .getFlash()
            .put("result", "hooray!")
        ;
    }

    public String showResult(){
        return "result?faces-redirect=true";
    }
}

и начальная страница

<h:body>
    <h:form prependId="false">
        <h:commandButton value="Click" action="#{startBean.search}">
            <f:ajax execute="@this" render="@form"/>
        </h:commandButton>

        <br/>

        <h:commandLink 
            action="#{startBean.showResult()}" 
            rendered="#{flash.result != null}" 
            value="#{flash.result}"
        />

    </h:form>
</h:body>

, тогда как страница result просто показывает сообщение.Обе страницы находятся в корне контекста веб-модуля.Бывает, что h:commandLink правильно отображается после отправки ajax, но нажатие на него вызывает обновление страницы.Он не перенаправляет на страницу result, как ожидалось.После этого, если страница перезагружается (F5), отображается страница result.Кажется, это вопрос цикла рендеринга.

Есть предложения?

Заранее спасибо.

1 Ответ

4 голосов
/ 28 октября 2011

Атрибут rendered всех компонентов ввода и команд равен , повторно оценен при отправке формы. Так что если он оценивает false, то JSF просто не будет вызывать действие. Область действия Flash прекращается, когда завершается запрос / ответ метода search(). Когда вы отправляете запрос showResult(), его больше нет в области видимости Flash. Я предлагаю поместить компонент в область видимости и вместо этого связать атрибут rendered с его свойством.

@ManagedBean
@ViewScoped
public class StartBean {

    private String result;

    public void search(){
        result = "hooray";
    }

    public String showResult(){
        return "result?faces-redirect=true";
    }

    public String getResult() {
        return result;
    }

}

с

<h:commandLink 
    action="#{startBean.showResult}" 
    rendered="#{startBean.result != null}" 
    value="#{startBean.result}"
/>

Смотри также:

...