我讨厌速度并且很少使用它,但有时我会在工作中被要求这样做。我永远无法弄清楚如何使用它。
我有这个
#foreach( $product in $browseSiteProducts )
alert("$product.productId");
#foreach( $stringList in $product.productId.split("|") )
alert("inner loop");
#end
#end
$ browseSiteProducts是一个数组。或列表。管他呢。我甚至不知道。 productId的第一个警报工作正常。我得到“|”这是打印出来时的预期。然后内循环应该拆分为“|”作为分隔符,并给我“内循环”的警报。但我总是得到24个警报,因为productId中有24个字符。所以split()没有正确地为我划界。我到底做错了什么?
由于 凯尔
答案 0 :(得分:14)
Velocity拥有极少的对象和方法。相反,它允许您使用真正的Java对象并在这些对象上调用真正的Java方法。哪个Velocity文档说分隔符是一个字符串?
此外,由于Velocity是基于Java的,string
只是一种可以容纳多种类型信息的数据类型:电话号码,名称,标识符,正则表达式......在Java中,有很多方法可以处理正则表达式将这些RE作为String
个对象传递。
您可以通过打印其类名来检查变量后面的值的实际类型:
Product class is $product.class
Product ID class is $product.productId.class
如果产品ID确实是java.lang.String
,那么您可以检查the split
method是否采用String
参数,但该字符串应该是有效的正则表达式。
从|
is a special character in regular expressions开始,你需要以某种方式逃避它。这有效:
#foreach( $stringList in $product.productId.split("[|]") )
答案 1 :(得分:4)
不使用StringUtils,可以使用String split()
方法完成此操作。
与特殊字符的Java对应物不同,不需要像@kamcknig正确声明的那样转义正斜杠(.e.g "\\|"
):
#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
答案 2 :(得分:1)
## Splitting by Pipes
#set($prodId = $product.productId)
#foreach($id in $prodId.split("[|]"))
$id
#end
答案 3 :(得分:0)
在vtl脚本中溢出字符串::
{ “ $ subString” } #if($ foreach.hasNext),#end
enter code here
答案 4 :(得分:-1)
显然即使速度文档说分隔符是一个字符串,它实际上是一个正则表达式。谢谢apache。
正确的方法是
$product.product.split("\|");