`
jamjar
  • 浏览: 14290 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

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

 

 

 

分享到:
评论
2 楼 hintcnuie 2008-03-30  
good!
1 楼 lianyeyu 2008-03-29  
不错

相关推荐

    java.util包总结

    类集框架是Java 2的一大亮点,它标准化了处理对象集合的方式,解决了早期Java中如Dictionary、Vector、Stack和Properties等类各自为政的问题。Collection接口作为框架的基础,定义了通用的集合操作,如添加元素、...

    java util工具类1

    Java的`util`工具类是Java标准库中的核心部分,为开发者提供了丰富的功能,极大地简化了编程工作。这个包包含了各种集合框架、日期时间处理、随机数生成、字符串操作、IO流处理等实用工具类。在Java编程中,熟练掌握...

    Java API (分两次传,第一部分)

    这里提到的"Java API(分两次传,第一部分)"可能是指Java 1.6版本的API文档或库,这是一个重要的里程碑,因为它在Java的发展历程中占有显著位置。 Java API 主要分为几个部分: 1. **核心类库**:这是Java API的...

    java常用工具类

    Java语言在设计时就考虑到了代码的复用性和可维护性,因此提供了许多内置的工具类,这些工具类分布在不同的包下,极大地丰富了Java的功能并简化了开发工作。本篇将详细介绍一些Java中常用的工具类及其应用。 一、`...

    java.tar.gz

    - 数据类型:Java有两大类数据类型,基本类型和引用类型。基本类型包括整型、浮点型、字符型和布尔型;引用类型则包括类、接口和数组。 - 内存管理:Java使用垃圾回收机制自动管理内存,程序员无需手动释放内存。 ...

    java生成十个不重复的随机数

    这个过程可能会有一些效率问题,因为我们可能需要多次尝试才能找到一个未出现过的随机数。如果需要生成的随机数范围很大,这种策略可能会变得低效。这时,可以考虑使用`TreeSet`,它允许我们指定一个比较器来控制...

    java程序设计 UTIL包.docx

    Java程序设计中的UTIL包是Java开发中非常关键的一部分,它包含了一系列通用的工具类和接口,为开发者提供了方便的功能,简化了代码编写。在本文档中,我们将深入探讨UTIL包的相关知识点,包括其设计背景、需求分析、...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    java performance12

    对于对象类型的数组,可以使用 `java.util.Collections.copy()` 方法。但需要注意的是,此方法只适用于列表(List),因此我们需要将数组转换为列表形式。 ```java List&lt;Character&gt; sourceList = Arrays.asList...

    java常用工具类的使用

    对于数组和列表的排序、搜索等功能,Java标准库提供了`java.util.Arrays`和`java.util.Collections`两个工具类。 ##### `Arrays`中的方法 - `void sort(T[])`: 对数组中的元素按照升序进行排序。 - `List asList...

    IBM-ETP-java培训11.Java 常用类讲解2.ppt

    9. **枚举**:Java 5引入的枚举类型是一种安全的常量集合,可以防止未定义的枚举值。 10. **集合转换**:Java 8引入的Stream API使得集合的转换和操作更为简洁,例如过滤、映射和归约操作。 这些Java常用类和概念...

    java模拟大乐透开奖学习案例test.txt

    - `import java.util.List;` - 这些导入语句是为了使用Java标准库中的`ArrayList`、`Collections`以及`List`接口。其中`ArrayList`用于存储开奖数字,`Collections`提供了一些静态方法对集合进行操作,如排序等。 ...

    java基础.zip

    2. **数据类型**:Java分为两大类数据类型:基本数据类型(如int、char、float、double等)和引用数据类型(如类、接口、数组)。基本数据类型占据固定大小的内存,而引用数据类型则指向对象在内存中的位置。 3. **...

    JAVA经典题目.pdf

    Java 中的数据类型分为简单数据类型和引用数据类型两大类: - **简单数据类型**:包括数值型 (`byte`, `short`, `int`, `long`, `float`, `double`)、字符型 (`char`) 和布尔型 (`boolean`)。 - **引用数据类型**:...

    JAVA内存溢出问题总结

    内存溢出问题可以从容器和程序类两个方面进行排查,容器问题可以调整容器参数来解决。 从程序类方面来说,内存溢出的原因有很多,以下是常见的几种: 1、查询数据库的时候递归循环了,应尽量使用精简的关联 SQL ...

    Java代码 可以压缩文件夹到指定目录和指定名称,将文件或者文件夹中的文件转成base64格式

    Java提供了多种方法来实现这一功能,比如使用内置的`java.util.zip`包或者第三方库如Apache Commons Compress。同时,将文件或文件夹中的文件转换为Base64编码是一种在内存中传输和存储二进制数据的有效方式,特别是...

Global site tag (gtag.js) - Google Analytics