Class ServletModule
- java.lang.Object
-
- com.google.inject.AbstractModule
-
- com.google.inject.servlet.ServletModule
-
- All Implemented Interfaces:
Module
public class ServletModule extends AbstractModule
Configures the servlet scopes and creates bindings for the servlet API objects so you can inject the request, response, session, etc.You should subclass this module to register servlets and filters in the
configureServlets()
method.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interface
ServletModule.FilterKeyBindingBuilder
See the EDSL examples atconfigureServlets()
static interface
ServletModule.ServletKeyBindingBuilder
See the EDSL examples atconfigureServlets()
-
Constructor Summary
Constructors Constructor Description ServletModule()
-
Method Summary
-
Methods inherited from class com.google.inject.AbstractModule
addError, addError, addError, bind, bind, bind, bindConstant, binder, bindInterceptor, bindListener, bindListener, bindScope, configure, convertToTypes, currentStage, getMembersInjector, getMembersInjector, getProvider, getProvider, install, requestInjection, requestStaticInjection, requireBinding, requireBinding
-
-
-
-
Method Detail
-
configure
protected final void configure()
Description copied from class:AbstractModule
Configures aBinder
via the exposed methods.- Overrides:
configure
in classAbstractModule
-
configureServlets
protected void configureServlets()
Servlet Mapping EDSL
Part of the EDSL builder language for configuring servlets and filters with guice-servlet. Think of this as an in-code replacement for web.xml. Filters and servlets are configured here using simple java method calls. Here is a typical example of registering a filter when creating your Guice injector:
Guice.createInjector(..., new ServletModule() { @Override protected void configureServlets() { serve("*.html").with(MyServlet.class) } }
This registers a servlet (subclass ofHttpServlet
) calledMyServlet
to service any web pages ending in.html
. You can also use a path-style syntax to register servlets:serve("/my/*").with(MyServlet.class)
Every servlet (or filter) is required to be a singleton. If you cannot annotate the class directly, you should add a separatebind(..).in(Singleton.class)
rule elsewhere in your module. Mapping a servlet that is bound under any other scope is an error.Dispatch Order
You are free to register as many servlets and filters as you like this way. They will be compared and dispatched in the order in which the filter methods are called:Guice.createInjector(..., new ServletModule() { @Override protected void configureServlets() { filter("/*").through(MyFilter.class); filter("*.css").through(MyCssFilter.class); filter("*.jpg").through(new MyJpgFilter()); // etc.. serve("*.html").with(MyServlet.class); serve("/my/*").with(MyServlet.class); serve("*.jpg").with(new MyServlet()); // etc.. } }
This will traverse down the list of rules in lexical order. For example, a url "/my/file.js
" (after it runs through the matching filters) will first be compared against the servlet mapping:serve("*.html").with(MyServlet.class);
And failing that, it will descend to the next servlet mapping:serve("/my/*").with(MyServlet.class);
Since this rule matches, Guice Servlet will dispatch toMyServlet
. These two mapping rules can also be written in more compact form using varargs syntax:serve("*.html", "/my/*").with(MyServlet.class);
This way you can map several URI patterns to the same servlet. A similar syntax is also available for filter mappings.Regular Expressions
You can also map servlets (or filters) to URIs using regular expressions:serveRegex("(.)*ajax(.)*").with(MyAjaxServlet.class)
This will map any URI containing the text "ajax" in it toMyAjaxServlet
. Such as:- http://www.google.com/ajax.html
- http://www.google.com/content/ajax/index
- http://www.google.com/it/is_totally_ajaxian
Initialization Parameters
Servlets (and filters) allow you to pass in init params using the<init-param>
tag in web.xml. You can similarly pass in parameters to Servlets and filters registered in Guice-servlet using aMap
of parameter name/value pairs. For example, to initializeMyServlet
with two parameters (name="Dhanji", site="google.com"
) you could write:Map<String, String> params = new HashMap<String, String>(); params.put("name", "Dhanji"); params.put("site", "google.com"); ... serve("/*").with(MyServlet.class, params)
Binding Keys
You can also bind keys rather than classes. This lets you hide implementations with package-local visbility and expose them using only a Guice module and an annotation:... filter("/*").through(Key.get(Filter.class, Fave.class));
WhereFilter.class
refers to the Servlet API interface andFave.class
is a custom binding annotation. Elsewhere (in one of your own modules) you can bind this filter's implementation:bind(Filter.class).annotatedWith(Fave.class).to(MyFilterImpl.class);
SeeBinder
for more information on binding syntax.Multiple Modules
It is sometimes useful to capture servlet and filter mappings from multiple different modules. This is essential if you want to package and offer drop-in Guice plugins that provide servlet functionality.Guice Servlet allows you to register several instances of
ServletModule
to your injector. The order in which these modules are installed determines the dispatch order of filters and the precedence order of servlets. For example, if you had two servlet modules,RpcModule
andWebServiceModule
and they each contained a filter that mapped to the same URI pattern,"/*"
:In
RpcModule
:filter("/*").through(RpcFilter.class);
InWebServiceModule
:filter("/*").through(WebServiceFilter.class);
Then the order in which these filters are dispatched is determined by the order in which the modules are installed:install(new WebServiceModule()); install(new RpcModule());
In the case shown aboveWebServiceFilter
will run first.- Since:
- 2.0
-
filter
protected final ServletModule.FilterKeyBindingBuilder filter(String urlPattern, String... morePatterns)
- Parameters:
urlPattern
- Any Servlet-style pattern. examples: /*, /html/*, *.html, etc.- Since:
- 2.0
-
filter
protected final ServletModule.FilterKeyBindingBuilder filter(Iterable<String> urlPatterns)
- Parameters:
urlPatterns
- Any Servlet-style patterns. examples: /*, /html/*, *.html, etc.- Since:
- 4.1
-
filterRegex
protected final ServletModule.FilterKeyBindingBuilder filterRegex(String regex, String... regexes)
- Parameters:
regex
- Any Java-style regular expression.- Since:
- 2.0
-
filterRegex
protected final ServletModule.FilterKeyBindingBuilder filterRegex(Iterable<String> regexes)
- Parameters:
regexes
- Any Java-style regular expressions.- Since:
- 4.1
-
serve
protected final ServletModule.ServletKeyBindingBuilder serve(String urlPattern, String... morePatterns)
- Parameters:
urlPattern
- Any Servlet-style pattern. examples: /*, /html/*, *.html, etc.- Since:
- 2.0
-
serve
protected final ServletModule.ServletKeyBindingBuilder serve(Iterable<String> urlPatterns)
- Parameters:
urlPatterns
- Any Servlet-style patterns. examples: /*, /html/*, *.html, etc.- Since:
- 4.1
-
serveRegex
protected final ServletModule.ServletKeyBindingBuilder serveRegex(String regex, String... regexes)
- Parameters:
regex
- Any Java-style regular expression.- Since:
- 2.0
-
serveRegex
protected final ServletModule.ServletKeyBindingBuilder serveRegex(Iterable<String> regexes)
- Parameters:
regexes
- Any Java-style regular expressions.- Since:
- 4.1
-
getServletContext
protected final ServletContext getServletContext()
This method only works if you are using the GuiceServletContextListener to create your injector. Otherwise, it returns null.- Returns:
- The current servlet context.
- Since:
- 3.0
-
-