<context-param> <param-name>javax.faces.CONFIG_FILES</param-name> <param-value>/WEB-INF/faces-config.xml</param-value> </context-param>先看一下test.jsf页面
<h:datatable value="#{TestAction.arr}" var="test">
<h:column>
<h:outputText value="#{test}"/>
</h:column>
</h:datatable>
实习一个简单的功能,把TestAction的arr属性(java.util.List类型)的值打印成表格。
再来看看TestAction.java
public class TestAction {
private static Logger log = Logger.getLogger(TestAction.class);
private List<String> arr;
public List<String> getArr() {
log.info("[Method]getArr()...");
if (arr==null){
arr=new ArrayList<String>();
}
arr.add("Hello");
arr.add("World");
return arr;
}
public void setArr(List<String> arr) {
this.arr = arr;
}
}
getArr()方法返回一个元素是字符串的List;
在用MyEclipse在faces-config.xml配置这个Action
<managed-bean>
<managed-bean-name>TestAction</managed-bean-name>
<managed-bean-class>
com.bookstore.admin.actions.TestAction
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>arr</property-name>
<property-class>java.util.List</property-class>
<list-entries/>
</managed-property>
</managed-bean>
访问test.jsf,后台输出了
[Method]getArr()...
[Method]getArr()...
getArr()方法执行了两次!上Google寻找答案,有的说是web.xml里不能写
<context-param> <param-name>javax.faces.CONFIG_FILES</param-name> <param-value>/WEB-INF/faces-config.xml</param-value> </context-param>
因为默认情况下,JSF会从/WEB-INF/faces-config.xml里加载jsf的配置文件,如果在web.xml里面写,还会再次加载。这个配置也是MyEclipse自动写进去的。俺就满怀希望的把这个配置项删掉。但是结果问题还是没有解决。getArr()方法还是被调用两次。
最后,通过比较faces-config.xml里不同的bean之间配置,总算找到了原因。
问题就出在属性arr的值被设置成了<list-entries/>
<property-name>arr</property-name>
<property-class>java.util.List</property-class>
<list-entries/>
当初始化TestAction时,就调用了一次getArr();在解析jsf页面上的#{TestAction.arr}时,又调用了一次getArr()。因此造成了调用两次。
找到了原因,解决起来就简单了。把arr的值设置成null就行了。
<managed-property> <property-name>arr</property-name> <property-class>java.util.List</property-class> <null-value></null-value> </managed-property>