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

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

相关推荐

    set.list.map接口

    import java.util.List; public class Map { public static void main(String[] args) { List list=new ArrayList(); list.add(10); list.add(2); list.add(34); //对list数组进行自然排序 Collections....

    Java 面试宝典

    Java 基础部分..................................................................................................................... 7 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么...

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

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

    java常用工具类的使用

    A java.util.Date类型表示的是GMT时间,本身输出是国际化输出,由于中国处于东八区时间,因此输出结果是早上8点。而Date的其他构造方法和普通方法的API都不容易实现国际化,因此目前Date类的大多数方法都被标识为...

    DWR.xml配置文件说明书(含源码)

    Array的配置项目没有上面介绍的那么直观,默认情况下DWR装载所有的基本类型和可装载的对象,这些包括String,Date等先前介绍的类型.java高级程序员可能会理解为什么match的这行有点奇怪. [Z"/&gt; [B"/&gt; [S"/&gt; [I"/&gt; [J"/&gt;...

    java面试题

    35. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 18 36. swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?...

    java jdk实列宝典 光盘源代码

    java为数据结构中的列表定义了一个接口类java.util.list同时提供了3个实现类,分别是ArrayList、Vector、LinkedList使用; 生成不重复的随机数序列;列表、集合与数组的互相转换;java为数据结构中的映射定义一个接口...

    JAVA面试题最全集

    1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出...

    最新JAVA编程题全集_50题及答案

    写一个单例模式(遇到两次) public class Test { private Test(){} private static Test test; public static Test getInstance() { if(test==null) { test = new Test(); } return test; }} 5. //统计...

    数据库测试test.sql

    import java.util.List; public class UserServlet extends BaseServlet { // @Override // protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, ...

    达内 coreJava 习题答案

    import java.util.Scanner; class Bissextile{ public static void main(String[] arge){ System.out.print("请输入年份"); int year; //定义输入的年份名字为“year” Scanner scanner = new Scanner(System.in...

    java 面试题 总结

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    大话数据结构用Java实现3-01

    线性表的抽象数据类型 博主是第一次在CSDN上发动态的小白,由于大话数据结构这本书是用C实现的,对于Java才学到初级的我决定在后面学习的时候尽量用Java实现书中的例子,希望对这个事情感兴趣...import java.util.List;

    JAVA上百实例源码以及开源项目源代码

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java源码包---java 源码 大量 实例

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    JAVA上百实例源码以及开源项目

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    java源码包2

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    以前写了一个java的正规表达式的java工具类,分享一下,有用到的欢迎下载使用。 如果你有常用的定义好的,且测试通过的正规表达式,欢迎跟贴,也让我享用一下 . 类中用到了 jakarta-oro-2.0.jar 包,请大家自己在 ...

Global site tag (gtag.js) - Google Analytics