2014-10-16 4 views
0

У меня есть приложение maven/web с JSF Framework.CommandButton не работает в JSF?

Это код для кнопки:

<h:form> 
    <h:commandButton id="button1" value="Sign in" class="btn btn-info navbar-btn navbar-right"/> 
</h:form> 

и это из навигационного файла (faces-configx.xml):

<navigation-case> 
      <from-outcome>button1</from-outcome> 
      <to-view-id>/pages/signin.xhtml</to-view-id> 
</navigation-case> 

При нажатии на кнопку, он не работает, он не принимает меня на страницу signin.xhtml. Почему это? Что не так с моим кодом?

ответ

2

Вы используете Post-Redirect-Get шаблон. При этом, жизненный цикл JSF, в частности, на этапе 5 Invoke Application, он будет проверять, что возвращение действия пустая строка, так как вы не определили выход из атрибута action в вашем <h:commandButton>:

<h:commandButton id="button1" value="Sign in" action="" /> 
               ^-------^ 
               not written, JSF assumes this 

JSF будет искать этот результат в faces-config.xml и запускать правило навигации, если оно существует.

Имея это в виду, у вас есть 3 варианта:

  1. Установите исход действительного правила navitagion:

    <navigation-rule> 
        <from-view-id>*</from-view-id> 
        <navigation-case> 
         <from-outcome>signin</from-outcome> 
         <to-view-id>logout.xhtml</to-view-id> 
        </navigation-case> 
    </navigation-rule> 
    

    И в Facelets:

    <h:commandButton value="Sign in" action="signin" /> 
    
  2. Создать правильный управляемый компонент, который имеет метод, который возвращает строку, которая соответствует правильной навигации ca себе:

    @ManagedBean 
    @RequestScoped 
    public class FooBean { 
        public String signin() { 
         return "signin"; 
        } 
    } 
    

    И в Facelets:

    <h:commandButton value="Sign in" action="#{fooBean.signin}" /> 
    
  3. Более правильное решение для этого случая: не используйте Post-Redirect-Get шаблон, вместо того, чтобы использовать прямую навигацию (Перенаправление-Get) через <h:button> (форма не требуется).

    <h:button value="Sign in" outcome="signin" /> 
    

    Код выше предполагает signin.xhtml файл существует в том же путь к файлу, где находится этот код. Это:

    - webapp <-- root folder of the web pages of the app 
        - another_folder <-- some folder 
        + file.xhtml <-- file that contains <h:button> 
        + signin.xhtml <-- file to navigate 
    
+0

Спасибо так много! Предположим, что я хочу использовать альтернативу 1. Как использовать 'class =" btn btn-info navbar-btn navbar-right "' с помощью ''? – Carlton

+0

@Carlton Я пропустил добавление CSS, поскольку он не является частью основной проблемы. Просто добавьте необходимый CSS в свои компоненты HTML и JSF без проблем. –

+0

Я пробовал, как вы сказали мне, alternativ 1. Но кнопка все еще не работает? Почему это? Может ли быть что-то в другом месте, которое не позволяет кнопке перевести меня на другую страницу? – Carlton

Смежные вопросы