【问题标题】:Grails 2.3.x: get the value of URL parametersGrails 2.3.x:获取 URL 参数的值
【发布时间】:2016-08-03 23:16:48
【问题描述】:

给定网址

  http://localhost:9000/Estrategia/book/index?format=excel&extension=xls

我要获取格式值(本例为excel)

在控制器中:

`println params.format

Grails docs reference

但是params.format 总是为空,知道吗?

Grails 2.3.5

import static org.springframework.http.HttpStatus.*
import grails.transaction.Transactional

@Transactional(readOnly = true)
class BookController {

    static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]

    def exportService // Export service provided by Export plugin
    def grailsApplication  //inject GrailsApplication

   def index(Integer max) {
    params.max = Math.min(max ?: 10, 100)

    if(!params.max) 
    params.max = 10

    println params?.format
    [ bookInstanceList: Book.list( params ) ]
  }
}

【问题讨论】:

  • 您可以将您的控制器添加到问题中吗?
  • foo 在哪里? /hello?foo=bar 是如何映射到这个控制器的?你指的是params?.format?您要访问的实际网址是什么? 一个好的问题是一个解决了一半的问题 - 我想你会同意这一点。 :)

标签: url grails parameters


【解决方案1】:

您是约定优于配置的最幸运的受害者之一。 ;)

一个带有键 format 的条目被添加到 params 中,默认 url 映射表示预期的响应类型(通常是 xml/json)也将用于内容协商,这意味着,例如,如果您使用:

http://localhost:9000/Estrategia/book/index.xml
//params -- [action:index, format:xml, controller:book]

http://localhost:9000/Estrategia/book/index.json
//params -- [action:index, format:json, controller:book]

http://localhost:9000/Estrategia/book/index.json?format=excel&extension=xls
//params -- [action:index, format:json, extension:xls, controller:book]

http://localhost:9000/Estrategia/book/index?format=excel&extension=xls
//params -- [action:index, format:null, extension:xls, controller:book]

format 由您要求的内容类型填充。这也意味着,名称为 format 的请求参数将被覆盖并丢失。

您可以将请求参数重命名为 format 以外的其他名称,如果请求参数具有 blah=excel,则它应该在控制器中可用,例如 param.blah

修改 url 映射并删除可选的(.$format)?(如果不需要):

"/$controller/$action?/$id?(.$format)?"{
     constraints {
         // apply constraints here
     }
}

【讨论】:

  • 感谢您的耐心和非常好的解释答案。这对我来说似乎很奇怪,因为我使用的是 Grails 插件 Grails Export plugin
  • 是的,我看到插件中使用了params.format。插件太旧了。现在,如果可能修改映射,我会为插件开发一个 PR 以适应新版本的 Grails。
  • 另一个任何人都可能感兴趣的 StackOverflow 页面:stackoverflow.com/questions/19961339/…
  • 哈哈。它是fixed in export plugin version 1.5。升级插件并使用exportFormat 而不是format。从修复中,我看到了 SO answer related
  • 值得用这些更改升级 github 中的 README 文件,并从插件页面引用 github repo。
【解决方案2】:

由于 format 是 Grails 平台的令牌,请在下面找到通过添加 mapExtensionFormat 变量来解决此问题的另一种方法:

static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]
static mapExtensionFormat=['pdf':'pdf','xls':'excel','csv':'csv','rtf':'rtf']
def exportService // Export service provided by Export plugin
def grailsApplication  //inject GrailsApplication

然后:

   def index(Integer max) {
        // ...
        String format=mapExtensionFormat[params?.extension]

  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    相关资源
    最近更新 更多