当前位置: 首页 > 知识库问答 >
问题:

根据另一个h:SelectOne菜单值加载h:SelectOne菜单

柴高岑
2023-03-14

我有两个h:SelectOne菜单(1:国家,2:城市)。我需要使用ajax在cities SelectOne菜单中加载一个选定国家的所有城市。当我更改countries selectOneMenu的值时,我的cities selectOneMenu从countryBean中获取空值。选择国家。

<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>

这是找到城市的方法:

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;

    }

因为countryBean,我得到了一个NullPointerException。selectedCountry始终为空。正确的方法是什么?

共有1个答案

欧阳狐若
2023-03-14

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

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

一旦您尝试通过保持getter方法为真正的getter方法来解决这个问题(即除了返回属性之外不要做任何其他事情;)并在(post)构造函数和/或action(listener)方法中执行业务逻辑,那么这个特定的问题将消失。

以下是一个启动示例:

<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>

@ViewScopedbean中使用类似的内容:

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);
}
 类似资料:
  • 我使用的是一个带有两列的datatable,其中有一个标签和一个selectOneMenu。 我需要动态显示selectOneMenu列表,我需要在bean中为其设置级别id。在commandbutton/commandLink中,我们可以在f:setPropertyActionListener的帮助下设置值。我只是想知道在使用selectonemenu时如何设置该值。任何帮助都将不胜感激。

  • 就像窗口模板,在一个ui file 中我们指定了我们的应用程序菜单,然后作为资源向二进制文件中添加。 <?xml version="1.0"?> <interface> <!-- interface-requires gtk+ 3.0 --> <menu id="appmenu"> <section> <item> <attribute name="la

  • 问题内容: 首先,我讨厌提出一个已经解决的问题,但是您应该知道我在此站点上找到的其他选项对我不起作用。 基本上,我想构造一个简短的表格,其中有两个下拉框。始终显示第一个,默认情况下隐藏第二个。在第一个下拉框中选择某个选项后,我希望第二个下拉框显示。这是我的意思的完美示例: 但是,与上面的示例不同,我有单独的一组选项要显示在下拉框中,以显示在第一个下拉框中选择的每个选项,而不仅是其中一个选项。换句话

  • 问题内容: 我正在建立一个网站来学习编码,并且正在尝试建立一个工具,用户单击一个选择/下拉列表,其中包含从数据库 cat 提取的某些类别名称,然后另一个选择与从数据库 subcat 提取的子类别名称一起出现。这几乎与Yelp的(向下分类)完全一样,就像Yelp的(向下分类)一样。 我还做了一个图: 我已经有一个从 cat 数据库中提取的类别下拉列表: 我有一个从subcat数据库中提取的subca

  • 我正在尝试制作一个下拉菜单,其中。单击时会显示下拉内容,如果用户单击栏中的任何其他下拉列表,下拉内容将消失。问题是我有多个下拉列表,我想我只是需要帮助修改我现有的javascript。我希望侧边栏(nav)只显示当前活动的下拉菜单。在“我的代码”上,当您打开下拉列表时,它仍然会打开,直到用户再次单击下拉箭头以关闭该特定下拉列表。

  • pre { white-space: pre-wrap; } 通常表示一个树节点的方式就是在每一个节点存储一个 parentid。 这个也被称为邻接列表模型。 直接加载这些数据到树形菜单(Tree)是不允许的。 但是我们可以在加载树形菜单之前,把它转换为标准标准的树形菜单(Tree)数据格式。 树(Tree)插件提供一个 'loadFilter' 选项函数,它可以实现这个功能。 它提供一个机会来改