将Java对象数组返回给Coldfusion组件

时间:2011-05-19 19:36:02

标签: java coldfusion

在Coldfusion中创建Java对象非常简单:

variable = CreateObject("JAVA", "java.object").init(JavaCast("primitiveType", cfVar));

但是,如果Java方法返回Java对象列表,那么使用Java返回类型并不是那么简单:

newVariable = variable.returnJavaObjectCollection();

是否有最佳实践用于处理在数组或ArrayCollection中返回的Java对象?

2 个答案:

答案 0 :(得分:2)

如果我认为我理解你的问题(对不起,你不是100%清楚) - 你应该能够在ColdFusion中调用Java对象的方法,就像在Java中一样。

例如,在ColdFusion中处理String时,可以在java.lang.String对象上调用方法。

所以没有错:

<cfscript>
myString = JavaCast("string", "FooBar"); //definitely a String object.
</cfscript>

<cfoutput>    
String length: #myString.length()#
Starts with 'Foo': #myString.startsWith("Foo")#
Upper case string: myString.toUpperCase()#
</cfoutput>

如果您正在处理java.util.List的实例,您会发现9/10次,ColdFusion的本机数组函数可以正常工作 - 因为ColdFusion Arrays实际上也是java.util.List的实现

所以&lt; cfloop array =“#foo#”...&gt;应该仍然可以工作,ArrayAppend(),ArrayContains()等都应该按预期工作。

如果失败,您仍然可以访问List的基础API: http://download.oracle.com/javase/6/docs/api/java/util/List.html

但要记住的是,一切都是0,而不是1的索引。

所以要获得Java List中的第一个值是:

myItem = myList.get(0);

而不是CF的方式:

myItem = myList[1];

否则,这真的是关于它的。

你应该注意到直接调用Java方法有一点点开销,因为它是使用Reflection动态完成的,所以如果你可以使用本机CF函数,那通常会更好,但是你没有其他办法,只能本地互动。

有关详细信息,您可以尝试ColdFusion Java Documentation

答案 1 :(得分:1)

如果您返回Vector<Object>它将与ColdFusion的数组实用程序一起使用,HashMap<String,Object>将与ColdFusion的Struct实用程序一起使用。但是有一些注意事项:

在ColdFusion中未定义null对象,因此如果数组中的元素为null,或者map中的值为null,或者您只返回null,则它们各自的变量将是未定义的。

请记住,您仍然可以在ColdFusion中的复杂Java对象上调用java方法 - 包括除Vector和Maps之外的复杂集合上的方法。例如:

<cfset iterator = myJavaObj.myJavaFuncReturnsCollection().iterator() />
<cfloop condition="iterator.hasNext()">
    <cfset currObj = iterator.next() />
    <cfset currObj.myFunction() />
</cfloop>