JSF中<f:selectItems>无法从Bean获取值的技术求助
解决JSF <p:selectItems>使用Bean中List的问题
你现在用Maven构建带REST API和JSF的简易Web应用,在ExchangeRates这个托管Bean里写了一个获取List的方法,想把它绑定到PrimeFaces的<p:selectItems>上对吧?先看看你贴的Bean代码:
@ManagedBean(name="er", eager=true) public class ExchangeRates { private List<String> frase = new ArrayList<>(); public List<String> getFrase() { frase.add("opcao1"); frase.add("opcao2"); return frase; } // 其他方法和变量... }
这里有个很容易踩的坑——每次调用getFrase()都会往List里添加新元素!JSF的生命周期里,getter方法可能会被多次调用(比如渲染视图阶段、验证阶段等),这样你的List会越来越长,页面上的选项会重复出现,甚至导致奇怪的渲染问题。
给你几个调整建议,帮你顺利实现需求:
第一步:把List初始化放到正确的位置
别在getter方法里加元素,应该把初始化逻辑放到@PostConstruct注解的方法里,或者Bean的构造方法中。用@PostConstruct是最佳实践,因为它会在Bean实例化完成、所有依赖注入都搞定后执行:@ManagedBean(name="er", eager=true) public class ExchangeRates { private List<String> frase; @PostConstruct public void init() { frase = new ArrayList<>(); frase.add("opcao1"); frase.add("opcao2"); } public List<String> getFrase() { return frase; } // 记得添加selectedOption的变量和getter/setter,用来接收用户选择 private String selectedOption; public String getSelectedOption() { return selectedOption; } public void setSelectedOption(String selectedOption) { this.selectedOption = selectedOption; } // 其他方法和变量... }第二步:正确在页面中绑定<p:selectItems>
在JSF页面里,这样配置就能正常显示选项了:<p:selectOneMenu value="#{er.selectedOption}"> <p:selectItems value="#{er.frase}" var="opt" itemLabel="#{opt}" itemValue="#{opt}" /> </p:selectOneMenu>额外小提醒:关于
eager=true
你给Bean加了eager=true,这个属性会让Bean在应用启动时就实例化,而不是第一次被引用的时候。如果这个Bean不是全局必须提前初始化的,建议去掉这个属性,避免不必要的资源浪费哦。
内容的提问来源于stack exchange,提问作者Reactor
相关产品推荐
相关产品推荐

