在grails中插入字符串中的变量

时间:2013-02-12 08:25:56

标签: grails gsp string-interpolation

假设我有一个字符串以

格式保存到数据库的域属性中
 "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}的正确插值形式。

2 个答案:

答案 0 :(得分:3)

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

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

  3. 或者Eval类可能适合您的需要 - 尽管它不接受超过3个名称为x,y,z的参数。

答案 1 :(得分:3)

尝试Groovy Templates

您可以按照现在的方式将字符串保留在域中。要将变量绑定到字符串,您需要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."