【问题标题】:How to load and display dependent h:selectOneMenu on change of a h:selectOneMenu如何在更改 h:selectOneMenu 时加载和显示依赖的 h:selectOneMenu
【发布时间】:2012-07-15 08:32:53
【问题描述】:

我想创建 JSF 注册表单,其中包含所有国家/地区列表的选择菜单。我知道这很容易用 Java HashMap 实现,但我不知道如何实现的棘手部分是用户从列表中选择他的国家后,第二个选择菜单与他的国家的城市一起出现?有什么有用的例子吗?

最好的祝愿。

【问题讨论】:

    标签: jsf jsf-2 selectonemenu


    【解决方案1】:

    您可以为此使用<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&lt;String, String&gt; 代替List&lt;String&gt;。映射键成为选项标签,映射值成为选项值。您只需要记住 HashMap 本质上是无序的。您更喜欢使用 LinkedHashMap 而不是以 Map 插入顺序显示项目。

    另见:

    【讨论】:

    • +1 for @BalusC,答案非常清楚,your blog 解释得更深入。 :) 如果我有 100 个用户访问同一个页面,我会创建 100 个不同的对象来浪费内存!有没有办法优化,以便我们可以在应用程序级别使用对象。
    • @09Q71AO534:只需将#{bean.countries} 之类的应用程序范围数据放入应用程序范围的bean 中,并为城市使用JPA 二级缓存。
    • @BalusC 你知道我需要为private LocationService locationService;插入哪个Java包吗?
    • @Peter:这只是你自己的服务类。名字就像Bean
    • @BalusC 是否可以在不实际提交(和设置)第一个下拉列表的情况下更改第二个下拉列表? (通过使用 execute="@none")。如果我的表单位于可以关闭/取消的弹出窗口内,我不希望在使用“保存”提交按钮之前对第一个(ajax)下拉列表进行任何更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    相关资源
    最近更新 更多