--- | |
Configuring Tapestry | |
--- | |
Configuring Tapestry | |
Tapestry runs on top of the standard Java Servlet API. To the servlet container, | |
such as Tomcat, Tapestry appears as a <servlet filter>. This gives Tapestry great | |
flexibility in matching URLs without requiring lots of configuration inside web.xml. | |
* web.xml | |
The majority of configuration occurs inside the servlet deployment descriptor, | |
WEB-INF/web.xml. | |
Most of the configuration is boilerplate; the same for all applications. | |
The application specific configuration is to identify the root application package. | |
Tapestry uses this package name to locate your page and component classes. | |
Page classes must go in the pages sub-package, and components must go in the | |
components sub-package. | |
You specify the root package as a context parameter: | |
+----+ | |
<!DOCTYPE web-app | |
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" | |
"http://java.sun.com/dtd/web-app_2_3.dtd"> | |
<web-app> | |
<display-name>My Tapestry Application</display-name> | |
<context-param> | |
<param-name>tapestry.app-package</param-name> | |
<param-value>org.example.myapp</param-value> | |
</context-param> | |
<filter> | |
<filter-name>app</filter-name> | |
<filter-class>org.apache.tapestry5.TapestryFilter</filter-class> | |
</filter> | |
<filter-mapping> | |
<filter-name>app</filter-name> | |
<url-pattern>/*</url-pattern> | |
</filter-mapping> | |
</web-app> | |
+----+ | |
You may name the filter whatever you want, though "app" is a common convention. | |
In this example, page classes will be stored in the <<<org.example.myapp.pages>>> package (or in sub-packages below). | |
Likewise, component classes will be stored in the <<<org.example.myapp.components>>> package. | |
* Tapestry Requests vs. Container Requests | |
The Tapestry filter matches all the requests that apply to Tapestry, and passes the rest off to the | |
servlet container. | |
Actual files inside the web application take precedence over Tapestry pages, in situation where there | |
would be a naming conflict. | |
Tapestry recognizes the <root URL>, where the servlet path is simply "/", and renders the application page "Start", | |
if it exists. | |
* Tapestry IoC Configuration | |
Most other configuration occurs inside your application's module builder class. The application module builder | |
will often define new services, provide overrides of services, or make contributions to service configurations. | |
Tapestry looks for a module builder class in the services package (under the root package). It capitalizes | |
the \<filter-name\> and appends "Module". In the previous example, the module builder class | |
would be org.example.myapp.services.AppModule. | |
If such a class exists, it is added to the IoC Registry. It is not an error for your application to not have a module, though | |
any non-trivial application will have a module. | |
* Configuration Symbols | |
Tapestry may also be configured via {{{../../tapestry-ioc/symbols.html}symbols}}. A certain number of built-in services | |
(some of which are not even public) are configured via symbols. These symbols can be overridden | |
by contributing to the ApplicationDefaults service configuration, or on the command line | |
by defining JVM System Properties with the -D command line option. | |
These symbols are always defined in terms of strings, that are coerced to the appropriate type (a number, | |
a boolean, etc.). Of special note are <time intervals>, which are specified in a | |
{{{../../apidocs/org/apache/tapestry5/ioc/util/TimeInterval.html}particular format}}. | |
[tapestry.compress-whitespace] | |
A flag (true or false). When true (the default) whitespace in component templates is compressed by default | |
(this can be fine-tuned using the standard xml:space attribute on an element in the template). | |
When this flag is false, then whitespace is retained by default (but can still be overridden). | |
[tapestry.default-cookie-max-age] | |
The default time interval that cookies created by Tapestry will be kept in the client web browser. | |
The dfault value is equal to one week. | |
Primarily, this is used with a cookie that exists | |
to track the preferred user locale. | |
The default is "7 d" (that is, seven days). | |
[tapestry.default-stylesheet] | |
The default stylesheet automatically injected into every rendered HTML page. Many Tapestry components assume that | |
this stylesheet is available. All the classes defined in the stylesheet are prefixed with "t-". The exact contents | |
of the stylesheet are subject to change at any time (they are considered internal), so replacing the stylesheet, | |
rather than overriding selected rules within it, entails some risk. | |
The default is org/apache/tapestry5/default.css, stored on the classpath. | |
[tapestry.file-check-interval] | |
Time interval between file system checks. During a file system check, only a single thread is active (all others | |
are blocked) and any files loaded are checked for changes (this is part of {{{reload.html}automatic component reloading}}). | |
The default is "1 s" (one second), and is usually overridden with a higher value in production (say, between one and five minutes). | |
[tapestry.file-check-update-timeout] | |
Time interval that Tapestry will wait to obtain the exclusive lock needed for a file check. The default is "50 ms" (50 milliseconds). | |
If the exclusive lock can't be obtained in that amount of time, the request will proceeed normally (without the check), | |
but each successive request will attempt to get the lock and perform the check until successful. | |
[tapestry.force-absolute-uris] | |
A flag (true or false). When false (the default), Tapestry will attempt to optimize URIs that it generates, using | |
relative URIs when such URIs are shorter than absolute URIs. You will see some savings when you make generous | |
use of libraries, sub-folders and page activation contexts ... otherwise, no significant difference. | |
When true, all URIs will be absolute URIs (including the | |
context path, and the complete path for the request). | |
[tapestry.production-mode] | |
A flag (true or false) indicating whether the application is running in production or in development. The default | |
is true, which means that runtime exceptions are not reported with full detail (only the root exception message | |
is displayed, not the entire stack of exceptions, properties and other information shown in development mode). | |
[tapestry.page-pool.active-window] | |
The time interval that an instantiated page instance may be cached before being removed. As pages are | |
returned to the pool, they are time stamped. Periodically (as per the file check interval), | |
the pool is scanned for page instances that have not been used recently; those that are outside | |
the active window are discarded. This is used to free up unnecessary page instances after | |
a request surge. | |
The default is "10 m" (10 minutes). | |
[tapestry.page-pool.hard-limit] | |
The absolute maximum number of page instances (for a particular page name / locale combination) that Tapestry | |
will create at any time. If this number is reached, then requests will fail because a page instance is not | |
available ... this can happen as part of a denial of service attack. For this value to have any meaning, it | |
should be lower than the number of threads that the servlet container is configured to use when processing | |
requests. | |
The default is 20 page instances. | |
[tapestry.page-pool.soft-limit] | |
The number of pages in the page pool (for a given page name / locale combination) before which Tapestry will | |
start to wait for existing pages to be made available. Under this limit of pages, Tapestry will simply | |
create a new page instance if no existing instance is readily available. Once the soft limit is reached, | |
Tapestry will wait a short period of time (the soft wait interval) to see if an existing page instance | |
is made available. It will then create a new page instance (unless the hard limit has been reached). | |
The default is 5 page instances. Remember that page pooling is done seperately for each | |
page (and localization of the page). | |
[tapestry.page-pool.soft-wait] | |
The time interval that Tapestry will wait for a page instance to become available before deciding whether to create | |
an entirely new page instance. The default is "10 ms". | |
[tapestry.secure-page] | |
If true, then the page may only be accessed via HTTPS. The {{{../../apidocs/org/apache/tapestry5/annotations/Secure.html}@Secure}} | |
annotation will set this value to true. | |
[tapestry.scriptaculous] | |
The path to the embedded copy of {{{http://script.aculo.us/}script.aculo.us}} packaged with Tapestry. This value may be overridden | |
to use a different version of the script.aculo.us library. Tapestry's default version is 1.8.0 | |
(including Prototype 1.6.0). | |
[tapestry.start-page-name] | |
The logical name of the start page, the page that is rendered for the <root URL>. This is normally "start". | |
[tapestry.supported-locales] | |
A comma-separated list of supported locales. Incoming requests as "narrowed" to one of these locales, based on closest match. | |
If no match can be found, the first locale in the list is treated as the default. | |
The default is (currently) "en,it,zn_CH". As the community contributes new localizations of the necessary messages files, | |
this list will expand. Note that the Tapestry quickstart archetype overrides the factory default, forcing the | |
application to be localized only for "en". | |
[tapestry.suppress-redirect-from-action-requests] | |
Normally, Tapestry responds to action requests (such as form submissions) by sending a client-side redirect | |
to the renderring page. This has a lot of benefits in terms of improving browser navigation, making sure | |
URLs are bookmarkable, and so forth. However, it has a cost: more data stored persistently in the session, | |
and a double-request for each user action (one action request, one render request). | |
Setting this symbol to "true" changes the Tapestry behavior to make it more like Tapestry 4: a markup response | |
is sent directly for the action request, no redirect in the middle. This option should be used with care, | |
and only in cases where you are certain that the benefits outweigh the disadvantages. | |
Ignored Paths | |
In some cases, you may use Tapestry is concert with other servlets. This can cause problems, since | |
Tapestry (being a servlet filter) may see URLs intended for another servlet and attempt to process them. | |
The Servlet API does not provide Tapestry with any clues about what other servlets are available in the | |
web application. Instead, you must configure Tapestry to ignore paths intended for other servlets. | |
The IgnoredPathsFilter service is the method for this kind of configuration. Its configuration | |
is an unordered collection of regular expression patterns. A request whose path matches any of these | |
patterns is <<not>> processed by Tapestry. | |
For example, say you are using {{{http://getahead.org/dwr/}Direct Web Remoting}}. You'll likely have | |
the servlet path /dwr mapped to the Direct Web Remoting servlet. | |
You contribution would look like: | |
--- | |
public static void contributeIgnoredPathsFilter(UnorderedCollection<String> configuration) | |
{ | |
configuration.add("/dwr/.*"); | |
} | |
--- | |
The regular expression matches any path that begins with "/dwr/". | |
The regular expressions provided in the configuration are always compiled with case insensetivity enabled. | |
Also note that actual files in your web application (images, stylesheets, etc.) are always ignored by Tapestry. |