解决奇怪的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>

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值