如何在jsf中填充页面加载的下拉列表?

时间:2011-01-25 08:22:44

标签: java jsf

我是JSF的新手,我读过JSF生命周期但是无法理解如何实现这个目标?

我有一个控制器说“城市”和其他控制器“国家”。现在我要创建一个新页面,我将在其中提供搜索功能。我在该页面上显示了两个下拉列表(一个用于国家,另一个用于城市),我希望第一个下拉列表在页面加载时填充。请告诉我使用哪个控制器?城市/国家?还是创建一个新的?以及如何在页面加载时加载数据?

谢谢!

4 个答案:

答案 0 :(得分:4)

每个人都是正确的,您需要使用<f:selectItems/>

示例:

.Xhtml

<h:selectOneMenu>
    <f:selectItems value="#{myController.listItems}"/>
</h:selectOneMenu>

public class MyController{
    //The list with the items
    private List<SelectItem> listItems = null;

    public MyController {
        loadCombo();
    }

    (...)

    //Loading the items
    private void loadCombo() {
        listItems = new ArrayList<SelectItem>();

        //You can do with BD data using a for. How to add a new item:
        //listItems.add(new SelectItem("itemValue", "itemLabel"));

        listItems.add(new SelectItem("1", "Item 1"));
        listItems.add(new SelectItem("2", "Item 2"));
        listItems.add(new SelectItem("3", "Item 3"));
        listItems.add(new SelectItem("4", "Item 4"));
    }

    (...)

    //Getters and setters
}

不要在“get”方法中填充列表,因为JSF会多次调用它,这会使你的性能下降。

答案 1 :(得分:2)

最好为该页面使用一个控制器来保存国家和城市的集合。 要在页面加载时加载国家/地区,您应该创建一个使用@Postconstruct注释的方法。 在此方法中,您可以进行初始化。即。

@PostConstruct
public void init(){
     //do your initialization
}

答案 2 :(得分:1)

国家/地区很可能是静态集合,因此您只需创建一个应用程序范围的bean,其中包含一个包含国家/地区的静态地图(关键国家/地区名称,值国家/地区代码)。

然后只需将<f:selectItems>绑定在需要国家/地区下拉列表的每个视图中。

(这个解决方案归功于BalusC btw;))

答案 3 :(得分:0)

在你的控制器中你需要getter public List<SelectItem> getFirmaTyp()然后在你的视图中你应该有下一个。

<h:selectOneMenu value="#{yourController.firma.typ.id}">
   <f:selectItems value="#{yourController.firmaTyp}" />
</h:selectOneMenu>

每次显示页面时都会调用Getter。在我的示例中,在回发时,dropDown的id设置为实体公司类型,id类似于yourController.firma.typ.id