blob: 197e25be077c54ac24afa25fec2077c3b5dfe7e1 [file] [log] [blame]
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<document>
<properties>
<title>Overview</title>
<projectfile>xdocs/project.xml</projectfile>
<subprojectfile>xdocs/config.project.xml</subprojectfile>
</properties>
<body>
<section name="Configuration Overview">
<p>
The VelocityTools support infrastructure exists to
provide all your templates a common set of tools
and data. This is inspired by the
<a href="http://turbine.apache.org/turbine/turbine-2.2.0/pullmodel.html">
Pull MVC</a> model, which deviates from the strict MVC
purist approach out for the sake of convenience and
clarity. The goal here is to provide template authors
a common interface of data and functions across all
templates (we call this a "toolbox"), whether they
need all of those functions and data or not. This
saves the template author from having to remember what
keys were used where and makes it easy to drop a new
template (i.e. View) into an app without having to
modify the controller (which would typically involve
creating a new action class). The degree to which this
Pull MVC pattern violates MVC principles can (and
should) vary widely depending on your needs and goals.
</p>
<p>
The default VelocityTools 2 configuration does not
include any "gross MVC offenders", as such things
would be hard to generalize usefully. The default
configuration primarily includes tools for
manipulating values made available in the template's
context by a controller and a few for accessing static
resources.
</p>
<p>
However, it is likely that you will want to add your own data and
tools to your VelocityTools 2 configuration or at least want to
change the default settings of the standard tools. To that end,
configuration of your applications "toolbox(es)" can be done via
XML, Java or properties. Different configurations can also be
easily combined together.
</p>
<p>
There a few basic concepts to the configuration that
it is useful to know. First, what you are creating
a configuration for is a
<a href="javadoc/org/apache/velocity/tools/ToolboxFactory.html">ToolboxFactory</a>.
This factory produces your toolbox(es) as needed by
<a href="view.html">VelocityView</a> or your own
application. A factory can have any number of
toolboxes, all distinguished by their scope property.
There are three special scopes automatically recognized
by VelocityTools 2: "request", "application", and
"session". The "session" scope is only relevant within
a <a href="view.html">VelocityView</a> app, but the
other two may be useful anywhere. Placing a
tool within "request" scope means that a new instance
will be created for every context. Placing a tool
within "application" scope means that only one instance
of the tool will be created and shared throughout the
application, effectively acting as a singleton. This,
of course, means that thread-safety must be considered
when putting a tool in "application" scope.
</p>
<p>
Because of such concerns, Velocity Tools now provides
annotations to allow developers to restrict the scope(s)
in which a tool can be placed. For more on these and other available
annotations, see
<a href="creatingtools.html">Creating Your Own Tools</a>.
</p>
<p>
When the "application" toolbox is requested, the
ToolboxFactory will also include any "data" configured
for it. These are unchanging, static values that are
meant to be available to all templates in your
application. You can configure any number of data for
your application and the configuration supports both
automatic and explicit type conversion (via
Commons-BeanUtils
<a href="http://commons.apache.org/beanutils/commons-beanutils-1.7.0/docs/api/org/apache/commons/beanutils/Converter.html">converters</a>
) for these values (since
XML and properties formats only allow string inputs).
</p>
<p>
Other things to know are that each toolbox can have
any number of tools within it, and that "properties"
may be added for any and all tools, toolboxes, and the
factory itself. A "property" added to one of these
also has all of the same type conversion support as
the "data" values do. Properties set on a toolbox are
made available to all tools within that toolbox and
properties set for the factory itself are made
available to all tools in your application.
</p>
<p>
Now on to the formats for specifying these things...
</p>
<ul>
<li><a href="config.xml.html">XML</a></li>
<li><a href="config.properties.html">Properties</a></li>
<li><a href="config.java.html">Java</a></li>
</ul>
</section>
</body>
</document>