Я получил элемент управления SelectOneMenu, добавленный в форму с помощью тега include, который обновляет свойство bean-компонента через ajax, проблема в том, что когда страница обновляется, свойство по какой-то причине имеет значение null, я подозреваю, что нужно что-то делать с жизненным циклом, но я не уверен, как подойти к этой проблеме.
это репо имеет упрощенную версию, которая повторяет поведение
главная страница
<html xmlns...>
<h:body>
<h1>Select one</h1>
<h:form>
<ui:include src="#{country.page}" />
</h:form>
</h:body>
</html>
первая страница: просто ссылка, которая ведет на страницу, которая добавляет элемент управления и устанавливает значение по умолчанию
<div xmlns=...>
<h:commandLink action="#{country.goTo2}">go to 2</h:commandLink>
</div>
вторая страница: когда страница обновляется, находясь здесь, свойство имеет значение null
<div xmlns= ...>
<h:panelGrid columns="2">
Select a country:
<h:selectOneMenu value="#{country.localeCode}" valueChangeListener="#{country.countryLocaleCodeChanged}">
<f:selectItem itemLabel="it is null" itemValue="#{null}" />
<f:selectItems value="#{country.countryInMap}" />
<f:ajax execute="@form"/>
</h:selectOneMenu>
<h:commandLink action="#{country.goTo1}">go back to 1</h:commandLink>
</h:panelGrid>
</div>
Это боб
@ManagedBean(name="country")
@SessionScoped
public class CountryBean implements Serializable{
private static Map<String,String> countries;
private String localeCode = "en"; //default value
private String page = "page1.xhtml";
static{
countries = new LinkedHashMap<String,String>();
countries.put("United Kingdom", "en"); //label, value
countries.put("French", "fr");
countries.put("German", "de");
countries.put("China", "zh_CN");
}
public void countryLocaleCodeChanged(ValueChangeEvent e){
System.out.println("value changed :" + e.getNewValue());
}
public Map<String,String> getCountryInMap() {
return CountryBean.countries;
}
//setters and getters here
public void goTo2() {
this.localeCode = "de";
this.page = "page2.xhtml";
}
public void goTo1() {
this.page = "page1.xhtml";
}
}