Overview
Jog is a way of using Scalate with JAXRS (using the Jersey reference implementation) for the RESTful controller layer along with Guice for dependency injection
The quickest way to get up to speed on Jog is trying the getting started guide. Though rather than creating the jersey archetype, create the guice archetype. So follow the instructions to install the Scalate Tool then run
scalate create guice mygroup myartifactid
Dependency Injection
Jog uses the Guice Servlet approach to configuring your web application along with configuring Scalate and Jersey.
This lets you use dependency injection with Guice to configure your web application, the servlets and servlet filters and all the other resources and services used in your application without any icky XML configuration files and keeping a minimal simple web.xml.
If you try the getting started guide guide, then your running application will have a src/main/webapp/WEB-INF/web.xml file which contains the Guice Servlet initialisation configuration.
The ServletContextListener class configured in this part of the web.xml file
<listener>
<listener-class>somePackage.ServletContextListener</listener-class>
</listener>
is the Scala class which creates the Guice Module that performs all the dependency injection for your application which is in the src/main/scala directory.
So if you need to inject any new services via Guice, just add a new @Provides annotated method to the ServletContextListener class. See the comments in the code for samples.
Scalate and JAXRS
Scalate operates as an implicit view provider in Jersey. So if create a JAXRS resource which is annotated with @ImplicitProduces then your Jog web application will look for Scalate templates to render a HTML.
This uses a naming convention where Scalate will look in your web application for the view to use based on the class name of the resource bean being rendered.
For example if you had a resource bean like this
package somePackage
import com.sun.jersey.api.view.ImplicitProduces
import javax.ws.rs.{GET, Path, Produces}
@ImplicitProduces(Array("text/html;qs=5"))
@Path("/foo")
@Produces(Array("text/xml", "application/json"))
class MyResource {
@GET
def get = new SomeDTO(this)
}
If you ask for the URI /foo this resource can be rendered using SomeDTO as XML/JSON, or if a web browser or REST client asks for media type text/html Scalate will look for the template called somePackage/MyResource.index.ssp or somePackage/MyResource.index.scaml.
You can have multiple HTML views of the resource by appending the view name. For example requesting /foo/edit would look for templates somePackage/MyResource.edit.ssp or somePackage/MyResource.edit.scaml.
See Also
- WAR Overlay describes how we use a WAR overlay to include the Console in your application
- Scalate Console
- Documentation for further information on user guides and template references