首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载h:selectOneMenu取决于另一个h:selectOneMenu值

加载h:selectOneMenu取决于另一个h:selectOneMenu值
EN

Stack Overflow用户
提问于 2013-08-28 21:06:43
回答 1查看 1.4K关注 0票数 1

我有两个h:selectOneMenu (1:国家,2:城市)。我需要使用ajax从城市中的一个国家加载所有城市的selectOneMenu。当我更改国家selectOneMenu的值时,我的城市selectOneMenu从countryBean.selectedCountry获得一个空值。

代码语言:javascript
复制
<h:panelGrid columns="2">
    <h:outputLabel for="countries" value="Countries: " />
    <h:selectOneMenu converter="omnifaces.SelectItemsConverter"
        id="countries" required="true" value="#{countryBean.selectedCountry}">
        <f:selectItem itemLabel="Choose country" />
        <f:selectItems value="#{countriesBB.findAllCountries()}"
            var="country" itemLabel="#{country.name}" />
        <f:ajax event="change" render="cities" />
    </h:selectOneMenu>

    <h:outputLabel for="cities"
        value="Cities: " />
    <h:selectOneMenu converter="omnifaces.SelectItemsConverter"
        id="cities" required="true"
        value="#{cityBean.selectedCity}">
        <f:selectItem itemLabel="Choose city" />
        <f:selectItems value="#{cityBean.findAllCitiesByCountry(countryBean.selectedCountry)}"
            var="city" itemLabel="#{city.name}" />
    </h:selectOneMenu>
</h:panelGrid>

这是寻找城市的方法:

代码语言:javascript
复制
public List<city> findAllCitiesByCountry(Country country) {

        List<City> cities = null;
        try {

            cities = citiesService.findAllCitiesByCountry(country);

        } catch (Exception exception) {
            logger.debug("Error finding cities.", exception);
        }

        return cities;

    }

我得到一个NullPointerException,因为countryBean.selectedCountry总是空的。怎样才是正确的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-28 22:54:14

JSF初学者需要知道的许多规则之一是:

  • 不要在getter方法中执行业务逻辑。

一旦您试图通过保持getter方法真正的getter方法(即只做return property;以外的任何事情)并在(Post)构造函数和/或操作(侦听器)方法中执行业务逻辑来修复这个问题,那么这个特定的问题就会消失。

下面是一个开球的例子:

代码语言:javascript
复制
<h:selectOneMenu value="#{bean.country}">
    <f:selectItems value="#{bean.countries}" ... />
    <f:ajax listener="#{bean.changeCountry}" render="cities" />
</h:selectOneMenu>
<h:selectOneMenu id="cities" value="#{bean.city}">
    <f:selectItems value="#{bean.cities}" ... />
</h:selectOneMenu>

@ViewScoped bean中使用这样的内容:

代码语言:javascript
复制
private Country country; // +getter+setter
private City city; // +getter+setter
private List<Countries> countries; // +getter
private List<Cities> cities; // +getter

@EJB
private SomeService service;

@PostConstruct
public void init() {
    countries = service.getCountries();
}

public void changeCountry() {
    cities = service.getCities(country);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18498194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档