In a smaller project it might be sufficient to use a single view repository only.
When hosting several sites with different template sets in a single CAE, multiple view repositories may be used. The CAE provides a mechanism for choosing a set of view repositories dynamically per request.
This mechanism is separated into two services that are implementations of ViewRepositoryNameProvider and ViewRepositoryProvider respectively.
ViewRepositoryNameProvider
The ViewRepositoryNameProvider is responsible for providing the names of the view repositories
to be used for resolving templates for the current request. For instance, if a page is
requested that is located in a "sports" subsite within a larger site, a list
[sports,site]
might be returned where "site" refers to a common template sets
that is used when the more special set "sports" does not provide a matching template. If
another request is sent for a "politics" page, then a list [politics,site]
might
be returned so that the output is rendered differently due to the use of different templates.
A default implementation
StaticViewRepositoryNameProvider
returns a list of predefined view repository names. Another default implementation
CompoundViewRepositoryNameProvider
returns the view repository names from several view repository name providers.
Applications that require more flexibility must implement the
interface ViewRepositoryNameProvider
to return a project specific list of view
repository names.
ViewRepositoryProvider
The ViewRepositoryProvider
is responsible for providing a
ViewRepository
instance for a given name. A default implementation
TemplateViewRepositoryProvider
is included. It inserts the repository name into a configured base path format
pattern, for example, a name "sports" with a format /WEB-INF/templates/%s
provides a ViewRepository instance with a base path /WEB-INF/templates/sports
.
The following example configuration registers a custom ViewRepositoryNameProvider
and a TemplateViewRepositoryProvider
to locate view repositories using the
pattern /WEB-INF/templates/sites/<viewRepositoryName>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:customize="..."> <!-- Instance of the project specific viewRepositoryNameProvider --> <bean id="customViewRepositoryNameProvider" class="com.company.CustomViewRepositoryNameProvider"> ... </bean> <!-- Register the view repository name provider --> <customize:append id="addCustomViewRepositoryNameProvider" bean="viewRepositoryNameProviders"> <list> <ref bean="customViewRepositoryNameProvider"/> </list> </customize:append> <!-- Create an instance of TemplateViewRepositoryProvider --> <bean id="customViewRepositoryProvider" class="com.coremedia.objectserver.view.resolver.TemplateViewRepositoryProvider"> <property name="templatesLocationFormat" value="/WEB-INF/templates/sites/%s"/> <!-- configure predefined beans --> <property name="viewDecorators" ref="viewDecorators"/> <property name="viewEngines" ref="viewEngines"/> <property name="loader" ref="templatesResourceLoader"/> <property name="programmedViews" ref="programmedViews"/> </bean> <!-- Register the view repository provider --> <customize:append id="addCustomViewRepositoryProvider" bean="viewRepositoryProviders"> <list> <ref bean="customViewRepositoryProvider"/> </list> </customize:append> </beans>