powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите разобраться с рендерингом Ajax в JSF 1
1 сообщений из 1, страница 1 из 1
Помогите разобраться с рендерингом Ajax в JSF 1
    #39495678
drinkins_khv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Столкнулся с нежеланием Ajax перерисовывать HTML форму, при определённых условиях, помогите советом.
Суть задачи: На форме должен быть выпадающий список с кнопкой добавления, при её нажатии в форме должен появляться ещё один такой же выпадающий список.
Опыт разработки на Java EE да и вообще web у меня не богат (основная разработка на СУБД ORACLE), поэтому я пользовался материалами с этих источников:

http://qaru.site/questions/8103/how-to-dynamically-add-jsf-components
http://qaru.site/questions/5932/how-to-create-dynamic-jsf-form-fields
http://qaru.site/questions/8104/how-to-implement-a-dynamic-list-with-a-jsf-20-composite-component
https://www.ibm.com/developerworks/ru/library/wa-aj-jsfcss1/index.html
Был выбран вариант с h:dataTable, но кнопка в данном случае сабмитит форму, а этого мне не надо.

Дальше попытка подключить ajax и тут я немного продвинулся не без помощи этой инфы:
http://docs.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/f/ajax.html
http://www.sql.ru/forum/1145487/h-commandbutton-f-ajax-jsf
http://www.sql.ru/forum/899664/jsf-ajax-neprostoy-sluchay
https://stackoverflow.com/questions/7956117/how-to-pass-an-iterated-parameter-via-ajax-to-a-backing-bean-method


В общем что я наваял.
Сначала класс, содержащий значения для выпадающего списка в котором есть ИД, имя и код DictGenerationAttr

public class DictGenerationAttr extends AbstractDictionary {
private String showValue;
public DictGenerationAttr(Long id, String code, String name) {
super(id, code, name);
showValue = id + " - " + name;
}
public String getShowValue() {
return showValue;
}
public void setShowValue(String showValue) {
this.showValue = showValue;
}
}

Заполняется он из БД в классе DictionaryDao , не буду приводит этот код. Там всё работает, значения заносятся в List.

Затем создаётся класс GenAttrList, одной из переменной которого является List из DictGenerationAttr

package model;
import java.io.Serializable;

import DictionaryDao;

public class GenAttrList implements Serializable {
private Long id;
private DictGenerationAttr[] genAttrValues;
private Long genAttrValue;

public GenAttrList(Long id, Long genAttrValue){
final DictionaryDao dictionaryDao = DictionaryDao.getInstance();
genAttrValues = dictionaryDao.getDictTaskGenAttr().toArray(new DictGenerationAttr[dictionaryDao.getDictTaskGenAttr().size()]);
this.id = id;
this.genAttrValue = genAttrValue;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}


public DictGenerationAttr[] getGenAttrValues() {
return genAttrValues;
}

public void setGenAttrValues(DictGenerationAttr[] genAttrValues) {
this.genAttrValues = genAttrValues;
}

public Long getGenAttrValue() {
return genAttrValue;
}

public void setGenAttrValue(Long genAttrValue) {
this.genAttrValue = genAttrValue;
}
}

Здесь id - для хранения индекса массива, genAttrValue задумывалось для хранения выбранного значения из выпадающего списка.


Затем создаётся List из объектов GenAttrList в большом классе:

public class Task extends Utils implements Serializable {
.......

private ArrayList<GenAttrList> genAttrList;

public List<GenAttrList> getGenAttrList () {
genAttrList = new ArrayList<GenAttrList>();
genAttrList.add(new GenAttrList((long) (genAttrList.size()), null));
return genAttrList;
}
.......
и добавление в массив нового элемента
public void addGenAttr(){
genAttrList.add(new GenAttrList((long) (genAttrList.size()), null));
}
Всё коряво, так как делается, что называется, по методу проб и ошибок.

Класс Task в итоге импортируется в ManagedBean taskDetails.

И в конце концов форма:

<ui:composition>
<h:form id="form" role="form" styleClass="form-horizontal" method="post" enctype="multipart/form-data">
.....

<div class="form-group">
<h:outputLabel value="#{msg['task.genAttr']}" for="genAttr"
class="col-sm-3 control-label"/>
<div class="col-sm-6">
<h:dataTable id="genAttrBlock" value="#{taskDetails.task.genAttrList}" var="attribute">
<h:column>
<h:selectOneListbox id="taskGenAttr" value="#{attribute.genAttrValue}" size="1" styleClass="form-control">
<f:selectItem itemLabel="---" itemValue="#{null}" noSelectionOption="true" />
<f:selectItems value="#{attribute.genAttrValues}" var="taskGenAttr" itemValue="#{taskGenAttr.id}" itemLabel="#{taskGenAttr.showValue}"/>
<f:ajax execute="@this"/>
</h:selectOneListbox>
</h:column>
<h:column>
<h:inputText for="genattrnum" value="#{taskDetails.task.genAttrList.size()}" class="col-md-3 control-label"/>
</h:column>
</h:dataTable>
<h:commandButton value="add">
<f:ajax event="click" render=" genAttrBlock " listener=" #{taskDetails.task.addGenAttr()} " execute="@this"/>
</h:commandButton>
</div>
</div>

В итоге на форме создаётся таблица с заполненным выпадающим списком в одной ячейке, часть целей задачи достигнуто, при нажатии на кнопку добавляется элемент в getGenAttrList, это дебаг показал, но на форме новый выпадающий список не появляется.
Подскажите, как заставить ajax зарендерить всю таблицу с новыми выпадающими списками.

В качестве эксперимента вешал на ajax на h:inputText genattrnum, который находится внутри таблицы, изменения его значения проходили без проблем, но он то уже отображался в отличии от нового выпадающего списка.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите разобраться с рендерингом Ajax в JSF 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]