将字符串转换为函数

时间:2014-07-11 10:35:54

标签: html forms grails groovy

在视图中,我有隐藏字段:

<g:hiddenField name="pageName" value="savePage1"/>

然后在控制器上(提交表单时)我

params.pageName = savePage1

我还有函数savePage1()

我尝试将字符串转换为函数,但它不起作用:

params.pageName + "()"

如何使用给定的params.pageName调用该函数?

请帮助,谢谢。

2 个答案:

答案 0 :(得分:2)

在您的示例中,您只是连接字符串,而不是调用方法。相反,你想要的是dynamic method invocation。假设您的savePage方法位于this

String pageName = params.pageName
this."$pageName"()

这里的问题似乎是您信任用户输入,因此您应确保pageName位于已批准的白名单中,否则您将面临一些主要漏洞:

String pageName = params.pageName

if (!pageName in [ 'savePage1', 'savePage2' /* ... */]) {
    throw SomeException('Invalid pageName')
}

this."$pageName"()

虽然我认为它的性能稍差,但您也可以调用Eval.me,但上述方法更受欢迎。

答案 1 :(得分:1)

我能想到的一种方法是创建所有回调函数的映射,如:

private def callbacks = [ 'savePage1' : { your();code();here(); },
                  'savePage2'  :{ some();other();code();here(); ]

而不是称这些函数为:

if(callbacks[params.pageName]){ 
   callbacks[params.pageName]()
}

groovy之美 - 使用闭包。如果将savePage1和savePage2定义为方法,则上面的地图看起来像

private def callbacks = ['savePage1' : this.&savePage1, 'savePage2' : this.&savePage2 ]

然后再次以同样方式调用

if(callbacks[params.pageName]){ 
   callbacks[params.pageName]()
}