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