我想创建 JSF 注册表单,其中包含包含所有国家/地区列表的选择菜单。我知道这很容易用 Java 实现 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 必须至少在 View 范围内(不是请求):@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
中的项目插入顺序。也可以看看:
selectOneMenu
wiki page 关于jsf - 如何加载和显示依赖 h :selectOneMenu on change of a h:selectOneMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11505248/