Как перенаправить из JSF Facelet, если выражение EL верно?

У меня есть JSF Facelet, который отображает резюме процесса поиска. Теперь я хочу перенаправить на страницу сведений, если поисковая система нашла только один элемент. Я не хочу реализовывать это перенаправление в моих bean-компонентах, потому что я хочу получить "знания" об этом перенаправлении из моего Java-кода.

Поэтому я хочу написать что-то вроде этого:

<ui:redirect if="#{searchResult.count eq 1}" target="details.jsf">
   <f:param name="id" value="#{searchResult.firstResult.technicalId}" />
</ui:redirect>

Какие-нибудь решения или идеи для этого?

Я знаю, что в JSF 2.2 есть действия над страницами, но я использую JEE6 и есть JSF 2.0. Btw. В настоящее время я использую MyFaces, Primefaces и Richfaces.

Привет.

2 ответа

Решение

Вы должны сделать эту работу в контроллере, а не в представлении.

Чтобы получить результаты поиска, сначала нужно вызвать метод действия в форме поиска, верно? Просто сделайте работу по перенаправлению прямо там. Вы можете указать JSF отправить перенаправление, указав faces-redirect=true в строке запроса результата действия.

public String search() {
    results = service.find(query);

    if (results.size() == 1) {
        return "details?faces-redirect=true&id=" + results.get(0).getTechnicalId();
    }
    else {
        return "results";
    }
}

Или, если это запрос GET, который обрабатывается <f:event type="preRenderView">затем сделайте так:

public void onPreRenderViewListener() {
    results = service.find(query);

    if (results.size() == 1) {
        FacesContext.getCurrentInstance().getExternalContext().redirect("details.jsf?id=" + results.get(0).getTechnicalId());
    }
}

Я бы сказал, что самый чистый способ - создать действие в бобе. В любом случае, я бы предложил вам смоделировать щелчок в случае, если ваш счетчик поисков равен 1 с помощью javascript.

вам нужен скрытый вход, содержащий количество:

<h:inputHidden id="count" value="#{searchResult.count}" />

и скрытая кнопка для запуска перенаправления:

<h:commandButton id="redirectButton" action="details.jsf" style="display: none;" />

затем, когда вы запускаете поиск, вы обновляете счетчик входных данных и по завершению можете проверить, равно ли значение счетчика 1, тогда вы можете нажать на кнопку commandButton.

Если вы используете Jquery, это будет что-то вроде

    if($("#count").val()==1){
        $("#redirectButton").click();
    }
Другие вопросы по тегам