In Grails we can create a link to a controller with the link() method. This works in the context of a request, like in a controller, tag library or Groovy Server Page (GSP). But since Grails 2.0 we can also generate links in services or any other Spring bean in our project. To create a link we need to inject the grailsLinkGenerator bean into our class. The grailsLinkGenerator bean has a link() method with the same argument list as we are already used to. We can define for example the controller, action and other parameters and the method will return a correct link.
We can also create the link for a resource with the resource() method. And to get the context path and server base URL we use the methods getContextPath() and getServerBaseURL().
The following service uses the link generator to create links in a Grails service.
// File: grails-app/service/link/generator/LinkService.groovy
package link.generator
import org.codehaus.groovy.grails.web.mapping.LinkGenerator
class LinkService {
// Inject link generator
LinkGenerator grailsLinkGenerator
String generate() {
// Generate: http://localhost:8080/link-generator/sample/show/100
grailsLinkGenerator.link(controller: 'sample', action: 'show', id: 100, absolute: true)
}
String resource() {
// Generate: /link-generator/css/main.css
grailsLinkGenerator.resource(dir: 'css', file: 'main.css')
}
String contextPath() {
// Generate: /link-generator
grailsLinkGenerator.contextPath
}
String serverUrl() {
// Generate: http://localhost:8080/link-generator
grailsLinkGenerator.serverBaseURL
}
}