解决奇怪的java.util.List类型的属性被两次求值的问题

<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>

 

 

 

你可能感兴趣的:(java,bean,xml,MyEclipse,JSF)