すべての国のリストを含む選択メニューを持つ JSF 登録フォームを作成したいと考えています。これはJavaで簡単に実装できることは知っていますHashMap
が、実装方法がわからない難しい部分は、ユーザーがリストから自分の国を選択した直後に、2番目の選択メニューが自分の国の都市とともに表示されることです? 役に立つ例はありますか?
幸運をお祈りしています。
すべての国のリストを含む選択メニューを持つ JSF 登録フォームを作成したいと考えています。これはJavaで簡単に実装できることは知っていますHashMap
が、実装方法がわからない難しい部分は、ユーザーがリストから自分の国を選択した直後に、2番目の選択メニューが自分の国の都市とともに表示されることです? 役に立つ例はありますか?
幸運をお祈りしています。
これに使用できます<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
aは本質的に順序付けられていないことを覚えておく必要があります。LinkedHashMap
代わりに、アイテムをMap
挿入順に表示するために使用することをお勧めします。