2012-12-24 3 views
0

. Это простой пример, демонстрирующий случай.JSF2 commandButton; AJAX или не AJAX, он обновил всю страницу

У вас есть форма с панелью и двумя командами, одна из которых - AJAX, а другая нет. нажав на любой из них, в бэкэнд будет создан InputText и добавлен в Panel.

Мой управляемый компонент:

@ManagedBean 

public class DynamicPanel { 

private Panel dynmaic; 



public Panel getDynmaic() { 
    return dynmaic; 
} 

public void setDynmaic(Panel dynmaic) { 
    this.dynmaic = dynmaic; 
} 

public String adddynamic(){ 

    InputText text = new InputText();   
    dynmaic.getChildren().add(text); 
    text.setValue(text.getId()+" Size= "+ dynmaic.getChildren().size()); 
    return null; 
} 

public String removeall(){ 
    this.dynmaic.getChildren().clear(); 
    return null; 
} 
} 

Моя страница XHTML

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui" xmlns:f="http://java.sun.com/jsf/core"> 
<h:head> 
    <title>Facelet Title</title> 
</h:head> 
<h:body> 
    <h:form> 
     <p:panel id="dynamic" binding="#{dynamicPanel.dynmaic}"> 

     </p:panel> 

     <h:commandButton value="Add with AJAX" id="ajaxBtn" > 
     <f:ajax onevent="onClick" execute="#{dynamicPanel.adddynamic()}" render="dynamic" /> 
     </h:commandButton> 

     <h:commandButton value="Add" action="#{dynamicPanel.adddynamic}" /> 
     <h:commandButton value="remove all" action="#{dynamicPanel.removeall}" /> 
    </h:form> 


</h:body> 
</html> 

мой лица-config.xml пуст.

У меня есть три проблемы с кодом выше. Может кто-то прояснит это мне, я новичок в JSF2.

первое, почему обе командные кнопки ведут себя одинаково? нажав на эфир, вы обновите всю страницу.

Вторая проблема заключается в том, почему при нажатии на команду не AJAX командаButton добавляет два входа одновременно?

В-третьих, почему изменение объема управляемого компонента на @SessionScoped приведет к ошибке после загрузки страницы? (Как-то просто загрузить страницу, форма выдает запрос Ajax без меня нажав на CommandButton. Почему?

+0

См. ниже ссылку. Я не понимаю, почему нужно указать execute = "# {dynamicPanel.adddynamic()}" почему бы не "динамический" как значение. http://mkblog.exadel.com/2010/04/learning-jsf-2-ajax-in-jsf-using-fajax-tag/ – Chetan

+0

не могу открыть ссылку – xedus

+0

dont copy paste url .. нажмите на it .. – Chetan

ответ

0

Попробуйте следующее, что должно работать лучше.

<h:commandButton value="Add with AJAX" id="ajaxBtn" > 
    <f:ajax onevent="click" execute="ajaxBtn" 
          render="dynamic" 
          listener="#{dynamicPanel.adddynamic()}" 
    </h:commandButton> 

Насколько я знаю, для f:ajax выполнения атрибута идентификатор компонентов следует, и вы должны вызывать такие методы, как addDynamic() в атрибуте слушателя.

при нажатии на кнопку, не АЯКС, он выполняет всю форму, которая также включает в свой АЯКС команду поэтому так вызывается функция addDynamic() дважды, один через команду ajax, а второй - с помощью команды, отличной от ajax.

+0

Для областей сеанса или областей области разговора ваш бэк-компонент должен реализовывать интерфейс Serializable. Пожалуйста, взгляните на следующую публикацию: http://stackoverflow.com/questions/3372687/jsf-backing-bean-should-be-serializable – cubbuk

+0

Я попробую и отправлю отчет – xedus

+0

@ Pr0gr4mm3r не работает – xedus

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