2

假设我有一个字符串以格式保存到数据库中的域属性中

 "This variable needs to be interpolated: ${variable}."

从控制器,我传递这个变量的值,例如,"FooBar"。然后在 GSP 中,如果我做某事,页面。像

<%
    def testVar = ${MyDomainObj?.get(1)?.myProperty}
%>
variable is: ${variable}
variable is: ${testVar}

我得到如下输出:

variable is: FooBar
variable is: "This variable needs to be interpolated: ${variable}."

看到直接从数据库返回的 ${variable} 没有被插值。需要做什么才能获得保存在数据库实例中的表达式 ${variable} 的正确插值形式。

4

2 回答 2

3
  1. 简而言之:如果用户有权访问该数据库记录,则最好不要。您将允许在应用程序中执行任意代码。好吧,它的执行上下文将受到您提供的变量Binding的限制,但无论如何这将是一个具有很多方法的域对象。

  2. 如果您确定它是安全的,则需要解释该字符串。GStringTemplateEngine有一个完整的例子。

或者,Eval类可能会满足您的需求——尽管它不接受超过 3 个名称为 x、y、z 的参数。

于 2013-02-12T08:41:27.190 回答
3

试试Groovy 模板

您可以像现在一样将字符串留在域中。要将变量绑定到字符串,您需要一个实例并groovy.text.SimpleTemplateEngine调用它。createTemplateEnginemake

import groovy.text.SimpleTemplateEngine
// ...
def engine = new SimpleTemplateEngine()
def binding = ["variable": variable]
def testVar = engine.createTemplate(MyDomainObj?.get(1)?.myProperty).make(binding)

您的输出将如预期的那样:

variable is: FooBar
variable is: "This variable needs to be interpolated: FooBar."
于 2013-02-12T08:41:59.300 回答