我想创建一个JSF注册表单,其中包含所有国家的选择菜单列表。 我知道使用Java
祝一切顺利。
HashMap
实现这很容易,但我不知道如何实现用户从列表中选择自己的国家后,右侧就出现包含该国家城市的第二个选择菜单。 有没有什么有用的例子?祝一切顺利。
HashMap
实现这很容易,但我不知道如何实现用户从列表中选择自己的国家后,右侧就出现包含该国家城市的第二个选择菜单。 有没有什么有用的例子?<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>
。Map中的键变成选项标签,值则成为选项值。需要注意的是,一个HashMap
本质上是无序的。你可以使用LinkedHashMap
以Map
插入顺序展示项目。
#{bean.countries}
)放入应用程序范围的Bean中,并利用JPA第二级缓存来处理城市即可。 - BalusCprivate LocationService locationService;
吗? - Peter Penzov