3

すべての国のリストを含む選択メニューを持つ JSF 登録フォームを作成したいと考えています。これはJavaで簡単に実装できることは知っていますHashMapが、実装方法がわからない難しい部分は、ユーザーがリストから自分の国を選択した直後に、2番目の選択メニューが自分の国の都市とともに表示されることです? 役に立つ例はありますか?

幸運をお祈りしています。

4

1 に答える 1

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>。マップキーがオプションラベルになり、マップ値がオプション値になります。HashMapaは本質的に順序付けられていないことを覚えておく必要があります。LinkedHashMap代わりに、アイテムをMap挿入順に表示するために使用することをお勧めします。

参照:

于 2012-07-16T13:55:38.497 に答える