如何加载和显示依赖h:selectOneMenu更改啊:selectOneMenu

use*_*928 3 jsf selectonemenu jsf-2

我想创建一个JSF注册表单,其中包含所有国家/地区列表的选择菜单.我知道这很容易用Java实现,HashMap但是我不知道如何实现的棘手部分是用户从列表中选择他的国家后,第二个选择菜单与他所在国家/地区的城市一起出现?有什么有用的例子吗?

最好的祝愿.

Bal*_*usC 14

你可以用<f:ajax>它.当嵌套在诸如的输入组件中时<h:selectOneMenu>,默认情况下将在输入值更改时调用它.您可以指定一种listener方法,该方法可以根据当前输入值预填充下一个组件的数据,并且可以指定该下一个组件的客户端ID 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>
Run Code Online (Sandbox Code Playgroud)

bean必须至少在视图范围内(而不是请求):

@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);
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

你当然也可以使用a Map<String, String>而不是a List<String>.映射键成为选项标签,映射值成为选项值.你只需要记住,a HashMap本质上是无序的.您更愿意使用它LinkedHashMap来按Map插入顺序显示项目.

也可以看看: