因此,我正在使用此grails应用程序来创建Web仪表板。到目前为止,我已经创建了一个控制器,用于查询来自我的数据库的指标并将其呈现为JSON文件,我将其提供给前端gsp文件中的d3和其他javascript库。
我的问题是:我的前端有一个下拉菜单如下:
<select onchange="loadData()" id="metric" class="dropdown">
<option value ="sales">Sales</option>
<option value ="visits">Visits</option>
</select>
我的相应控制器,以其最简单的形式,具有以下操作: (导入grails.converters和groovy.sql.sql)
def dataSource
def listJson = {
def sql = new Sql(dataSource)
def rows = sql.rows("select date_hour, total_revenue as sales, visits from table")
sql.close()
render rows as JSON
}
现在的问题是,我有一堆下拉菜单,每个都有很多选项,对于每一个,如果我按上面所做的那样,我将不得不为d3创建一个新的json文件来使用。相反,我能不能以某种方式将选项的值从上面的select元素插入到控制器的sql语句中?
类似于下面的内容,但我不知道它是否可能,如果是,那么正确的语法。我现在正在使用grails 2.3.4。
def listJson = {
def sql = new Sql(dataSource)
def rows = sql.rows("select date_hour, total_revenue as sales, ${index #metric} from table")
sql.close()
render rows as JSON
}
其中index是我的index.gsp文件(其中select选项是),#metric是元素的id。
提前致谢!
答案 0 :(得分:0)
您可以从控制器中获取params
中的选择值。例如:
def listJson = {
def metric = params.metric
// build query...
def query = "... ${metric} ..."
}
但是,我建议不要像这样构建SQL查询。每当您接受用户输入作为SQL查询的一部分时,它就为SQL注入攻击提供了巨大的机会。为什么不使用像GORM这样的更高级别的数据库抽象?另请注意,groovy在SQL查询中使用不同的参数扩展,而不是为PreparedStatements生成常规字符串。您需要像下面这样编写示例:sql.rows("select date_hour, total_revenue as sales, " + metric + " from table")
最后,虽然它取决于您在loadData()
中提交请求的方式,但HTML输入元素的通常约定是提交带有元素name
属性的值作为键,而不是id
。