Grails 2.3.x: get the value of URL parameters

2019-04-28 10:34发布

问题:

Given the URL

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

I want to get the format value (in this case is excel)

In the controller:

`println params.format

Grails docs reference

But params.format is always null, any idea?

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 ) ]
  }
}

回答1:

You are one of the luckiest victim of convention over configuration. ;)

An entry with key format is added to params as referred by default url mapping which represents the type of response that is expected (generally, whether xml/json) will be also be used for content negotiation which means, as an example, if you use:

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 gets populated by the type of content you are asking for. Which also means, a request parameter with name format will get overridden and will be lost.

You can rename the request parameter to something other than format then it should be available in controller like param.blah if request parameter has blah=excel.

OR

modify url mapping and remove the optional (.$format)? if not required:

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


回答2:

since format is token by the Grails platform , find below Another method to fix this problem via adding mapExtensionFormat varaible :

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

Then :

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

  }