Метод поддержки PrimeFaces oncomplete вызывается при загрузке страницы

PrimeFaces 5.0, JSF 2.2, Glassfish 4.1.1,

Я предполагаю, что что-то в моей настройке настроено неправильно, но я не уверен, на что смотреть...

Поэтому я использую управляемые компоненты для поддержки страниц JSF. В элементах PrimeFace на странице, если я использую свойство oncomplete, метод, на который оно ссылается, вызывается при загрузке страницы. Я не хочу, чтобы он вызывал метод при каждой загрузке страницы, и я не думаю, что это должно быть!

Я проверил это на нескольких страницах и в разных элементах. Впервые я заметил эту проблему с элементом <p:fileupload>, где я пытался вызвать метод, используя oncomplete, как только все файлы были загружены. Впоследствии я попробовал это на <p:commandbuttons>, и oncomplete вызывается при загрузке страницы.

Я проверил полученный HTML и обнаружил правильно отформатированную пару тегов <head>.

Я также выполнил сравнение сгенерированного HTML с наличием свойства oncomplete и без него.

С участием:

<button id="j_idt21:j_idt26" 
    name="j_idt21:j_idt26" 
    class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
    onclick="PrimeFaces.ab({s:'j_idt21:j_idt26',onco:function(xhr,status,args){;}});
    return false;" 
    type="submit">`

Без:

<button id="j_idt21:j_idt26" 
    name="j_idt21:j_idt26" 
    class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" 
    onclick="PrimeFaces.ab({s:'j_idt21:j_idt26'});
    return false;" 
    type="submit">

Вот код приведенного выше HTML, показывающий, что oncomplete вызывает метод на любой странице при ее загрузке. Это моя страница входа.

<p:commandButton validateClient="true" value="Login" 
    action="#{loginJSFManagedBean.validateCredentials}" 
    type="submit" 
    ajax="true" 
    oncomplete="#{loginJSFManagedBean.validateCredentials}">
</p:commandButton>

Каждый раз, когда загружается страница входа, вызывается метод validateCredentials, даже до того, как страница завершит рендеринг...

вот фрагмент моего JSF для загрузки моего файла:

<h:form enctype="multipart/form-data">
<p:fileUpload oncomplete="#{JSFManagedBean.extract()}" 
fileUploadListener="#{JSFManagedBean.handleTarFileUpload}" 
mode="advanced"  ></p:fileUpload>
</h:form>

Каждый раз, когда страница загружается, вызывается метод extract()...


person Trig    schedule 05.05.2017    source источник
comment
Где в документации указано, что «oncomplete» может вызывать метод на стороне сервера Java при «выполнении»?   -  person Kukeltje    schedule 05.05.2017
comment
Возможный дубликат Как вызвать поддержку JSF метод bean только при возникновении события onclick   -  person Kukeltje    schedule 05.05.2017
comment
То, что вы пытаетесь сделать с кнопкой, может быть работой сначала для actionListener, а затем для действия. Для загрузки файла вы можете выполнить stackoverflow.com/questions/26696922/ или stackoverflow.com/questions/20747201/   -  person Jaqen H'ghar    schedule 06.05.2017


Ответы (1)


oncomplete — это обратный вызов javascript на стороне клиента. Ваши методы вызываются при отображении страницы, потому что сервер оценивает эти выражения EL, ожидая, что они приведут к отправке строк с кодом javascript.

Вероятно, вам вообще не нужны эти обработчики oncomplete. Для кнопки входа достаточно обработчика действий. Для fileUpload может быть достаточно fileUploadListener, если ваша цель состоит в том, чтобы просто «извлечь» загруженный файл, как следует из названия метода.

person Vsevolod Golovanov    schedule 07.05.2017
comment
Об этом много «дубликатов», на которые я даже ссылался. Gopd практикует помечать этот вопрос как дубликат, чтобы StackOverflow не был завален почти идентичными ответами. - person Kukeltje; 07.05.2017