Как определить действие формы в JSF? - PullRequest
6 голосов
/ 19 апреля 2011

Чтобы заменить стандартную форму входа в систему безопасности Spring, я предложил следующее решение:

<form name="f" action="../j_spring_security_check" method="POST" >
    <h:panelGrid columns="2">
        <h:outputText value="Username" />
        <h:inputText id="j_username" />
        <h:outputText value="Password" />
        <h:inputText id="j_password" />
    </h:panelGrid>
    <h:commandButton value="Login" />
</form>

Но вместо простого тега <form> я бы хотел использовать <h:form>, поскольку компоненты Primefaces работают только в <h:form>. При использовании <h:form> действие формы будет автоматически установлено JSF для текущей страницы, а не для значения, установленного мной в примере выше. Где мне теперь кодировать действие "../j_spring_security_check"? Я попытался поместить его в <h:commandButton> следующим образом, но это не работает:

<h:form name="f">
    <h:panelGrid columns="2">
        <h:outputText value="Username" />
        <h:inputText id="j_username" />
        <h:outputText value="Password" />
        <h:inputText id="j_password" />
    </h:panelGrid>

    <h:commandButton value="Click here" action="../j_spring_security_check" />
</form>

Это приводит к сообщению об ошибке Unable to find matching navigation case with from-view-id '/login.xhtml' for action '../j_spring_security_check' with outcome '../j_spring_security_check'.

Это единственный способ определить регистр навигации в faces-config.xml? Я хочу избежать использования bean-компонента для этого простого варианта использования.

Ответы [ 4 ]

8 голосов
/ 22 мая 2011

Лучшее решение для меня - использовать вместо него тег <button> по умолчанию.Поскольку типичный стиль кнопок не применяется (в моем случае я использую Primefaces), я установил его вручную.Вот весь результат:

    <h:outputStylesheet library="primefaces" name="jquery/ui/jquery-ui.css" />
    <h:outputStylesheet library="css" name="login.css" />

    <div class="message">
        <c:if test="#{param.error == 1 and SPRING_SECURITY_LAST_EXCEPTION != null}">
            <span class="error">#{SPRING_SECURITY_LAST_EXCEPTION.message}</span>
        </c:if>
    </div>



    <div class="login">
        <form action="../j_spring_security_check" method="post">
            <h:panelGrid columns="2">
                <h:outputText value="Username" />
                <h:inputText id="j_username" />
                <h:outputText value="Password" />
                <h:inputSecret id="j_password" />
            </h:panelGrid>

            <div class="submit">
                <button type="submit" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only">
                    <span class="ui-button-text">Login</span>
                </button>
            </div>
        </form>
    </div>
7 голосов
/ 05 октября 2013
<h:form id="login" prependId="false"              onsubmit="document.getElementById('login').action='j_security_check';">
1 голос
/ 13 апреля 2014

Ваш лучший шанс - использовать свойство кнопки onclick . Это пример с простой командой commandButton, но она также будет работать для компонентов jsf, поскольку она использует (нативную) функцию javascript onclick.

<h:form>
<p:commandButton value="Submit" onclick="alert('JS!')" actionListener="#{tweetBean.addTweet()}" update=":tabView,:trends,:tweetsnr" /> 
</h:form>
1 голос
/ 19 апреля 2011

Ваш атрибут действия должен быть выражением EL следующим образом:

action="#{managedBean.method}"
...