2013-02-12 46 views
2

假設我有格式插值Grails中一個字符串中的變量

"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}." 

見$ {}變量是直接返回從數據庫中沒有被interploated。需要做些什麼才能獲得保存在數據庫實例中的表達式$ {variable}的正確插值形式。

回答

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." 
3
  1. 簡而言之:如果用戶有權訪問該數據庫記錄,則最好不要。您將允許在您的應用程序中執行任意代碼。那麼,它的執行上下文將受到您提供的變量Binding的限制,但無論如何這將是一個包含大量方法的域對象。

  2. 如果確定它是安全的,則需要解釋該字符串。 GStringTemplateEngine有一個完整的例子。

或者也許Eval類將滿足您的需求 - 雖然它不接受超過3個參數名稱x,y,z。

相關問題