JSF2.0, как commandButton знает, какой бин отправить - PullRequest
1 голос
/ 29 сентября 2011

Я начинаю с JSF2, пришедшего с весны mvc, поэтому у меня есть некоторые сомнения, что я не могу найти ответы на Core JavaServer Faces v3

Как этот ...

Как тег h:commandButton может узнать, о каком бине я говорю? У меня может быть только один Бин на страницу JSF, не так ли? Я только даю ему msg.next, который является текстом из файла i18n. (Quizbean - мой бин)

<h:body>
<h:form>
    <h3>#{msgs.heading}</h3>
        <p>
            <h:outputFormat value="#{msgs.currentScore}">
                <f:param value="#{quizBean.score}"/>
            </h:outputFormat>
        </p>
        <p>#{msgs.guessNext}</p>
        <p>#{quizBean.current.sequence}</p>
        <p>
            #{msgs.answer}
            <h:inputText value="#{quizBean.answer}"/>
        </p>
        <p><h:commandButton value="#{msgs.next}"/></p>
</h:form>

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Командная кнопка не должна знать это. Все, что он генерирует, это элемент HTML <input type="submit">. Это встроено в HTML <form> с URL-адресом действия, указывающим на тот же URL-адрес, что и страница. Есть еще и <input type="hidden" name="javax.faces.ViewState">. Благодаря этому полю JSF точно знает, в какое представление вы отправляете. Это представление содержит информацию обо всех входах. Это представление знает, что есть <h:inputText value="#{quizBean.answer}" />. Представлению известно поле name сгенерированного элемента HTML <input type="text">. JSF получит значение параметра отправленного запроса на request.getParameter(), используя это имя, а затем обновит свойство answer текущего экземпляра quizBean этим значением.

Щелкните правой кнопкой мыши страницу в браузере и выберите Просмотреть исходный код , чтобы увидеть сгенерированный JSF-вывод HTML. Установите точку останова для методов ApplyRequestValuesPhase#execute() и HtmlBasicRenderer#decode() (при условии, что вы используете Mojarra, а не MyFaces) для отслеживания сбора представленных значений для каждого UIComponent в представлении.

2 голосов
/ 29 сентября 2011

Компонентом должен управлять JSF, тогда он будет знать, о каком бине вы говорите.

Например,

<f:param value="#{quizBean.score}"/>

Здесь бин quizBean является Managed-Bean под управлением JSF.

И чтобы сделать его управляемым компонентом, вы должны сообщить об этом JSF, используя следующие аннотации -

@ManagedBean(name="quizBean") //name is optional or you give your own name to the bean
@SessionScoped //tell JSF in which scope you want to keep your managedbean
public class QuizBean {
    //....

или упомянув это следующим образом в файле конфигурации JSF (faces-config.xml) -

<managed-bean>
    <managed-bean-name>quizBean</managed-bean-name>
    <managed-bean-class>com.pkg.QuizBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>
//Older versions of JSF requires this where annotations do not work
//But if you are using JSF 2.0 then it's a lot better to use annotations

Вы можете использовать более одного компонента в представлении (страница).

1 голос
/ 29 сентября 2011

Если это пример из Core Java Server Faces, то читайте внимательнее, он все объясняет.

msgs, насколько я помню, относится к пакету сообщений , объявленному в face-config.xml .

Что касается вашего вопроса how commandButton knows which bean to call. В вашем примере имя класса QuizBean , скорее всего, соответствует бобу с тем же именем. Этого достаточно для JSF 2.0 . Однако вы можете изменить это имя двумя способами:

1) Если вы используете управляемые bean-компоненты JSF, вы должны сделать так:

@ManagedBean(name="quiz")
@ViewScoped
public class QuizBean { }

2) Если вы используете CDI - beans, вы сделаете это:

@Named("quiz")
@RequestScoped
public class QuizBean {}

Помните , что аннотации области действия CDI-бобов приходят из пакета javax.enterprise.context . А области JSF находятся в пакете javax.faces.bean . Не смешивайте их!

Обновление: Пожалуйста, обратитесь к странице 35 книги Core Java Server Faces, 3-е издание для получения более подробной информации о вашем вопросе и не спешите задавать вопросы, если вы что-то не поняли сразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...