Чтобы избежать всех отрицательных эффектов инициализации двойной комбинации, например:
делать следующие вещи:
Пример:
public class MyClass {
public static class Builder {
public int first = -1 ;
public double second = Double.NaN;
public String third = null ;
public MyClass create() {
return new MyClass(first, second, third);
}
}
protected final int first ;
protected final double second;
protected final String third ;
protected MyClass(
int first ,
double second,
String third
) {
this.first = first ;
this.second= second;
this.third = third ;
}
public int first () { return first ; }
public double second() { return second; }
public String third () { return third ; }
}
Использование :
MyClass my = new MyClass.Builder(){{ first = 1; third = "3"; }}.create();
Преимущества:
Недостатки:
И, как результат, у нас самый простой шаблон java-строителя.
См. все образцы в github: java-sf-builder-simple-example
Вы можете использовать <f:ajax>
для этого. При вложенности в входной компонент, такой как <h:selectOneMenu>
, он по умолчанию будет вызываться при изменении входного значения. Вы можете указать метод listener
, который может предварительно заполнить данные для следующего компонента на основе текущего входного значения, и вы можете указать идентификатор клиента этого следующего компонента в render
, чтобы показать предварительно заполненные данные.
<h:selectOneMenu value="#{bean.country}">
<f:selectItems value="#{bean.countries}" />
<f:ajax listener="#{bean.changeCountry}" render="cities" />
</h:selectOneMenu>
<h:panelGroup id="cities">
<h:selectOneMenu value="#{bean.city}" rendered="#{not empty bean.cities}">
<f:selectItems value="#{bean.cities}" />
</h:selectOneMenu>
</h:panelGroup>
Боб должен быть, по крайней мере, в области видимости (не запрос):
@ManagedBean
@ViewScoped
public class Bean implements Serializable {
private String country; // +getter+setter
private String city; // +getter+setter
private List<String> countries; // +getter
private List<String> cities; // +getter
@EJB
private LocationService locationService;
@PostConstruct
public void init() {
countries = locationService.getCountries();
}
public void changeCountry() {
cities = locationService.getCities(country);
}
// ...
}
Вы можете, конечно, также использовать Map<String, String>
вместо List<String>
. Ключ карты становится меткой опции, а значение карты становится значением параметра. Вам нужно только иметь в виду, что HashMap
по своей природе неупорядочен. Вы предпочитаете использовать LinkedHashMap
вместо этого, чтобы отображать элементы в порядке ввода Map
.
#{bean.countries}
, в компонентный компонент и используйте кеш-память второго уровня JPA для городов. – BalusC 20 April 2015 в 07:31private LocationService locationService;
? – Peter Penzov 11 March 2016 в 14:37Bean
– BalusC 11 March 2016 в 14:46