我是JSF的新手,我读过JSF生命周期但是无法理解如何实现这个目标?
我有一个控制器说“城市”和其他控制器“国家”。现在我要创建一个新页面,我将在其中提供搜索功能。我在该页面上显示了两个下拉列表(一个用于国家,另一个用于城市),我希望第一个下拉列表在页面加载时填充。请告诉我使用哪个控制器?城市/国家?还是创建一个新的?以及如何在页面加载时加载数据?
谢谢!
答案 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