Java 如何使用velocity上下文变量作为局部变量

Java 如何使用velocity上下文变量作为局部变量,java,velocity,Java,Velocity,在速度方面,我有一个问题。让我解释清楚如下 我已经在课堂上申报了 private final static int MAX_TOOL_TITLE_LENGTH = 20; //Putting into context context.put("maxToolTitleLength","MAX_TOOL_TITLE_LENGTH"); 现在在vm文件中,我将上下文变量值设置为不同的 #if(true) #set($maxToolTitleLength=99) #end 在vm文件的上面

在速度方面,我有一个问题。让我解释清楚如下 我已经在课堂上申报了

private final static int MAX_TOOL_TITLE_LENGTH = 20;

//Putting into context
context.put("maxToolTitleLength","MAX_TOOL_TITLE_LENGTH");
现在在vm文件中,我将上下文变量值设置为不同的

#if(true)
  #set($maxToolTitleLength=99) 
#end
在vm文件的上面几行中,我将值设置为99。我不想将此值设置为上下文变量。我想在if only中限制变量的范围。之后,如果我不想得到99的值,它仍然与上下文中的值相同。在速度上有可能以其他方式吗


提前感谢。

无法更改上下文对象的值并使此更改仅在本地进行。我不明白为什么不在模板中简单地使用一个新的变量来实现这一点

#if (true)
  #set($thisTitleLength=99) 
#end
或者,如果确实需要为此使用上下文变量,只需在完成要更改其值的块后恢复上下文变量:

#if (true)
  #set($maxToolTitleLength=99) 
  ## Do whatever you want with the new value
  ...
  ## Now restore its value
  #set($maxToolTitleLength=20)
#end
实际上,有一种方法可以在速度中引入局部变量,尽管这有点令人惊讶:

#foreach ($maxToolTitleLength in [99])
...text that uses this $maxToolTitleLength definition...
#end
## now $maxToolTitleLength is back to whatever value it had before
[99]
是一个包含一个元素的列表,
99
,因此这是一个执行一次的循环。在循环中,
$maxToolTitleLength
的值为
99
。您还可以在循环中设置($maxToolTitleLength=$anotherValue)。
#foreach
之前的值将在循环后恢复。

由@user2624542发现的#foreach hack用于生成本地作用域。然而,至少在相当古老的Polarion速度1.5中,宏内部的行为与外部不同

在宏内部,作用域适用于现有变量(在全局上下文中),但不适用于未定义的变量。

$foo ## undef
#foreach ($foo in [99])
  $foo ## 99
  #set($foo=100)
  $foo ## 100
#end
$foo ## undef

#set($foo=0)
$foo ## 0
#foreach ($foo in [99])
  $foo ## 99
  #set($foo=100)
  $foo ## 100
#end
$foo ## 0
而在宏中

#macro(bar)
  $foo ## undef
  #foreach ($foo in [99])
    $foo ## 99
    #set($foo=100)
    $foo ## 100
  #end
  $foo ## 100 NOT undef
#end

$foo ## undef
#bar()
$foo ## 100 NOT undef

#macro(bar2)
  $foo ## 0
  #foreach ($foo in [99])
    $foo ## 99
    #set($foo=100)
    $foo ## 100
  #end
  $foo ## 0
#end

#set($foo=0)
$foo ## 0
#bar2()
$foo ## 0

不velocity没有作用域块。那么如何解决问题。如果我更改模板文件中的上下文变量值。它不会影响上下文变量吗?如果您解释您试图解决的实际问题,可能会提供解决方案。在我的项目中,有一个文本长度验证。我有四个文本框。三个文本框我想允许20个字符。对于另一个,我需要90个字符才能允许。在开发人员开发之前,他们在上下文中取一个变量并将值设置为20。在velocity模板中,他们将此变量作为最大长度属性值。如果我更改模板文件中的值,它适用于所有文本框,因为它是上下文变量。那么,如何为特定文本框指定90?