Переадресация JSF через commandButton

Я не могу перенаправить на другую страницу, если код выглядит следующим образом:

<h:commandButton type="button" value="Enter" action="index?faces-redirect=true" >

Но перенаправление работает, если код:

<h:commandButton type="button" value="Enter" action="index?faces-redirect=true" >
    <f:ajax />
</h:commandButton>

Может ли кто-нибудь объяснить это? Спасибо!

----------------------- ----------------------- EDIT -

Весь код xhtml для вашей справки:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<h:head>

</h:head>

<h:body>
<h:form id="form">
    <h:commandButton id="enterModelButton" type="button" value="Enter" action="index?faces-redirect=true" >
        <f:ajax />
    </h:commandButton>
</h:form>
</h:body>
</html>

Ответ 1

<h:commandButton type="button"> не создает кнопку отправки. Он просто генерирует "мертвую" кнопку без каких-либо эффектов, просто предназначенную для использования в пользовательских сценариях onclick="..." и т.д. Это немного осталось от темной эпохи JSF 1.0/1.1, когда было не так просто использовать простой ванильный HTML в JSF для такого рода вещей.

<f:ajax> выполняет подачу с помощью полномочий ajax через генерируемый JSF onclick. Он не заботится о кнопке type.

По сути, удаление type="button" и использование его по умолчанию type="submit" должно устранить вашу проблему.

<h:commandButton value="Enter" action="index?faces-redirect=true" />

Тем не менее, все со всеми, если это реальный код, и вы на самом деле не собираетесь вызывать действие bean, то вы идете совершенно в неправильном направлении в отношении реализации функционального требования перехода к другая страница с помощью кнопки. Вместо этого вы должны использовать <h:button>.

<h:button value="Enter" outcome="index" />

См. также: