在视图中,我有隐藏字段:
<g:hiddenField name="pageName" value="savePage1"/>
然后在控制器上(提交表单时)我
params.pageName = savePage1
我还有函数savePage1()
我尝试将字符串转换为函数,但它不起作用:
params.pageName + "()"
如何使用给定的params.pageName
调用该函数?
请帮助,谢谢。
答案 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]()
}