Установите много флажков, выбранные элементы возвращают ноль, когда есть вложенный пользовательский интерфейс: повтор
У меня есть список проблем. Каждая проблема имеет подкатегорию и основную категорию, а также каждая подкатегория имеет основную категорию. Я хочу перечислить проблемы, как указано выше.
- Основная категория 1 (1 - это идентификатор)
---- subcat1
------ задачи1
------ задачи2
---- subcat2
------ проблем3
--основная категория2
---- subcat3
------ problem4
------ problem5
---- subcat4
------ problem6
и так далее.
Часть HTML здесь;
<ui:repeat var="mainCatvar" value="#{dprEdit.mainCategories}">
<h:outputText value="#{mainCatvar.mainCatName}" styleClass="mainTitle" /><br></br>
<ui:repeat var="subCategory" value="#{mainCatvar.subCategories}">
<h:outputText value="#{subCategory.subCatName}" styleClass="title" />
<h:selectManyCheckbox value="#{dprEdit.selectedProblems}" >
<f:selectItems value="#{subCategory.problems}" var="problem"
itemValue="#{problem.problemName}" itemLabel="#{problem.problemName}" />
</h:selectManyCheckbox>
</ui:repeat>
</ui:repeat>
<p:commandButton action="#{dprCreate.save}" value="Save" update="form1" ajax="false" style="width:150px" />
Вот мой бэкэнд-код;
public class MainCatDAO extends BaseDAO {
private final static String SELECT_ALL_MAIN_CATEGORIES ="SELECT * FROM TESTAE.MAINCATPF";
public MainCatDAO(Connection connection) {
super(connection);
}
private List<MainCat> getTable(String query, Object... values) throws ClassNotFoundException, SQLException {
List<MainCat> table = new ArrayList<MainCat>();
List<Map<String, Object>> data = this.getData(query, values);
for (int i = 0; i < data.size(); i++) {
ArrayList<SubCat> subList = new ArrayList<SubCat>();
// subList'i tekrardan tanımlama yani clear etmeme sebebim; maincat'a subList'i set etmeme rağmen,
//sonrasında subList'i clear edince maincat'ın subList'i de sıfırlanıyor.
//Bu yüzden subList'i her seferinde tekrar tanımlıyorum.
Map<String, Object> row = new HashMap<String, Object>();
MainCat maincat = new MainCat();
row = data.get(i);
maincat.setMainCatId(((BigDecimal) row.get("MAINCATID")).intValue());
maincat.setMainCatName(((String) row.get("MAINCATNAM")).trim());
String sorgu = "SELECT * FROM TESTAE.SUBCATPF WHERE MAINCATID='"+((BigDecimal) row.get("MAINCATID")).intValue()+"'";
List<Map<String, Object>> dataSub = this.getData(sorgu);
for (int a = 0; a < dataSub.size(); a++) {
ArrayList<Problem> problemList = new ArrayList<Problem>();
SubCat subcat = new SubCat();
row = dataSub.get(a);
if (row.get("SUBCATNAME") == null)
subcat.setSubCatName("");
else
subcat.setSubCatName((((String) row.get("SUBCATNAME")).trim()));
subList.add(subcat);
String sorgu2 = "SELECT * FROM TESTAE.PROBLEMPF WHERE SUBCATID='"+((BigDecimal) row.get("SUBCATID")).intValue()+"'";
List<Map<String, Object>> dataProb = this.getData(sorgu2);
for (int p = 0; p < dataProb.size(); p++) {
Problem problem = new Problem();
row = dataProb.get(p);
Integer problemId = ((BigDecimal) row.get("PROBLEMID")).intValue();
if (row.get("PRBLMNAME") == null)
problem.setProblemName("");
else
problem.setProblemName((((String) row.get("PRBLMNAME")).trim()));
problemList.add(problem);
}
subcat.setProblems(problemList);
}
maincat.setSubCategories(subList);
table.add(maincat);
}
return table;
}
public List<MainCat> getmainCategories () throws ClassNotFoundException, SQLException {
return getTable(SELECT_ALL_MAIN_CATEGORIES);
}}
Here is my save function;
@ManagedBean(name = "dprEdit")
@ViewScoped
public class DprEdit implements Serializable {
private List<String> selectedProblems = new ArrayList<String>();
private List<MainCat> mainCategories;
public DprEdit() throws ClassNotFoundException, SQLException {
mainCategories = new MainCatDAO(ConnectionManager.getConnection()).getmainCategories();}
public String save() throws ClassNotFoundException, SQLException, ParseException {
DprDAO dprDAO = new DprDAO(ConnectionManager.getConnection());
for (int i = 0; i < selectedProblems.size(); i++) {
dpr.setFormId(dpr.getFormId());
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date today = new Date();
formDate = formatter.parse(formatter.format(today));
dpr.setFormDate(formDate);
dpr.setFilledBy(username);
dpr.setProblemName(selectedProblems.get(i));
String problemName = selectedProblems.get(i);
ProblemDAO problemDAO = new ProblemDAO(ConnectionManager.getConnection());
Problem prob = problemDAO.getProblemId(problemName);
dpr.setProblemId(prob.getProblemId());
dprDAO.insertDetail(dpr);
}
public List<String> getSelectedProblems() {
return selectedProblems;
}
public void setSelectedProblems(List<String> selectedProblems) {
this.selectedProblems = selectedProblems;
}
public Integer getMaincatid() {
return maincatid;
}
public void setMaincatid(Integer maincatid) {
this.maincatid = maincatid;
}}
Мои атрибуты модели проблемы;
private Integer problemId;
private String problemName;
private String subCategory;
private String mainCategory;
атрибуты модели моей подкатегории;
private Integer subCatId;
private String subCatName;
private List<Problem> problems;
мои основные атрибуты модели категории;
private Integer mainCatId;
private String mainCatName;
private List<SubCat> subCategories;
Итак, проблема в том, что я нажимаю на некоторые проблемы в списке, затем нажимаю кнопку "Сохранить", и я ожидаю, что в списке выбранных проблем полно моих проблем, на которые нажали. Однако выбранный список проблем пуст!
Есть ли у вас какие-либо рекомендации?
Спасибо вам всем.
1 ответ
Посмотри ближе на <h:selectManyCheckbox value>
особенно в связанном бобе.
<ui:repeat value="#{dprEdit.mainCategories}" var="mainCatvar">
<ui:repeat value="#{mainCatvar.subCategories}" var="subCategory">
<h:selectManyCheckbox value="#{dprEdit.selectedProblems}">
<f:selectItems value="#{subCategory.problems}" />
По сути, вы привязываете выбранные значения всех групп флажков к одному и тому же свойству компонента. Во время обработки отправки формы каждая итерация переопределяет отправленные значения группы флажков предыдущей итерации. Если вы установили точку останова отладки на setSelectedProblems()
сеттер, вы бы это заметили. Таким образом, вы в конечном итоге получите отправленные значения последней группы флажков. Учитывая жалобу "вернуть ноль", очевидно, вы ничего не выбрали там.
Это определенно неправильно. <h:selectManyCheckbox value>
должен каким-то образом быть связан с в настоящее время повторяется #{subCategory}
не напрямую с #{dprEdit}
управляемый боб. Один из способов это сопоставить #{subCategory}
в качестве ключа:
<h:selectManyCheckbox value="#{dprEdit.selectedProblems[subCategory]}">
С:
private Map<SubCat, String[]> selectedProblems = new HashMap<>();
Обратите внимание, что вы не можете использовать List<String>
здесь, поскольку информация общего типа стирается во время выполнения, а значение модели по умолчанию String[]
и нет никакого способа проинструктировать JSF/EL иначе. Если вы хотите использовать фиксированный тип, вы можете рассмотреть возможность перемещения selectedProblems
в SubCat
так что вы можете продолжать использовать List<String>
:
<h:selectManyCheckbox value="#{subCategory.selectedProblems}">