使用velocity split()将字符串分割成数组似乎不起作用

24

我讨厌速度(velocity)并很少使用它,但有时在工作中需要使用。我从来无法弄清楚如何使用它。

我有这个

#foreach( $product in $browseSiteProducts )
    alert("$product.productId");
    #foreach( $stringList in $product.productId.split("|") )
        alert("inner loop");
    #end
#end
$browseSiteProducts是一个数组。或列表。或者其他什么我也不知道。productId的第一个警报正常工作。当被打印出来时,我得到了“<stuff>|<morestuff>”,这就是我预期的。然后内部循环应该在“|”上将其拆分为两部分,并且应该给我两个“内部循环”的警报。但是我总是得到24个警报,因为productId中有24个字符。所以对我来说,split()没有正确地进行分隔。我做错了什么?

谢谢 Kyle

5个回答

26

Velocity几乎没有自己的对象和方法。相反,它允许您使用真实的Java对象并在这些对象上调用真实的Java方法。哪个Velocity文档说分隔符是字符串?

此外,由于Velocity是基于Java的,因此字符串只是一种可以容纳许多类型信息的数据类型:电话号码、名称、标识符、正则表达式等。在Java中,许多处理正则表达式的方法将这些RE作为String对象传递。

您可以通过打印其类名来检查变量后面的值实际上具有哪种类型:

Product class is $product.class
Product ID class is $product.productId.class

如果产品ID确实是一个java.lang.String,那么您可以检查split方法需要一个String参数,但是该字符串应该是一个有效的正则表达式。
由于|是正则表达式中的特殊字符,所以您需要以某种方式对其进行转义。以下方法有效:
#foreach( $stringList in $product.productId.split("[|]") )

14

不使用 StringUtils,可以使用 String 的 split() 方法来完成此操作。

与其 Java 相对应的是,对于特殊字符,无需转义正斜杠(例如 "\\|"),就像 @kamcknig 正确说明的那样:

#set ($myString = “This|is|my|dummy|text”) 

#set ($myArray = $myString.split("\|")) or
#set ($myArray = $myString.split('\|')) or
#set ($myArray = $myString.split("[|]"))

注意1:要获取数组的大小,请使用:$myArray.size()

注意2:要获取实际值,请使用$myArray.get(0)$myArray[0]

建议:可以事先使用#if ($myString.indexOf('|')) ... #end


4
## Splitting by Pipes
#set($prodId = $product.productId)
#foreach($id in $prodId.split("[|]"))
$id
#end

2
在vtl脚本中分割字符串:
#foreach($subString in $yourString.split(','))
 {
       "$subString "
 }
 #if($foreach.hasNext),#end
#end

enter image description here


请求处理失败;嵌套异常为org.apache.velocity.exception.ParseErrorException:词法错误,在第95行遇到“s”(115),之后是“.”。这个解决方案不起作用。 - Common Man

-1

显然,尽管Velocity文档中说分隔符是字符串,但实际上它是一个正则表达式。感谢Apache。

正确的方式是

$product.product.split("\|");

但是您没有使用StringUtils类。为什么要抱怨您未使用的类的Apache文档?您的示例仅使用了java.util.String split方法。 - Nathan Bubna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接