Grails控制器 - 链接到.gsp文件中的选择元素

时间:2014-04-22 12:09:03

标签: javascript sql grails groovy

因此,我正在使用此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。

提前致谢!

1 个答案:

答案 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