我想创建一个JSF注册表单,其中包含所有国家/地区列表的选择菜单。我知道这对于使用Java HashMap
来说很容易实现,但是我不知道如何实现的棘手部分是用户从列表中选择他的国家之后的权利,第二个选择菜单与城市一起显示他的国家?有什么有用的例子吗?
祝福。
答案 0 :(得分:14)
您可以使用<f:ajax>
。当嵌套在诸如<h:selectOneMenu>
的输入组件中时,默认情况下将在输入值更改时调用它。您可以指定listener
方法,该方法可以根据当前输入值预填充下一个组件的数据,并且可以在render
中指定该下一个组件的客户端ID,以显示预填充数据
<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>
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);
}
// ...
}
您当然也可以使用Map<String, String>
代替List<String>
。映射键成为选项标签,映射值成为选项值。您只需要记住,HashMap
本质上是无序的。您更愿意使用LinkedHashMap
来显示Map
广告订单中的项目。