【发布时间】:2011-02-20 00:10:53
【问题描述】:
我再次看到@PostConstruct 每次都在触发,即使没有使用绑定属性。请参阅此代码:-
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:form>
<c:forEach var="item" items="#{TestBean.listItems}">
<h:outputText value="#{item}"/>
</c:forEach>
<h:commandButton value="Click" actionListener="#{TestBean.actionListener}"/>
</h:form>
</h:body>
</html>
这是 JSF 中最简单的 bean:-
package managedBeans;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean(name="TestBean")
@ViewScoped
public class TestBean implements Serializable {
private List<String> listItems;
public List<String> getListItems() {
return listItems;
}
public void setListItems(List<String> listItems) {
this.listItems = listItems;
}
public TestBean() {
}
@PostConstruct
public void init(){
System.out.println("Post Construct fired!");
listItems = new ArrayList<String>();
listItems.add("Mango");
listItems.add("Apple");
listItems.add("Banana");
}
public void actionListener(){
System.out.println("Action Listener fired!");
}
}
您是否发现任何会导致每次都触发 postconstruct 回调的行为?我认为 JSF 2.0 非常不稳定。如果每次都必须触发 PostConstruct,@ViewScoped 的作用是什么。为什么不只使用@RequestScoped?我以为我在申请中犯了一些错误。但是当我在 JSF 中创建这个最简单的可能时,我仍然得到这个错误。我不了解 JSF 的范围吗?还是他们没有正确测试?此外,如果您删除 c:forEach 并将其替换为 ui:repeat,则它可以正常工作。
等待回复确认是bug还是故意阻止程序员使用jstl?
【问题讨论】: