URL’s and routes are defined in the
conf/routes file and have three columns as example below:
[METHOD] [URL Pattern] [Controller.Action] GET / MySite.Welcome
# Higher priority routes first module:jobs # Importing jobs includes all the routes from the module ## main routes GET / App.Home # A simple path GET /contact App.Contact # contact page #GET /contact/ App.Contact # unnecessary as (optional trailing slash is above) GET /login App.Login GET /hotels/ Hotels.Index # Match /hotels and /hotels/ GET /hotels/:id Hotels.Show # Extract a URI argument WS /hotels/:id/feed Hotels.Feed # WebSockets. POST /hotels/:id/:action Hotels.:action # Automatically route some actions. ## Static files. Map /app/public resources under /public/... GET /public/*filepath Static.Serve("public") ## Developer Stuff # Prefix all routes in the testrunner module with /debug/ * /debug/ module:testrunner ## Finally # Catch all and Automatic URL generation * /:controller/:action :controller.:action
Let’s go through the lines one at a time and by the end, we’ll see how to accomplish reverse routing i.e generating the URL to invoke a particular action.
A Fixed Path
GET /login App.Login GET /about App.About
The routes above use an ‘exact match’ of HTTP method and path and invoke the Login and About action on the App controller.
GET /hotels/ Hotels.Index
- This route invokes
- The reverse route to
Hotels.Indexwill include the trailing slash/
Trailing slashes should not be used to differentiate between actions. The
/login will be matched by a request to
GET /hotels/:id Hotels.Show
- Segments of the path may be matched and extracted with a
:idvariable above will match anything except a slash. For example,
/hotels/abcwould both be matched by the route above.
- Extracted parameters are available in both the
GET /public/*filepath Static.Serve("public")
The starred parameter must be the first element in the path, and match all remaining path elements.
For example, in the case above it will match any path beginning with
its value will be the path substring that follows the
As also demonstrated in Static Serving below, routes may specify one or more parameters to the action. For example:
GET /products/:id ShowList("PRODUCT") GET /menus/:id ShowList("MENU")
The provided argument(s) are bound to a parameter name using their position. In this case, the list type string would be bound to the name of the first action parameter.
This is helpful in situations where:
- you have a couple similar actions
- you have actions that do the same thing, but operate in different modes
- you have actions that do the same thing, but operate on different data types
POST /hotels/:id/:action Hotels.:action * /:controller/:action :controller.:action
URL argument extraction can also be used to determine the invoked action. Matching to controllers and actions is case insensitive.
The first example route line would effect the following routes:
/hotels/1/show => Hotels.Show /hotels/2/details => Hotels.Details
Similarly, the second example may be used to access any action in the application:
/app/login => App.Login /users/list => Users.List
Since matching to controllers and actions is case insensitive, the following routes would also work:
/APP/LOGIN => App.Login /Users/List => Users.List
Using auto-routing as a catch-all (e.g. last route in the file) is useful for quickly hooking up actions to non-vanity URLs, especially in conjunction with the reverse router.
GET /public/*filepath Static.Serve("public") GET /favicon.ico Static.Serve("public","img/favicon.png") GET /img/icon.png Static.Serve("public", "img/icon.png") << space causes error
prefix(string) - A (relative or absolute) path to the asset root.
filepath(string) - A relative path that specifies the requested file.
For the two parameters version of
Static.Serve, blank spaces are not allowed between
,due to how
- Refer to organization for the directory layout
Modules which contain routes can be imported into your application in two ways:
In the example below, its assumed
mymodule has a
routes file containing:
GET /gopher MyModule.FetchGopher POST /gopher/add MyModule.AddGopher
1) Importing routes as-is
# mymodule routes module:mymodule # Other routes GET / Application.Index GET /bar Application.Bar
- The routes would be ‘imported’ into your application with the URL’s
2) Importing the routes under a prefixed path
# mymodule routes with prefix - Must be defined with an asterisk * for the method * /myurl module:mymodule # Other routes GET / Application.MyAction GET /foo Application.FooAction
- The routes would be imported with the URL’s
- See also Modules and Jobs
WS /hotels/:id/feed Hotels.Feed
Websockets are routed the same way as other requests with the ‘method’
It is good practice to use a reverse router to generate URL’s instead of hardcoding for a few reasons including:
- Avoids misspellings
- The compiler ensures that reverse routes have the right number and type of parameters.
- Localizes URL changes to one place in the ‘conf/routes’ file.
Upon building your application, Revel generates an
app/routes package. Use it
with a statement of the form:
The above statement returns an URL string to
Controller.Action with the
Below is a more complete example: