Вы ожидаете, что xp:checkBoxGroup
вернет значение true
или false
(возможно, даже логическое: D), но это не то, что он делает.Можно поставить несколько флажков - следовательно, потенциально несколько значений - так как вы ожидаете, что они будут представлены?В данном случае в виде списка строк (хотя они могут быть списком любого типа при использовании правильных преобразователей).
Опора на (request|view|session|application)Scope
не такая уж хорошая практика, на самом деле это довольно плохокостыль (давайте еще раз поблагодарим IBM, чтобы показать нам неправильный путь).Это заставляет вас быть осторожным с кодом, который вы пишете, и в конечном итоге может вас укусить, как в этом случае.Я имею в виду, что, особенно со списками или картами, то, что вы хотите вернуть, является непротиворечивым значением без дополнительного кода для пустой проверки (лучшие практики говорят, что вы должны использовать Collections.emptyList()
или Collections.emptyMap()
, если список нене инициализирован или вам не нужно лениво загружать его), но, как мы уже говорили, это своего рода вынужденная ошибка, потому что вы можете просто выбросить случайную ссылку viewScope.
и думать, что все всегда будет хорошо.
Поскольку вы знаете, что используете viewScope
- или любую другую область в этом отношении - почему бы не использовать то, что фреймворк знает, как сделать лучше всего?Управление бобами!
В этот момент вы можете написать звуковой защитный код, который всегда поможет вам:
Боб
public class MyViewScopedBean implements Serializable {
private static final long serialVersionUID = 1L;
private List<String> sweets;
public List<String> getSweets() {
if (sweets == null) {
sweets = new ArrayList<String>();
}
return sweets;
}
public void setSweets(List<String> sweets) {
this.sweets = sweets;
}
}
XSP
С указанным выше bean-компонентом, обозначенным bean
:
<h3>Select the sweets</h3>
<xp:div id="containerSweetForm">
<xp:checkBoxGroup id="checkBoxGroup1" value="#{bean.sweets}">
<xp:selectItem itemLabel="Biscuit" itemValue="biscuit" />
<xp:selectItem itemLabel="Ice cream" itemValue="icecream" />
<xp:selectItem itemLabel="Pie" itemValue="pie" />
</xp:checkBoxGroup>
<xp:button value="Tell me the sweets" id="button1">
<xp:eventHandler event="onclick" submit="true"
execMode="partial" execId="containerSweetForm" refreshMode="partial"
refreshId="containerSweets" />
</xp:button>
</xp:div>
<h3>Selected sweets</h3>
<xp:div id="containerSweets">
<xp:text value="#{bean.sweets}" />
</xp:div>
В списке есть все отмеченные флажки, представленные с их атрибутом itemValue
.