Modified: websites/production/tapestry/content/documentation.html
==============================================================================
--- websites/production/tapestry/content/documentation.html (original)
+++ websites/production/tapestry/content/documentation.html Sun Apr 26 21:22:55
2020
@@ -67,7 +67,7 @@
</div>
<div id="content">
- <div id="ConfluenceContent"><div
style="float:right;margin-left:1em"><h2 id="Documentation-AllTopics">All
Topics</h2><ul class="childpages-macro"><li><a
href="introduction.html">Introduction</a></li><li><a
href="getting-started.html">Getting Started</a></li><li><a
href="principles.html">Principles</a></li><li><a
href="tapestry-tutorial.html">Tapestry Tutorial</a><ul
class="childpages-macro"><li><a
href="dependencies-tools-and-plugins.html">Dependencies, Tools and
Plugins</a></li><li><a href="creating-the-skeleton-application.html">Creating
The Skeleton Application</a></li><li><a
href="exploring-the-project.html">Exploring the Project</a></li><li><a
href="implementing-the-hi-lo-guessing-game.html">Implementing the Hi-Lo
Guessing Game</a></li><li><a
href="using-beaneditform-to-create-user-forms.html">Using BeanEditForm To
Create User Forms</a></li><li><a
href="using-tapestry-with-hibernate.html">Using Tapestry With
Hibernate</a></li></ul></li><li><a href="us
er-guide.html">User Guide</a><ul class="childpages-macro"><li><a
href="supported-environments-and-versions.html">Supported Environments and
Versions</a></li><li><a href="project-layout.html">Project
Layout</a></li><li><a href="configuration.html">Configuration</a></li><li><a
href="runtime-exceptions.html">Runtime Exceptions</a></li><li><a
href="class-reloading.html">Class Reloading</a></li><li><a
href="component-reference.html">Component Reference</a></li><li><a
href="annotations.html">Annotations</a></li><li><a
href="component-classes.html">Component Classes</a></li><li><a
href="component-templates.html">Component Templates</a></li><li><a
href="property-expressions.html">Property Expressions</a></li><li><a
href="component-parameters.html">Component Parameters</a></li><li><a
href="parameter-type-coercion.html">Parameter Type Coercion</a></li><li><a
href="layout-component.html">Layout Component</a></li><li><a
href="component-mixins.html">Component Mixins</a><ul class="c
hildpages-macro"><li><a href="built-in-mixins.html">Built-in
Mixins</a></li></ul></li><li><a href="page-navigation.html">Page
Navigation</a></li><li><a href="localization.html">Localization</a></li><li><a
href="page-life-cycle.html">Page Life Cycle</a></li><li><a
href="request-processing.html">Request Processing</a></li><li><a
href="component-rendering.html">Component Rendering</a></li><li><a
href="component-events.html">Component Events</a></li><li><a
href="url-rewriting.html">URL rewriting</a></li><li><a
href="dom.html">DOM</a></li><li><a href="response-compression.html">Response
Compression</a></li><li><a href="security.html">Security</a></li><li><a
href="https.html">HTTPS</a></li><li><a
href="content-type-and-markup.html">Content Type and Markup</a></li><li><a
href="persistent-page-data.html">Persistent Page Data</a></li><li><a
href="session-storage.html">Session Storage</a><ul
class="childpages-macro"><li><a href="clustering-issues.html">Clustering
Issues</a></l
i></ul></li><li><a href="injection.html">Injection</a></li><li><a
href="environmental-services.html">Environmental Services</a></li><li><a
href="css.html">CSS</a></li><li><a href="assets.html">Assets</a></li><li><a
href="forms-and-validation.html">Forms and Validation</a></li><li><a
href="beaneditform-guide.html">BeanEditForm Guide</a></li><li><a
href="uploading-files.html">Uploading Files</a></li><li><a
href="logging.html">Logging</a></li><li><a
href="unit-testing-pages-or-components.html">Unit testing pages or
components</a></li><li><a href="integration-testing.html">Integration
Testing</a></li><li><a href="development-dashboard.html">Development
Dashboard</a></li><li><a href="modules.html">Modules</a><ul
class="childpages-macro"><li><a href="built-in-modules.html">Built In
Modules</a></li><li><a href="third-party-modules.html">Third Party
Modules</a></li></ul></li><li><a href="ioc.html">IOC</a><ul
class="childpages-macro"><li><a href="tapestry-ioc-overview.html">T
apestry IoC Overview</a></li><li><a href="tapestry-ioc-modules.html">Tapestry
IoC Modules</a></li><li><a href="defining-tapestry-ioc-services.html">Defining
Tapestry IOC Services</a></li><li><a href="service-advisors.html">Service
Advisors</a></li><li><a href="tapestry-ioc-decorators.html">Tapestry IoC
Decorators</a></li><li><a href="tapestry-ioc-configuration.html">Tapestry IoC
Configuration</a></li><li><a href="case-insensitivity.html">Case
Insensitivity</a></li><li><a href="autoloading-modules.html">Autoloading
Modules</a></li><li><a href="service-implementation-reloading.html">Service
Implementation Reloading</a></li><li><a
href="ordering-by-constraints.html">Ordering by Constraints</a></li><li><a
href="symbols.html">Symbols</a></li><li><a
href="chainbuilder-service.html">ChainBuilder Service</a></li><li><a
href="pipelinebuilder-service.html">PipelineBuilder Service</a></li><li><a
href="shadowbuilder-service.html">ShadowBuilder Service</a></li><li><a
href="strategy
builder-service.html">StrategyBuilder Service</a></li><li><a
href="injection-in-detail.html">Injection in Detail</a></li><li><a
href="object-providers.html">Object Providers</a></li><li><a
href="service-serialization.html">Service Serialization</a></li><li><a
href="type-coercion.html">Type Coercion</a></li><li><a
href="starting-the-ioc-registry.html">Starting the IoC Registry</a></li><li><a
href="registry-startup.html">Registry Startup</a></li><li><a
href="parallel-execution.html">Parallel Execution</a></li><li><a
href="logging-in-tapestry.html">Logging in Tapestry</a></li><li><a
href="using-jsr-330-standard-annotations.html">Using JSR 330 standard
annotations</a></li><li><a href="operation-tracker.html">Operation
Tracker</a></li></ul></li><li><a href="hibernate-core.html">Hibernate -
Core</a><ul class="childpages-macro"><li><a
href="hibernate-core-conf.html">Hibernate - Core - Conf</a></li><li><a
href="hibernate.html">Hibernate</a></li></ul></li><li><a href="integrati
ng-with-spring-framework.html">Integrating with Spring
Framework</a></li><li><a href="bean-validation.html">Bean
Validation</a></li><li><a href="component-report.html">Component
Report</a></li><li><a href="aliases.html">Aliases</a></li><li><a
href="integrating-with-jpa.html">Integrating with JPA</a></li><li><a
href="client-side-javascript.html">Client-Side JavaScript</a><ul
class="childpages-macro"><li><a href="javascript-modules.html">JavaScript
Modules</a></li><li><a href="coffeescript.html">CoffeeScript</a></li><li><a
href="typescript.html">TypeScript</a></li><li><a
href="legacy-javascript.html">Legacy JavaScript</a></li><li><a
href="ajax-and-zones.html">Ajax and Zones</a></li></ul></li></ul></li><li><a
href="cheat-sheets.html">Cheat Sheets</a><ul class="childpages-macro"><li><a
href="application-module-class-cheat-sheet.html">Application Module Class Cheat
Sheet</a></li><li><a href="component-cheat-sheet.html">Component Cheat
Sheet</a></li><li><a href="tapestry-for
-jsf-users.html">Tapestry for JSF Users</a></li></ul></li><li><a
href="cookbook.html">Cookbook</a><ul class="childpages-macro"><li><a
href="default-parameter.html">Default Parameter</a></li><li><a
href="overriding-exception-reporting.html">Overriding Exception
Reporting</a></li><li><a href="error-page-recipe.html">Error Page
Recipe</a></li><li><a href="supporting-informal-parameters.html">Supporting
Informal Parameters</a></li><li><a href="component-libraries.html">Component
Libraries</a></li><li><a href="switching-cases.html">Switching
Cases</a></li><li><a href="enum-parameter-recipe.html">Enum Parameter
Recipe</a></li><li><a href="extending-the-if-component.html">Extending the If
Component</a></li><li><a
href="meta-programming-page-content.html">Meta-Programming Page
Content</a></li><li><a href="using-select-with-a-list.html">Using Select With
a List</a></li><li><a href="ioc-cookbook.html">IoC cookbook</a><ul
class="childpages-macro"><li><a href="ioc-cookbook-basic-se
rvices-and-injection.html">IoC Cookbook - Basic Services and
Injection</a></li><li><a href="ioc-cookbook-overriding-ioc-services.html">IoC
Cookbook - Overriding IoC Services</a></li><li><a
href="ioc-cookbook-patterns.html">IoC Cookbook - Patterns</a></li><li><a
href="ioc-cookbook-service-configurations.html">IoC cookbook - Service
Configurations</a></li></ul></li><li><a
href="performance-and-clustering.html">Performance and
Clustering</a></li><li><a href="google-app-engine.html">Google App
Engine</a></li></ul></li><li><a
href="frequently-asked-questions.html">Frequently Asked Questions</a><ul
class="childpages-macro"><li><a href="general-questions.html">General
Questions</a></li><li><a href="templating-and-markup-faq.html">Templating and
Markup FAQ</a></li><li><a href="page-and-component-classes-faq.html">Page And
Component Classes FAQ</a></li><li><a
href="forms-and-form-components-faq.html">Forms and Form Components
FAQ</a></li><li><a href="beaneditform-faq.html">BeanEdi
tForm FAQ</a></li><li><a href="link-components-faq.html">Link Components
FAQ</a></li><li><a href="component-events-faq.html">Component Events
FAQ</a></li><li><a href="javascript-faq.html">JavaScript FAQ</a></li><li><a
href="ajax-components-faq.html">Ajax Components FAQ</a></li><li><a
href="injection-faq.html">Injection FAQ</a></li><li><a
href="tapestry-inversion-of-control-faq.html">Tapestry Inversion of Control
FAQ</a></li><li><a href="security-faq.html">Security FAQ</a></li><li><a
href="integration-with-existing-applications.html">Integration with existing
applications</a></li><li><a href="request-processing-faq.html">Request
Processing FAQ</a></li><li><a
href="limitations.html">Limitations</a></li><li><a
href="specific-errors-faq.html">Specific Errors FAQ</a></li><li><a
href="hibernate-support-faq.html">Hibernate Support FAQ</a></li><li><a
href="maven-support-faq.html">Maven Support FAQ</a></li><li><a
href="release-upgrade-faq.html">Release Upgrade FAQ</a></li></ul>
</li><li><a href="release-notes.html">Release Notes</a><ul
class="childpages-macro"><li><a href="how-to-upgrade.html">How to
Upgrade</a></li><li><a href="release-notes-50.html">Release Notes
5.0</a></li><li><a href="release-notes-51.html">Release Notes
5.1</a></li><li><a href="release-notes-52.html">Release Notes 5.2</a><ul
class="childpages-macro"><li><a href="release-notes-520.html">Release Notes
5.2.0</a></li><li><a href="release-notes-521.html">Release Notes
5.2.1</a></li><li><a href="release-notes-522.html">Release Notes
5.2.2</a></li><li><a href="release-notes-523.html">Release Notes
5.2.3</a></li><li><a href="release-notes-524.html">Release Notes
5.2.4</a></li><li><a href="release-notes-525.html">Release Notes
5.2.5</a></li><li><a href="release-notes-526.html">Release Notes
5.2.6</a></li></ul></li><li><a href="release-notes-53.html">Release Notes
5.3</a></li><li><a href="release-notes-531.html">Release Notes
5.3.1</a></li><li><a href="release-notes-532.html">Re
lease Notes 5.3.2</a></li><li><a href="release-notes-533.html">Release Notes
5.3.3</a></li><li><a href="release-notes-534.html">Release Notes
5.3.4</a></li><li><a href="release-notes-535.html">Release Notes
5.3.5</a></li><li><a href="release-notes-536.html">Release Notes
5.3.6</a></li><li><a href="release-notes-537.html">Release Notes
5.3.7</a></li><li><a href="release-notes-538.html">Release Notes
5.3.8</a></li><li><a href="release-notes-54.html">Release Notes
5.4</a></li><li><a href="release-notes-541.html">Release Notes
5.4.1</a></li><li><a href="release-notes-542.html">Release Notes
5.4.2</a></li><li><a href="release-notes-543.html">Release Notes
5.4.3</a></li><li><a href="release-notes-544.html">Release Notes
5.4.4</a></li><li><a href="release-notes-545.html">Release Notes
5.4.5</a></li><li><a href="release-notes-550.html">Release Notes
5.5.0</a></li></ul></li><li><a href="javascript-rewrite-in-54.html">JavaScript
Rewrite in 5.4</a></li><li><a href="support.html"
>Support</a></li><li><a href="developer-information.html">Developer
>Information</a><ul class="childpages-macro"><li><a
>href="building-tapestry-from-source.html">Building Tapestry from
>Source</a></li><li><a href="confluence-site-setup.html">Confluence Site
>Setup</a><ul class="childpages-macro"><li><a
>href="since-and-deprecated-user-macros.html">Since and Deprecated User
>Macros</a></li></ul></li><li><a href="developer-bible.html">Developer
>Bible</a></li><li><a href="release-process.html">Release
>Process</a></li><li><a href="the-tapestry-jail.html">The tapestry
>jail</a></li><li><a href="version-numbers.html">Version
>Numbers</a></li></ul></li></ul></div>
+ <div id="ConfluenceContent"><div
style="float:right;margin-left:1em"><h2 id="Documentation-AllTopics">All
Topics</h2><ul class="childpages-macro"><li><a
href="introduction.html">Introduction</a></li><li><a
href="getting-started.html">Getting Started</a></li><li><a
href="principles.html">Principles</a></li><li><a
href="tapestry-tutorial.html">Tapestry Tutorial</a><ul
class="childpages-macro"><li><a
href="dependencies-tools-and-plugins.html">Dependencies, Tools and
Plugins</a></li><li><a href="creating-the-skeleton-application.html">Creating
The Skeleton Application</a></li><li><a
href="exploring-the-project.html">Exploring the Project</a></li><li><a
href="implementing-the-hi-lo-guessing-game.html">Implementing the Hi-Lo
Guessing Game</a></li><li><a
href="using-beaneditform-to-create-user-forms.html">Using BeanEditForm To
Create User Forms</a></li><li><a
href="using-tapestry-with-hibernate.html">Using Tapestry With
Hibernate</a></li></ul></li><li><a href="us
er-guide.html">User Guide</a><ul class="childpages-macro"><li><a
href="supported-environments-and-versions.html">Supported Environments and
Versions</a></li><li><a href="project-layout.html">Project
Layout</a></li><li><a href="configuration.html">Configuration</a></li><li><a
href="runtime-exceptions.html">Runtime Exceptions</a></li><li><a
href="class-reloading.html">Class Reloading</a></li><li><a
href="component-reference.html">Component Reference</a></li><li><a
href="annotations.html">Annotations</a></li><li><a
href="component-classes.html">Component Classes</a></li><li><a
href="component-templates.html">Component Templates</a></li><li><a
href="property-expressions.html">Property Expressions</a></li><li><a
href="component-parameters.html">Component Parameters</a></li><li><a
href="parameter-type-coercion.html">Parameter Type Coercion</a></li><li><a
href="layout-component.html">Layout Component</a></li><li><a
href="component-mixins.html">Component Mixins</a><ul class="c
hildpages-macro"><li><a href="built-in-mixins.html">Built-in
Mixins</a></li></ul></li><li><a href="page-navigation.html">Page
Navigation</a></li><li><a href="localization.html">Localization</a></li><li><a
href="page-life-cycle.html">Page Life Cycle</a></li><li><a
href="request-processing.html">Request Processing</a></li><li><a
href="component-rendering.html">Component Rendering</a></li><li><a
href="component-events.html">Component Events</a></li><li><a
href="url-rewriting.html">URL rewriting</a></li><li><a
href="dom.html">DOM</a></li><li><a href="response-compression.html">Response
Compression</a></li><li><a href="security.html">Security</a></li><li><a
href="https.html">HTTPS</a></li><li><a
href="content-type-and-markup.html">Content Type and Markup</a></li><li><a
href="persistent-page-data.html">Persistent Page Data</a></li><li><a
href="session-storage.html">Session Storage</a><ul
class="childpages-macro"><li><a href="clustering-issues.html">Clustering
Issues</a></l
i></ul></li><li><a href="injection.html">Injection</a></li><li><a
href="environmental-services.html">Environmental Services</a></li><li><a
href="css.html">CSS</a></li><li><a href="assets.html">Assets</a></li><li><a
href="forms-and-validation.html">Forms and Validation</a></li><li><a
href="beaneditform-guide.html">BeanEditForm Guide</a></li><li><a
href="uploading-files.html">Uploading Files</a></li><li><a
href="logging.html">Logging</a></li><li><a
href="unit-testing-pages-or-components.html">Unit testing pages or
components</a></li><li><a href="integration-testing.html">Integration
Testing</a></li><li><a href="development-dashboard.html">Development
Dashboard</a></li><li><a href="modules.html">Modules</a><ul
class="childpages-macro"><li><a href="built-in-modules.html">Built In
Modules</a></li><li><a href="third-party-modules.html">Third Party
Modules</a></li></ul></li><li><a href="ioc.html">IOC</a><ul
class="childpages-macro"><li><a href="tapestry-ioc-overview.html">T
apestry IoC Overview</a></li><li><a href="tapestry-ioc-modules.html">Tapestry
IoC Modules</a></li><li><a href="defining-tapestry-ioc-services.html">Defining
Tapestry IOC Services</a></li><li><a href="service-advisors.html">Service
Advisors</a></li><li><a href="tapestry-ioc-decorators.html">Tapestry IoC
Decorators</a></li><li><a href="tapestry-ioc-configuration.html">Tapestry IoC
Configuration</a></li><li><a href="case-insensitivity.html">Case
Insensitivity</a></li><li><a href="autoloading-modules.html">Autoloading
Modules</a></li><li><a href="service-implementation-reloading.html">Service
Implementation Reloading</a></li><li><a
href="ordering-by-constraints.html">Ordering by Constraints</a></li><li><a
href="symbols.html">Symbols</a></li><li><a
href="chainbuilder-service.html">ChainBuilder Service</a></li><li><a
href="pipelinebuilder-service.html">PipelineBuilder Service</a></li><li><a
href="shadowbuilder-service.html">ShadowBuilder Service</a></li><li><a
href="strategy
builder-service.html">StrategyBuilder Service</a></li><li><a
href="injection-in-detail.html">Injection in Detail</a></li><li><a
href="object-providers.html">Object Providers</a></li><li><a
href="service-serialization.html">Service Serialization</a></li><li><a
href="type-coercion.html">Type Coercion</a></li><li><a
href="starting-the-ioc-registry.html">Starting the IoC Registry</a></li><li><a
href="registry-startup.html">Registry Startup</a></li><li><a
href="parallel-execution.html">Parallel Execution</a></li><li><a
href="logging-in-tapestry.html">Logging in Tapestry</a></li><li><a
href="using-jsr-330-standard-annotations.html">Using JSR 330 standard
annotations</a></li><li><a href="operation-tracker.html">Operation
Tracker</a></li></ul></li><li><a href="hibernate-core.html">Hibernate -
Core</a><ul class="childpages-macro"><li><a
href="hibernate-core-conf.html">Hibernate - Core - Conf</a></li><li><a
href="hibernate.html">Hibernate</a></li><li><a href="hibernate-user-guid
e.html">Hibernate User Guide</a></li></ul></li><li><a
href="integrating-with-spring-framework.html">Integrating with Spring
Framework</a></li><li><a href="bean-validation.html">Bean
Validation</a></li><li><a href="component-report.html">Component
Report</a></li><li><a href="aliases.html">Aliases</a></li><li><a
href="integrating-with-jpa.html">Integrating with JPA</a></li><li><a
href="client-side-javascript.html">Client-Side JavaScript</a><ul
class="childpages-macro"><li><a href="javascript-modules.html">JavaScript
Modules</a></li><li><a href="coffeescript.html">CoffeeScript</a></li><li><a
href="typescript.html">TypeScript</a></li><li><a
href="legacy-javascript.html">Legacy JavaScript</a></li><li><a
href="ajax-and-zones.html">Ajax and Zones</a></li></ul></li></ul></li><li><a
href="cheat-sheets.html">Cheat Sheets</a><ul class="childpages-macro"><li><a
href="application-module-class-cheat-sheet.html">Application Module Class Cheat
Sheet</a></li><li><a href="component-chea
t-sheet.html">Component Cheat Sheet</a></li><li><a
href="tapestry-for-jsf-users.html">Tapestry for JSF
Users</a></li></ul></li><li><a href="cookbook.html">Cookbook</a><ul
class="childpages-macro"><li><a href="default-parameter.html">Default
Parameter</a></li><li><a href="overriding-exception-reporting.html">Overriding
Exception Reporting</a></li><li><a href="error-page-recipe.html">Error Page
Recipe</a></li><li><a href="supporting-informal-parameters.html">Supporting
Informal Parameters</a></li><li><a href="component-libraries.html">Component
Libraries</a></li><li><a href="switching-cases.html">Switching
Cases</a></li><li><a href="enum-parameter-recipe.html">Enum Parameter
Recipe</a></li><li><a href="extending-the-if-component.html">Extending the If
Component</a></li><li><a
href="meta-programming-page-content.html">Meta-Programming Page
Content</a></li><li><a href="using-select-with-a-list.html">Using Select With
a List</a></li><li><a href="ioc-cookbook.html">IoC cookbo
ok</a><ul class="childpages-macro"><li><a
href="ioc-cookbook-basic-services-and-injection.html">IoC Cookbook - Basic
Services and Injection</a></li><li><a
href="ioc-cookbook-overriding-ioc-services.html">IoC Cookbook - Overriding IoC
Services</a></li><li><a href="ioc-cookbook-patterns.html">IoC Cookbook -
Patterns</a></li><li><a href="ioc-cookbook-service-configurations.html">IoC
cookbook - Service Configurations</a></li></ul></li><li><a
href="performance-and-clustering.html">Performance and
Clustering</a></li><li><a href="google-app-engine.html">Google App
Engine</a></li></ul></li><li><a
href="frequently-asked-questions.html">Frequently Asked Questions</a><ul
class="childpages-macro"><li><a href="general-questions.html">General
Questions</a></li><li><a href="templating-and-markup-faq.html">Templating and
Markup FAQ</a></li><li><a href="page-and-component-classes-faq.html">Page And
Component Classes FAQ</a></li><li><a
href="forms-and-form-components-faq.html">Forms and Fo
rm Components FAQ</a></li><li><a href="beaneditform-faq.html">BeanEditForm
FAQ</a></li><li><a href="link-components-faq.html">Link Components
FAQ</a></li><li><a href="component-events-faq.html">Component Events
FAQ</a></li><li><a href="javascript-faq.html">JavaScript FAQ</a></li><li><a
href="ajax-components-faq.html">Ajax Components FAQ</a></li><li><a
href="injection-faq.html">Injection FAQ</a></li><li><a
href="tapestry-inversion-of-control-faq.html">Tapestry Inversion of Control
FAQ</a></li><li><a href="security-faq.html">Security FAQ</a></li><li><a
href="integration-with-existing-applications.html">Integration with existing
applications</a></li><li><a href="request-processing-faq.html">Request
Processing FAQ</a></li><li><a
href="limitations.html">Limitations</a></li><li><a
href="specific-errors-faq.html">Specific Errors FAQ</a></li><li><a
href="hibernate-support-faq.html">Hibernate Support FAQ</a></li><li><a
href="maven-support-faq.html">Maven Support FAQ</a></li><li
><a href="release-upgrade-faq.html">Release Upgrade
>FAQ</a></li></ul></li><li><a href="release-notes.html">Release Notes</a><ul
>class="childpages-macro"><li><a href="how-to-upgrade.html">How to
>Upgrade</a></li><li><a href="release-notes-50.html">Release Notes
>5.0</a></li><li><a href="release-notes-51.html">Release Notes
>5.1</a></li><li><a href="release-notes-52.html">Release Notes 5.2</a><ul
>class="childpages-macro"><li><a href="release-notes-520.html">Release Notes
>5.2.0</a></li><li><a href="release-notes-521.html">Release Notes
>5.2.1</a></li><li><a href="release-notes-522.html">Release Notes
>5.2.2</a></li><li><a href="release-notes-523.html">Release Notes
>5.2.3</a></li><li><a href="release-notes-524.html">Release Notes
>5.2.4</a></li><li><a href="release-notes-525.html">Release Notes
>5.2.5</a></li><li><a href="release-notes-526.html">Release Notes
>5.2.6</a></li></ul></li><li><a href="release-notes-53.html">Release Notes
>5.3</a></li><li><a href="release-notes-531.html
">Release Notes 5.3.1</a></li><li><a href="release-notes-532.html">Release
Notes 5.3.2</a></li><li><a href="release-notes-533.html">Release Notes
5.3.3</a></li><li><a href="release-notes-534.html">Release Notes
5.3.4</a></li><li><a href="release-notes-535.html">Release Notes
5.3.5</a></li><li><a href="release-notes-536.html">Release Notes
5.3.6</a></li><li><a href="release-notes-537.html">Release Notes
5.3.7</a></li><li><a href="release-notes-538.html">Release Notes
5.3.8</a></li><li><a href="release-notes-54.html">Release Notes
5.4</a></li><li><a href="release-notes-541.html">Release Notes
5.4.1</a></li><li><a href="release-notes-542.html">Release Notes
5.4.2</a></li><li><a href="release-notes-543.html">Release Notes
5.4.3</a></li><li><a href="release-notes-544.html">Release Notes
5.4.4</a></li><li><a href="release-notes-545.html">Release Notes
5.4.5</a></li><li><a href="release-notes-550.html">Release Notes
5.5.0</a></li></ul></li><li><a href="javascript-rewrite-in-
54.html">JavaScript Rewrite in 5.4</a></li><li><a
href="support.html">Support</a></li><li><a
href="developer-information.html">Developer Information</a><ul
class="childpages-macro"><li><a
href="building-tapestry-from-source.html">Building Tapestry from
Source</a></li><li><a href="confluence-site-setup.html">Confluence Site
Setup</a><ul class="childpages-macro"><li><a
href="since-and-deprecated-user-macros.html">Since and Deprecated User
Macros</a></li></ul></li><li><a href="developer-bible.html">Developer
Bible</a></li><li><a href="release-process.html">Release
Process</a></li><li><a href="the-tapestry-jail.html">The tapestry
jail</a></li><li><a href="version-numbers.html">Version
Numbers</a></li></ul></li></ul></div>
<p>Welcome to the Tapestry 5 Documentation, a collection of guides to teach
beginners the basics and help experienced developers deepen their understanding
of Tapestry's power.</p><h1
id="Documentation-Highlights">Highlights</h1><p>These are the most useful
starting points for common needs.</p><div class="table-wrap"><table
class="wrapped confluenceTable"><colgroup span="1"><col span="1"><col
span="1"></colgroup><tbody><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p><a
href="introduction.html">Introduction</a></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>An overview of Tapestry's general approach and
philosophy</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p><a href="getting-started.html">Getting
Started</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>A quick
guide to creating your first Tapestry project, using Maven</p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a
href="tapestry-tutorial.html">Tap
estry Tutorial</a></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>Picks up where <em>Getting Started</em> leaves off,
explaining in greater detail how Tapestry works</p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a href="user-guide.html">User
Guide</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Detailed
articles on every Tapestry feature</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p><a href="community.html">Community</a></p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>Getting support, mailing lists,
JIRA, outside resources, and access to the source</p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a
href="cookbook.html">Cookbook</a></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>Guides to doing common things with
Tapestry</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p><strong><a
href="frequently-asked-questions.html">FAQ</a></strong></p><
/td><td colspan="1" rowspan="1" class="confluenceTd"><p>A quick place to check
for common problems and solutions</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p><a href="component-cheat-sheet.html">Component Cheat
Sheet</a></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>A concise
guide to component classes, methods and annotations</p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://refcardz.dzone.com/refcardz/apache-tapestry-50?oid=hom7948"
rel="nofollow">Refcard</a></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>A color, six page foldout guide to Tapestry 5.0
(PDF)</p></td></tr></tbody></table></div><h1
id="Documentation-APIandComponentReference">API and Component
Reference</h1><div class="table-wrap"><table class="relative-table wrapped
confluenceTable" style="width: 30.0165%;"><colgroup span="1"><col span="1"
style="width: 30.7309%;"><col span="1" style="width: 8.62385%;"><col
span="1" style="width: 8.62385%;"><col span="1" style="width: 8.62385%;"><col
span="1" style="width: 11.9083%;"><col span="1" style="width: 12.6239%;"><col
span="1" style="width: 18.8654%;"></colgroup><tbody><tr><th colspan="1"
rowspan="1" class="confluenceTh"><p>API (Javadoc):</p></th><td colspan="1"
rowspan="1" class="confluenceTd"><p>5.0<sup>1</sup></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>5.1<sup>1</sup></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>5.2<sup>1</sup></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p><a class="external-link"
href="http://tapestry.apache.org/5.3.7/apidocs/">5.3.8</a></p></td><td
colspan="1" rowspan="1" class="confluenceTd"><a class="external-link"
href="http://tapestry.apache.org/5.4">5.4</a></td><td colspan="1" rowspan="1"
class="confluenceTd"><strong><a class="external-link"
href="http://tapestry.apache.org/current/apidocs">5.5</a></strong></td></tr><tr><th
colspan="1" rowspan="1" class="confluenceTh">
<p>Component Reference:</p></th><td colspan="1" rowspan="1"
class="confluenceTd"><p>5.0<sup>1</sup></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>5.1<sup>1</sup></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>5.2<sup>1</sup></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><em><span class="confluence-link">see
5.5</span></em></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><em>see 5.5</em></td><td colspan="1" rowspan="1"
class="confluenceTd"><a href="component-reference.html"><strong>5.5</strong>
(current)</a></td></tr><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Release Notes:</p></th><td colspan="1" rowspan="1"
class="confluenceTd"><p><a href="release-notes-50.html">5.0</a></p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p><a
href="release-notes-51.html">5.1</a></p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><a href="release-notes-52.html">5.2</a></p></td><td
colspan="1" rowspan="1" class="conflue
nceTd"><p><a href="release-notes-538.html">5.3.8</a></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><a
href="release-notes-54.html">5.4</a></td><td colspan="1" rowspan="1"
class="confluenceTd"><strong><a
href="release-notes-550.html">5.5</a></strong></td></tr></tbody></table></div><p><sup>1</sup>
needs to be built manually from archived sources at <a class="external-link"
href="http://archive.apache.org/dist/tapestry/">http://archive.apache.org/dist/tapestry/</a>.</p><h1
id="Documentation-UserGuide">User Guide</h1><p><span
class="confluence-anchor-link" id="Documentation-userguide"></span>The <a
href="user-guide.html">User Guide</a> consists of over 75 pages of detailed
information on the concepts behind Tapestry and instructions on how to use this
powerful tool. Highlights include:</p><ul><li class="confluence-link"><a
href="client-side-javascript.html">Client-Side JavaScript</a> and <a
href="ajax-and-zones.html">Ajax and Zones</a> describe Tapestry's built-in supp
ort for dynamic in-page behavior.</li><li><a
href="integrating-with-spring-framework.html">Integrating with Spring
Framework</a> describes how to integrate Spring into your Tapestry
application.</li><li><a href="hibernate.html">Tapestry/Hibernate Integration
Library</a> provides out-of-the-box support for using Hibernate 3.</li><li><a
href="bean-validation.html">JSR 303: Bean Validation</a> shows how to use
standard annotations for validation</li><li><a
href="integration-testing.html">Integration Testing</a> shows how to test your
application with Selenium.</li></ul><p><a href="user-guide.html">More
topics</a>...</p><h1
id="Documentation-BlogsbyTapestryDevelopersandtheCommunity">Blogs by Tapestry
Developers and the Community</h1><ul><li><a class="external-link"
href="http://tapestryjava.blogspot.com/" rel="nofollow">Tapestry Central</a> is
Howard Lewis Ship's blog. As the creator of Tapestry, he provides valuable
insights into Tapestry's latest features and future directions.<
/li><li><a class="external-link" href="http://blog.tapestry5.de/"
rel="nofollow">Igor Drobiazko's blog</a> (committer & PMC) contains news on
Tapestry development and will guide you through some of the most exciting parts
of Tapestry.</li><li><a class="external-link"
href="http://tawus.wordpress.com/" rel="nofollow">Java Magic</a> (by Taha
Hafeez, committer) has a series of tutorials illustrating some of the more
advanced Tapestry and Plastic features and techniques.</li></ul><h1
id="Documentation-BooksonTapestry">Books on Tapestry</h1><p>There are at least
9 published <a href="books.html">books on Tapestry</a>, including three on
Tapestry 5.</p><h1 id="Documentation-TapestryPresentations">Tapestry
Presentations</h1><ul><li>Mark Shead's <a class="external-link"
href="http://blog.markshead.com/900/tapestry-5-10-minute-demo/"
rel="nofollow">10 Minute Demo</a></li><li>H. L. Ship's <a
class="external-link" href="https://www.youtube.com/watch?v=5BGt7eMFC20"
rel="nofollow">Tapest
ry 5.4 - Bootstrap-enhanced Exception Reporting</a></li><li><a
class="external-link"
href="http://blog.tapestry5.de/wp-content/uploads/2010/06/JSF-2.0-vs-Tapestry-5.pdf"
rel="nofollow">JavaServer Faces 2.0 vs. Tapestry 5</a> (PDF) A Head-to-Head
Comparison by Igor Drobiazko at Jazoon 2010</li><li><a class="external-link"
href="http://www.parleys.com/#st=5&sl=5&id=1700"
rel="nofollow">Tapestry 5: Java power, Scripting Ease</a> (VIDEO) by Howard
Lewis Ship at Devoxx 2009</li></ul><p><a href="presentations.html">More
presentations</a> ...</p><h1 id="Documentation-TapestryWikis">Tapestry
Wikis</h1><ul><li><a class="external-link"
href="http://wiki.apache.org/tapestry/FrontPage">Tapestry Community Wiki</a>
(Moin Moin) contains a lot of user-generated information on different Tapestry
use cases.</li><li><a
href="https://cwiki.apache.org/confluence/x/VCFkAQ">Documentation Source
wiki</a> (Confluence) – the wiki used as the content editor for the
official Tapestry documen
tation</li></ul><h1 id="Documentation-Gettinghelp">Getting help</h1><p>The
primary method of support is the <a href="mailing-lists.html">Tapestry Mailing
Lists</a>.</p><p>In addition, there are occasionally questions and answers
about Tapestry at <a class="external-link"
href="http://stackoverflow.com/questions/tagged/tapestry" rel="nofollow">Stack
Overflow</a>.</p><h1 id="Documentation-TheDeveloperCorner">The Developer
Corner</h1><p><a href="developer-information.html">Developer Information</a>
gives information needed by the Tapestry developers</p><p><br
clear="none"></p></div>
Modified: websites/production/tapestry/content/exploring-the-project.html
==============================================================================
--- websites/production/tapestry/content/exploring-the-project.html (original)
+++ websites/production/tapestry/content/exploring-the-project.html Sun Apr 26
21:22:55 2020
@@ -77,7 +77,7 @@
<div id="content">
<div id="ConfluenceContent"><p>The layout of the project
follows the sensible standards promoted by Maven:</p><ul><li>Java source files
under <code>src/main/java</code></li><li>Web application files under
<code>src/main/webapp</code> (including
<code>src/main/webapp/WEB-INF</code>)</li><li>Java test sources under
<code>src/test/java</code></li><li>Non-code resources (including Tapestry page
and component templates) under <code>src/main/resources</code> and
<code>src/test/resources</code></li></ul><p>Let's look at what Maven has
created from the archetype, starting with the web.xml configuration
file:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>src/main/webapp/WEB-INF/web.xml</b></div><div class="codeContent
panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"><?xml version="1.0" encoding="UTF-8"?>
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml;
gutter: false; theme: Default" data-theme="Default"><?xml version="1.0"
encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
@@ -117,7 +117,7 @@ of where to look for pages, components a
</web-app>
</pre>
</div></div><p>This is short and sweet: you can see that the package name you
provided earlier shows up as the <code>tapestry.app-package</code> context
parameter; the TapestryFilter instance will use this information to locate the
Java classes for pages and components.</p><p>Tapestry operates as a <em>servlet
filter</em> rather than as a traditional <em>servlet</em>. In this way,
Tapestry has a chance to intercept all incoming requests, to determine which
ones apply to Tapestry pages (or other resources). The net effect is that you
don't have to maintain any additional configuration for Tapestry to operate,
regardless of how many pages or components you add to your
application.</p><p>Much of the rest of web.xml is configuration to match
Tapestry execution modes against module classes. An execution mode defines how
the application is being run: the default execution mode is "production", but
the web.xml defines two additional modes: "development" and "qa" (for "Quality
Assurance").
The module classes indicated will be loaded for those execution modes, and can
change the configuration of the application is various ways. We'll come back to
execution modes and module classes later in the tutorial.</p><p>Tapestry pages
minimally consist of an ordinary Java class plus a component template
file.</p><p>In the root of your web application, a page named "Index" will be
used for any request that specifies no additional path after the context
name.</p><h1 id="ExploringtheProject-IndexJavaClass">Index Java
Class</h1><p>Tapestry has very specific rules for where page classes go.
Tapestry adds a sub-package, "pages", to the root application package
("com.example.tutorial1"); the Java classes for pages goes there. Thus the full
Java class name is
<code>com.example.</code>tutorial<code>1.pages.Index</code>.</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeHeader
panelHeader pdl" style="border-bottom-width:
1px;"><b>src/main/java/com/example/tutorial/p
ages/Index.java</b></div><div class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">package com.example.tutorial1.pages;
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default">package
com.example.tutorial1.pages;
import org.apache.tapestry5.Block;
import org.apache.tapestry5.EventContext;
@@ -189,7 +189,7 @@ public class Index
}
</pre>
</div></div><p>There's a bit going on in this listing, as the Index page
attempts to demonstrate a bunch of different ideas in Tapestry. Even so, the
class is essentially pretty simple: Tapestry pages and components have no base
classes to extend, no interfaces to implement, and are just a very pure POJO
(Plain Old Java Object) ... with some special naming conventions and
annotations for fields and methods.</p><p>You do have to meet the Tapestry
framework partway:</p><ul><li>You need to put the Java class in the expected
package, here com.example.tutorial1.pages</li><li>The class must be
public</li><li>You need to make sure there's a public, no-arguments constructor
(here, the Java compiler has silently provided one for us)</li><li>All
non-static fields must be <strong>private</strong></li></ul><p>As we saw when
running the application, the page displays the current date and time, as well
as a couple of extra links. The <code>currentTime</code> property is where that
value comes fro
m; shortly we'll see how that value is referenced in the template, so it can
be extracted from the page and output.</p><p>Tapestry always matches a page
class to a template; neither is functional without the other. In fact,
components within a page are treated the same way (except that components do
not always have templates).</p><p>You will often hear about the <a
class="external-link" href="http://en.wikipedia.org/wiki/Model_view_controller"
rel="nofollow">Model-View-Controller pattern</a> (MVC). In Tapestry, the page
class acts as both the Model (the source of data) and the controller (the logic
that responds to user interaction). The template is the View in MVC. As a
model, the page exposes JavaBeans properties that can be referenced in the
template.</p><p>Let's look at how the component template builds on the Java
class to provide the full user interface.</p><h1
id="ExploringtheProject-ComponentTemplate">Component Template</h1><p>Tapestry
pages are the combination of a POJO Ja
va class with a Tapestry component template. The template has the same name as
the Java class, but has the extension <code>.tml</code>. Since the Java class
here is com.example.tutorial.pages.Index, the template file will be located at
src/main/resource/com/example/tutorial/pages/Index.tml. Ultimately, both the
Java class and the component template file will be stored in the same folder
within the deployed WAR file.</p><p>Tapestry component templates are
well-formed XML documents. This means that you can use any available XML
editor. Templates may even have a DOCTYPE or an XML schema to validate the
structure of the template page.</p><p><em>Note that Tapestry parses component
templates using a non-validating parser; it only checks for well-formedness:
proper syntax, balanced elements, attribute values are quoted, and so forth. It
is reasonable for your build process to perform some kind of template
validation, but Tapestry accepts the template as-is, as long as it parses
cleanly.</e
m></p><p>For the most part, a Tapestry component template looks like ordinary
XHTML:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>src/main/resources/com/example/tutorial1/pages/Index.tml</b></div><div
class="codeContent panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"><html t:type="layout" title="tutorial1 Index"
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml;
gutter: false; theme: Default" data-theme="Default"><html t:type="layout"
title="tutorial1 Index"
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
xmlns:p="tapestry:parameter">
@@ -232,28 +232,28 @@ public class Index
</html></pre>
</div></div><div class="confluence-information-macro
confluence-information-macro-tip"><span class="aui-icon aui-icon-small
aui-iconfont-approve confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>You <strong>do</strong> have to
name your component template file, Index.tml, with the <strong>exact same
case</strong> as the component class name, Index. If you get the case wrong, it
may work on some operating systems (such as Mac OS X, Windows) and not on
others (Linux, and most others). This can be really vexing, as it is common to
develop on Windows and deploy on Linux or Solaris, so be careful about case in
this one area.</p></div></div><p>The goal in Tapestry is for component
templates, such as Index.tml, to look as much as possible like ordinary, static
HTML files. (By static, we mean unchanging, as opposed to a dynamically
generated Tapestry page.)</p><p>In fact, the expectation is that in many cases,
the templates will start as static HTML
files, created by a web developer, and then be <em>instrumented</em> to act
as live Tapestry pages.</p><p>Tapestry hides non-standard elements and
attributes inside XML namespaces. By convention, the prefix "t:" is used for
the primary namespace, but that is not a requirement, any prefix you want to
use is fine.</p><p>This short template demonstrates quite a few features of
Tapestry.</p><div class="confluence-information-macro
confluence-information-macro-warning"><span class="aui-icon aui-icon-small
aui-iconfont-error confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>Part of the concept of the
quickstart archetype is to demonstrate a bunch of different features,
approaches, and common patterns used in Tapestry. So yes, we're hitting you
with a lot all at once.</p></div></div><p>First of all, there are two XML
namespaces commonly defined:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;">
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml;
gutter: false; theme: Default" data-theme="Default">
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd"
xmlns:p="tapestry:parameter"
</pre>
</div></div><p>The first namespace, "t:", it used to identify
Tapestry-specific elements and attributes. Although there is an XSD (that is, a
XML schema definition), it is incomplete (for reasons explained
shortly).</p><p>The second namespace, "p:", is a way of marking a chunk of the
template as a parameter passed into another component. We'll expand on that
shortly.</p><p>A Tapestry component template consists mostly of standard XHTML
that will pass down to the client web browser unchanged. The dynamic aspects of
the template are represented by <em>components</em> and
<em>expansions</em>.</p><h1
id="ExploringtheProject-ExpansionsinTemplates">Expansions in
Templates</h1><p>Let's start with expansions. Expansions are an easy way of
including some dynamic output when rendering the page. By default, an expansion
refers to a JavaBeans property of the page:</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"> <p>The current time is: ${currentTime}</p>
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml;
gutter: false; theme: Default" data-theme="Default"> <p>The current time
is: ${currentTime}</p>
</pre>
</div></div><p>The value inside the curly braces is a <em>property
expression</em>. Tapestry uses its own property expression language that is
expressive, fast, and type-safe.</p><div class="confluence-information-macro
confluence-information-macro-note"><span class="aui-icon aui-icon-small
aui-iconfont-warning confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><pre>Tapestry does NOT use reflection
to implement property expressions.</pre></div></div><p>More advanced property
expressions can traverse multiple properties (for example,
<code>user.address.city</code>), or even invoke public methods. Here the
expansion simply reads the <code>currentTime</code> property of the
page.</p><p>Tapestry follows the rules defined by Sun's JavaBeans
specification: a property name of <code>currentTime</code> maps to two methods:
<code>getCurrentTime()</code> and <code>setCurrentTime()</code>. If you omit
one or the other of these methods, the property is eithe
r read only (as here), or write only. (Keep in mind that as far as JavaBeans
properties go, it's the <em>methods</em> that count; the names of the instance
variables, or even whether they exist, is immaterial.)</p><p>Tapestry does go
one step further: it ignores case when matching properties inside the expansion
to properties of the page. In the template we could say ${currenttime} or
${CurrentTime} or any variation, and Tapestry will <em>still</em> invoke the
<code>getCurrentTime()</code> method.</p><p>Note that in Tapestry it is not
necessary to configure what object holds the <code>currentTime</code> property;
a template and a page are always used in combination with each other;
expressions are always rooted in the page instance, in this case, an instance
of the Index class.</p><p>The Index.tml template includes a second
expansion:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"> <p>${message:greeting}</p>
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml;
gutter: false; theme: Default" data-theme="Default">
<p>${message:greeting}</p>
</pre>
</div></div><p>Here <code>greeting</code> is not a property of the page; its
actually a localized message key. Every Tapestry page and component is allowed
to have its own message catalog. (There's also a global message catalog,
<em>which we'll describe later</em>.)</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width:
1px;"><b>src/main/resources/com/example/tutorial/pages/Index.properties</b></div><div
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">greeting=Welcome to Tapestry 5! We hope that this
project template will get you going in style.
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default">greeting=Welcome to
Tapestry 5! We hope that this project template will get you going in style.
</pre>
</div></div><p>Message catalogs are useful for storing repeating strings
outside of code or templates, though their primary purpose is related to
localization of the application (which will be described in more detail in a
later chapter). Messages that may be used across multiple pages can be stored
in the application's global message catalog,
src/main/webapp/WEB-INF/app.properties, instead.</p><p>This "message:" prefix
is not some special case; there are actually quite a few of these <em>binding
prefixes</em> built into Tapestry, each having a specific purpose. In fact,
omitting a binding prefix in an expansion is exactly the same as using the
"prop:" binding prefix, which means to treat the binding as a property
expression.</p><p>Expansions are useful for extracting a piece of information
and rendering it out to the client as a string, but the real heavy lifting of
Tapestry occurs inside components.</p><h1
id="ExploringtheProject-ComponentsInsideTemplates">Components Inside Templa
tes</h1><p>Components can be represented inside a component template in two
ways:</p><ul><li>As an ordinary element, but with a t:type attribute to define
the type of component.</li></ul><ul><li>As an element in the Tapestry
namespace, in which case the element name determines the type.</li></ul><p>Here
we've used an <html> element to represent the application's Layout
component.</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"><html t:type="layout" ...>
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml;
gutter: false; theme: Default" data-theme="Default"><html t:type="layout"
...>
...
</html>
</pre>
</div></div><p>But for the EventLink component, we've used an element in the
Tapestry namespace:</p><div class="code panel pdl" style="border-width:
1px;"><div class="codeContent panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"><t:eventlink page="Index">refresh
page</t:eventlink>
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml;
gutter: false; theme: Default" data-theme="Default"><t:eventlink
page="Index">refresh page</t:eventlink>
</pre>
</div></div><p>Which form you select is a matter of choice. In the vast
majority of cases, they are exactly equivalent.</p><p>As elsewhere, case is
ignored. Here the types ("layout" and "eventlink") were in all lower case; the
actual class names are Layout and EventLink. Further, Tapestry "blends" the
core library components in with the components defined by this application;
thus type "layout" is mapped to application component class
com.example.tutorial.components.Layout, but "eventlink" is mapped to Tapestry's
built-in org.apache.tapestry5.corelib.components.EventLink
class.</p><p>Tapestry components are configured using parameters; for each
component, there is a set of parameters, each with a specific type and purpose.
Some parameters are required, others are optional. Attributes of the element
are used to <em>bind</em> parameters to specific literal values, or to page
properties. Tapestry is flexible here as well; you can always place an
attribute in the Tapestry namespace (usi
ng the "t:" prefix), but in most cases, this is unnecessary.</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"><html t:type="layout" title="tutorial1 Index"
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml;
gutter: false; theme: Default" data-theme="Default"><html t:type="layout"
title="tutorial1 Index"
p:sidebarTitle="Framework Version" ...
</pre>
</div></div><p>This binds two parameters, <code>title</code> and
<code>sidebarTitle</code>, of the Layout component to the literal strings
"tutorial1 Index" and "Framework Version", respectively.</p><p>The Layout
component will actually provide the bulk of the HTML ultimately sent to the
browser; we'll look at its template in a later chapter. The point is, the
page's template is integrated into the Layout component's template. The
following diagram shows how parameters passed to the Layout component end up
rendered in the final page:</p><p>
@@ -261,21 +261,21 @@ public class Index
-<span class="gliffy-container" id="gliffy-container-24346949-8953"
data-fullwidth="913" data-ceoid="24188263"
data-edit="${diagramEditLink.getLinkUrl()}"
data-full="${diagramZoomLink.getLinkUrl()}" data-filename="Templates and
Parameters">
+<span class="gliffy-container" id="gliffy-container-24346949-4330"
data-fullwidth="913" data-ceoid="24188263"
data-edit="${diagramEditLink.getLinkUrl()}"
data-full="${diagramZoomLink.getLinkUrl()}" data-filename="Templates and
Parameters">
- <map id="gliffy-map-24346949-504" name="gliffy-map-24346949-504"></map>
+ <map id="gliffy-map-24346949-5749" name="gliffy-map-24346949-5749"></map>
- <img class="gliffy-image gliffy-image-border"
id="gliffy-image-24346949-8953" width="304" height="300" data-full-width="913"
data-full-height="901"
src="https://cwiki.apache.org/confluence/download/attachments/24188263/Templates%20and%20Parameters.png?version=2&modificationDate=1371888025000&api=v2"
alt="Templates and Parameters" usemap="#gliffy-map-24346949-504">
+ <img class="gliffy-image gliffy-image-border"
id="gliffy-image-24346949-4330" width="304" height="300" data-full-width="913"
data-full-height="901"
src="https://cwiki.apache.org/confluence/download/attachments/24188263/Templates%20and%20Parameters.png?version=2&modificationDate=1371888025000&api=v2"
alt="Templates and Parameters" usemap="#gliffy-map-24346949-5749">
- <map class="gliffy-dynamic" id="gliffy-dynamic-map-24346949-8953"
name="gliffy-dynamic-map-24346949-8953"></map>
+ <map class="gliffy-dynamic" id="gliffy-dynamic-map-24346949-4330"
name="gliffy-dynamic-map-24346949-4330"></map>
</span>
</p><p>The interesting point here (and this is an advanced concept in
Tapestry, one we'll return to later) is that we can pass a chunk of the
Index.tml template to the Layout component as the <code>sidebar</code>
parameter. That's what the tapestry:parameter namespace (the "p:" prefix) is
for; the element name is matched against a parameter of the component and the
entire block of the template is passed into the Layout component ... which
decides where, inside <em>its</em> template, that block gets rendered.</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
-<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"><t:eventlink event="complete" class="btn
btn-default">Complete&raquo;</t:eventlink>
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml;
gutter: false; theme: Default" data-theme="Default"><t:eventlink
event="complete" class="btn
btn-default">Complete&raquo;</t:eventlink>
</pre>
</div></div><p>This time, it's the <code>page</code> parameter of the PageLink
component that is bound, to the literal value "Index" (which is the name of
this page). This gets rendered as a URL that re-renders the page, which is how
the current time gets updated. You can also create links to other pages in the
application and, as we'll see in later chapters, attach additional information
to the URL beyond just the page name.</p><h1
id="ExploringtheProject-AMagicTrick">A Magic Trick</h1><p>Now it's time for a
magic trick. Edit Index.java and change the <code>getCurrentTime()</code>
method to:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>Index.java (partial)</b></div><div class="codeContent panelContent
pdl">
-<pre class="brush: xml; gutter: false; theme: Default"
style="font-size:12px;"> public String getCurrentTime()
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: xml;
gutter: false; theme: Default" data-theme="Default"> public String
getCurrentTime()
{
return "A great day to learn Tapestry";
}
Added: websites/production/tapestry/content/footerv2.html
==============================================================================
--- websites/production/tapestry/content/footerv2.html (added)
+++ websites/production/tapestry/content/footerv2.html Sun Apr 26 21:22:55 2020
@@ -0,0 +1,140 @@
+<!DOCTYPE html>
+
+ <!--
+
+ 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.
+-->
+<html>
+<head>
+ <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
+ <meta http-equiv="x-ua-compatible" content="IE=9">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>
+ FooterV2 -- Apache Tapestry
+ </title>
+ <link type="text/css" rel="stylesheet" href="/resources/space.css" />
+
+
+ <link href="/styles/style.css" rel="stylesheet" type="text/css"/>
+
+</head>
+
+<body>
+
+ <div class="wrapper bs">
+
+ <div id="navigation"><div class="nav"><ul class="alternate"><li><a
href="index.html">Home</a></li><li><a href="getting-started.html">Getting
Started</a></li><li><a href="documentation.html">Documentation</a></li><li><a
href="download.html">Download</a></li><li><a
href="about.html">About</a></li><li><a class="external-link"
href="http://www.apache.org/licenses/LICENSE-2.0">License</a></li><li><a
href="community.html">Community</a></li><li><a class="external-link"
href="http://www.apache.org/security/">Security</a></li><li><a
class="external-link" href="http://www.apache.org/">Apache</a></li><li><a
class="external-link"
href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a
class="external-link"
href="http://www.apache.org/foundation/thanks.html">Thanks</a></li></ul></div>
+
+</div>
+
+ <div id="top">
+ <div id="smallbanner"><div class="searchbox"
style="float:right;margin: .3em 1em .1em 1em"><span style="color: #999;
font-size: 90%">Tapestry docs, issues, wikis & blogs:</span>
+<form enctype="application/x-www-form-urlencoded" method="get"
action="https://tapestry.apache.org/search.html">
+ <input type="text" name="q">
+ <input type="submit" value="Search">
+</form>
+
+</div>
+
+
+<div class="emblem" style="float:left"><p><span
class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image
confluence-external-resource"
src="https://tapestry.apache.org/images/tapestry_small.png"
data-image-src="https://tapestry.apache.org/images/tapestry_small.png"></span></p></div>
+
+
+<div class="title" style="float:left; margin: 0 0 0 3em"><h1
id="SmallBanner-PageTitle">FooterV2</h1></div>
+
+</div>
+ <div class="clearer"></div>
+ </div>
+
+ <div class="clearer"></div>
+
+ <div id="breadcrumbs">
+ <a href="index.html">Apache Tapestry</a> > <a
href="index.html">Index</a> > <a href="footerv2.html">FooterV2</a>
+ <a class="edit" title="Edit this page (requires approval -- just ask
on the mailing list)"
href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=152112579">edit</a>
+ </div>
+
+ <div id="content">
+ <div id="ConfluenceContent"><p><footer class="py-3">
+ <div class="container-fluid">
+ <div class="container">
+ <div class="row">
+ <div class="col-4 col-lg-2">
+ <span class="font-weight-bold">Apache Tapestry</span>
+ <ul><li><a href="index.html">Home</a></li><li><a
href="download.html">Download</a></li><li><a
href="about.html">Team</a></li><li><a
href="https://www.apache.org/licenses/LICENSE-2.0">License</a></li></ul>
+ <span class="font-weight-bold">Documentation</span>
+ <ul><li><a href="introduction.html">Introduction</a></li><li><a
href="principles.html">Principles</a></li><li><i class="fas fa-play"></i> <a
href="getting-started.html">Getting Started</a></li><li><i class="fas
fa-play"></i> <a href="user-guide.html">User Guide</a></li><li><i class="fas
fa-book"></i> <a href="documentation.html">Docs</a></li><li><i class="fas
fa-book"></i> <a href="component-reference.html">Component
Reference</a></li><li><i class="fas fa-book"></i> <a
href="current/apidocs">Apidocs</a></li><li><a
href="frequently-asked-questions.html">FAQ</a></li></ul>
+ </div>
+ <div class="col-4 col-lg-2">
+ <span class="font-weight-bold">Community</span>
+ <ul><li><i class="fas fa-envelope-open-text"></i> <a
href="community.html">Mailing Lists</a></li><li><i class="fab
fa-stack-overflow"> </i> <a
href="https://stackoverflow.com/questions/tagged/tapestry">StackOverflow</a></li><li><a
href="support.html">Support</a></li><li><a href="community.html">Getting
Involved</a></li><li><a
href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=$page.id"
title="Edit this page (requires approval, just ask on the mailing list)">Edit
this page</a></li></ul>
+ <span class="font-weight-bold">Social</span>
+ <ul><li><i class="fab fa-twitter"></i> <a
href="https://twitter.com/ApacheTapestry">@ApacheTapestry</a></li><li><i
class="fas fa-hashtag"></i> <a
href="https://twitter.com/hashtag/tapestry5">#tapestry5</a></li></ul>
+ <span class="font-weight-bold">Development</span>
+ <ul><li><i class="fab fa-git"></i> <a
href="https://gitbox.apache.org/repos/asf?p=tapestry-5.git">Source
Code</a></li><li><i class="fab fa-jira"></i> <a
href="https://issues.apache.org/jira/browse/TAP5">Issues</a></li></ul>
+ </div>
+ <div class="col-4 col-lg-2">
+ <span class="font-weight-bold">Apache</span>
+ <ul><li><a href="https://www.apache.org/">About
Apache</a></li><li><a
href="https://apachecon.com/?ref=royale.apache.org">Events</a></li><li><a
href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a
href="https://www.apache.org/licenses/LICENSE-2.0">License</a></li><li><a
href="https://www.apache.org/security/">Security</a></li><li><a
href="https://www.apache.org/foundation/thanks.html">Thanks!</a></li></ul>
+ </div>
+ <div class="col-md-12 col-lg-6 clearfix">
+ <span class="font-weight-bold d-block">About us</span>
+ <p class="float-right ml-3 mb-0"><img
src="images/apache-tapestry-icon-light.svg" width="100" alt="Apache Tapestry"
title="Apache Tapestry"></p>
+ <p><a href="https://tapestry.apache.org/">Apache
Tapestry™</a> is a open-source component-oriented framework for creating
dynamic, robust, highly scalable web applications in Java.</p>
+ <p>Tapestry complements and builds upon the standard Java Servlet
API, and so it works in any servlet container or application server.</p>
+ <p class="float-right ml-3 mb-0"><img
src="images/apache-powered-by.svg" width="100" alt="Apache PoweredBy"
title="Apache PoweredBy"></p>
+ <p><a href="https://tapestry.apache.org/">Apache
Tapestry™</a>, <a href="https://www.apache.org/">Apache™</a> and
the <a href="https://www.apache.org/foundation/press/kit/">Apache feather
logo™</a>
+ are trademarks of The Apache Software Foundation. All other marks
mentioned may be trademarks or registered trademarks of their respective
owners.</p>
+ </div></div></div></div></footer></p>
+ </div>
+
+ <div class="row">
+ <div class="col-12">
+ Copyright © 2020 The Apache Software Foundation, Licensed under
the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License,
Version 2.0</a>.
+ </div>
+ </div>
+
+
+<br clear="none">
+ </div>
+
+ <div class="clearer"></div>
+
+ <div id="footer">
+ <div id="footer"><p>Apache Tapestry, Tapestry, Apache, the Apache
feather logo, and the Apache Tapestry project logo are trademarks of The Apache
Software Foundation.<br clear="none">
+</p><p><script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-400821-1']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript';
ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' :
'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga, s);
+ })();
+</script></p><p></p></div>
+ </div>
+
+ <div id="comments_thread"></div>
+ <script type="text/javascript"
src="https://comments.apache.org/show_comments.lua?site=tapestry&page=http://tapestry.apache.org/footerv2.html"
async="true">
+ </script>
+ <noscript>
+ <iframe width="100%" height="500"
src="https://comments.apache.org/iframe.lua?site=tapestry&page=http://tapestry.apache.org/footerv2.html"></iframe>
+ </noscript>
+
+ </div>
+
+</body>
+</html>
Modified:
websites/production/tapestry/content/forms-and-form-components-faq.html
==============================================================================
--- websites/production/tapestry/content/forms-and-form-components-faq.html
(original)
+++ websites/production/tapestry/content/forms-and-form-components-faq.html Sun
Apr 26 21:22:55 2020
@@ -78,11 +78,11 @@
<div id="content">
<div id="ConfluenceContent"><h1
id="FormsandFormComponentsFAQ-FormsandFormComponents">Forms and Form
Components</h1><p>Main article: <a href="forms-and-validation.html">Forms and
Validation</a></p><h2
id="FormsandFormComponentsFAQ-Contents">Contents</h2><p><style
type="text/css">/*<![CDATA[*/
-div.rbtoc1587536393779 {padding: 0px;}
-div.rbtoc1587536393779 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1587536393779 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1587935966276 {padding: 0px;}
+div.rbtoc1587935966276 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1587935966276 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1587536393779">
+/*]]>*/</style></p><div class="toc-macro rbtoc1587935966276">
<ul class="toc-indentation"><li><a
href="#FormsandFormComponentsFAQ-Whatisthet:formdatahiddenfieldfor?">What is
the t:formdata hidden field for?</a></li><li><a
href="#FormsandFormComponentsFAQ-HowdoIchangethelabelforafieldonthefly?">How do
I change the label for a field on the fly?</a></li><li><a
href="#FormsandFormComponentsFAQ-Tapestryfocusesonthewrongfieldinmyform,howdoIfixthat?">Tapestry
focuses on the wrong field in my form, how do I fix that?</a></li></ul>
</div><h2
id="FormsandFormComponentsFAQ-Whatisthet:formdatahiddenfieldfor?">What is the
<code>t:formdata</code> hidden field for?</h2><p>In Tapestry, rendering a form
can be a complicated process; inside the body of the Form component are many of
field components: TextField, Select, TextArea, and so forth. Each of these must
pull data out of your data model and convert it to the string form used inside
the client web browser. In addition, JavaScript to support client-side
validation must be generated. This can be further complicated by the use of
Loop and If components, or made really complicated by the use of Block (to
render portions of other pages: this is what the BeanEditForm component
does).</p><p>Along the way, the Form is generating unique form control names
for each field component, as it renders.</p><p>When the client-side Form is
submitted, an event is triggered on the server-side Form component. It now
needs to locate each component, in turn, inform the component of its
control name, and allow the component to read the corresponding query
parameter. The component then converts the client-side string back into a
server-side value and performs validations before updating the data
model.</p><p>That's where <code>t:formdata</code> comes in. While components
are rendering, they are using the FormSupport environmental object to record
callbacks:</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>FormSupport.java (partial)</b></div><div class="codeContent
panelContent pdl">
<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: true; theme: Default" data-theme="Default">public interface FormSupport
extends ClientElement
Modified: websites/production/tapestry/content/forms-and-validation.html
==============================================================================
--- websites/production/tapestry/content/forms-and-validation.html (original)
+++ websites/production/tapestry/content/forms-and-validation.html Sun Apr 26
21:22:55 2020
@@ -122,11 +122,11 @@
<p><br clear="none"></p><p>Tapestry provides support for creating and
rendering forms, populating their fields, and validating user input. For simple
cases, input validation is declarative, meaning you simply tell Tapestry what
validations to apply to a given field, and it takes care of it on the server
and (optionally) on the client as well. In addition, you can provide event
handler methods in your page or component classes to handle more complex
validation scenarios.</p><p>Finally, Tapestry not only makes it easy to present
errors messages to the user, but it can also automatically highlight form
fields when validation fails.</p><p><strong>Contents</strong></p><p><style
type="text/css">/*<![CDATA[*/
-div.rbtoc1587536386205 {padding: 0px;}
-div.rbtoc1587536386205 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1587536386205 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1587936090741 {padding: 0px;}
+div.rbtoc1587936090741 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1587936090741 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1587536386205">
+/*]]>*/</style></p><div class="toc-macro rbtoc1587936090741">
<ul class="toc-indentation"><li>Related Articles</li></ul>
<ul><li><a href="#FormsandValidation-TheFormComponent">The Form Component</a>
<ul class="toc-indentation"><li><a href="#FormsandValidation-FormEvents">Form
Events</a></li><li><a href="#FormsandValidation-HandlingEvents">Handling
Events</a></li><li><a
href="#FormsandValidation-TrackingValidationErrors">Tracking Validation
Errors</a></li><li><a
href="#FormsandValidation-StoringDataBetweenRequests">Storing Data Between
Requests</a></li><li><a
href="#FormsandValidation-ConfiguringFieldsandLabels">Configuring Fields and
Labels</a></li></ul>
Modified: websites/production/tapestry/content/general-questions.html
==============================================================================
--- websites/production/tapestry/content/general-questions.html (original)
+++ websites/production/tapestry/content/general-questions.html Sun Apr 26
21:22:55 2020
@@ -78,11 +78,11 @@
<div id="content">
<div id="ConfluenceContent"><h1
id="GeneralQuestions-GeneralQuestions">General Questions</h1><h2
id="GeneralQuestions-Contents">Contents</h2><p><style
type="text/css">/*<![CDATA[*/
-div.rbtoc1587536388792 {padding: 0px;}
-div.rbtoc1587536388792 ul {list-style: disc;margin-left: 0px;}
-div.rbtoc1587536388792 li {margin-left: 0px;padding-left: 0px;}
+div.rbtoc1587936065730 {padding: 0px;}
+div.rbtoc1587936065730 ul {list-style: disc;margin-left: 0px;}
+div.rbtoc1587936065730 li {margin-left: 0px;padding-left: 0px;}
-/*]]>*/</style></p><div class="toc-macro rbtoc1587536388792">
+/*]]>*/</style></p><div class="toc-macro rbtoc1587936065730">
<ul class="toc-indentation"><li><a
href="#GeneralQuestions-HowdoIgetstartedwithTapestry?">How do I get started
with Tapestry?</a></li><li><a
href="#GeneralQuestions-WhydoesTapestryusePrototype(inversionsbefore5.4)?WhynotinsertfavoriteJavaScriptlibraryhere?">Why
does Tapestry use Prototype (in versions before 5.4)? Why not insert favorite
JavaScript library here?</a></li><li><a
href="#GeneralQuestions-WhydoesTapestryhaveitsownInversionofControlContainer?WhynotSpringorGuice?">Why
does Tapestry have its own Inversion of Control Container? Why not Spring or
Guice?</a></li><li><a
href="#GeneralQuestions-HowdoIupgradefromTapestry4toTapestry5?">How do I
upgrade from Tapestry 4 to Tapestry 5?</a></li><li><a
href="#GeneralQuestions-HowdoIupgradefromoneversionofTapestry5toanother?">How
do I upgrade from one version of Tapestry 5 to another?</a></li><li><a
href="#GeneralQuestions-WhyaretherebothRequestandHttpServletRequest?">Why are
there both Request and HttpServletRequest?</a></li></ul
>
</div><h2 id="GeneralQuestions-HowdoIgetstartedwithTapestry?">How do I get
started with Tapestry?</h2><p class="confluence-link">The easiest way to get
started is to use <a class="external-link"
href="http://maven.apache.org">Apache Maven</a> to create your initial project;
Maven can use an <em>archetype</em> (a kind of project template) to create a
bare-bones Tapestry application for you. See the <a
href="getting-started.html">Getting Started</a> page for more
details.</p><p>Even without Maven, Tapestry is quite easy to set up. You just
need to <a href="general-questions.html">download</a> the binaries and setup
your build to place them inside your WAR's WEB-INF/lib folder. The rest is just
some one-time <a href="configuration.html">configuration of the web.xml
deployment descriptor</a>.</p><h2
id="GeneralQuestions-WhydoesTapestryusePrototype(inversionsbefore5.4)?WhynotinsertfavoriteJavaScriptlibraryhere?">Why
does Tapestry use Prototype (in versions before 5.4)? Why not <
em>insert favorite JavaScript library here</em>?</h2><p>An important goal for
Tapestry is seamless DHTML and Ajax integration. To serve that goal, it was
important that the built in components be capable of Ajax operations, such as
dynamically re-rendering parts of the page. Because of that, it made sense to
bundle a well-known JavaScript library as part of Tapestry.</p><p>At the time
(this would be 2006-ish), Prototype and Scriptaculous were well known and well
documented, whereas jQuery was just getting started.</p><p>The intent has
always been to make this aspect of Tapestry pluggable. Tapestry 5.4 includes
the option of either Prototype or jQuery, and future versions of Tapestry will
likely remove Prototype as an option..</p><h2
id="GeneralQuestions-WhydoesTapestryhaveitsownInversionofControlContainer?WhynotSpringorGuice?">Why
does Tapestry have its own Inversion of Control Container? Why not Spring or
Guice?</h2><p>An Inversion of Control Container is <em>the</em> key piece of
Tapestry's infrastructure. It is absolutely necessary to create software as
robust, performant and extensible as Tapestry.</p><p>Tapestry IoC includes a
number of features that distinguish itself from other
containers:</p><ul><li>Configured in code, not XML</li><li>Built-in extension
mechanism for services: configurations and contributions</li><li>Built-in
aspect oriented programming model (service decorations and advice)</li><li>Easy
modularization</li><li>Best-of-breed exception reporting</li></ul><p>Because
Tapestry is implemented on top of its IoC container, and because the container
makes it easy to extend or replace any service inside the container, it is
possible to make the small changes to Tapestry needed to customize it to any
project's needs.</p><p>In addition – and this is critical –
Tapestry allows 3rd party libraries to be built that fully participate in the
configurability of Tapestry itself. This means that such libraries can be
configured the same w
ay Tapestry itself is configured, and such libraries can also configure
Tapestry itself. This <em>distributed configuration</em> requires an IOC
container that fully supports such configurability.</p><h2
id="GeneralQuestions-HowdoIupgradefromTapestry4toTapestry5?">How do I upgrade
from Tapestry 4 to Tapestry 5?</h2><p>There is no existing tool that supports
upgrading from Tapestry 4 to Tapestry 5; Tapestry 5 is a complete
rewrite.</p><p>Many of the basic concepts in Tapestry 4 are still present in
Tapestry 5, but refactored, improved, streamlined, and simplified. The basic
concept of pages, templates and components are largely the same. Other aspects,
such as server-side event handling, is markedly different.</p><p>Tapestry 5 is
designed so that it can live side-by-side in the same servlet as a Tapestry 4
app, without package namespace conflicts, sharing session data and common
resources such as images and CSS. This means that you can gradually migrate a
Tapestry 4 app to Tapestry 5
one page (or one portion of the app) at a time.</p><h2
id="GeneralQuestions-HowdoIupgradefromoneversionofTapestry5toanother?">How do I
upgrade from one version of Tapestry 5 to another?</h2><p>Main Article: <a
href="how-to-upgrade.html">How to Upgrade</a>.</p><p>A lot of effort goes into
making an upgrade from one Tapestry 5 release to another go smoothly. In the
general case, it is just a matter of updating the version number in your Maven
<code>build.xml</code> or Gradle <code>build.gradle</code> file and executing
the appropriate commands (e.g., <code>gradle idea</code> or <code>mvn
eclipse:eclipse</code>) to bring your local workspace up to date with the
latest binaries.</p><p>After changing dependencies, you should always perform a
clean recompile of your application.</p><p>We make every effort to ensure
backwards-compatibility. Tapestry is mostly coded in terms of interfaces; those
interfaces are stable to a point: interfaces your code is expected to implement
are usually co
mpletely frozen; interfaces your code is expected to invoke, such as the
interfaces to IoC services, are stable, but may have new methods added in a
release; existing methods are not changed.</p><p>In <em>rare</em> cases a
choice is necessary between fixing bugs (or adding essential functionality) and
maintaining complete backwards compatibility; in those cases, an incompatible
change may be introduced. These are always discussed in detail in the <a
href="release-notes.html">Release Notes</a> for the specific release. You
should always read the release notes before attempting an upgrade, and always
(really, <em>always</em>) be prepared to retest your application
afterwards.</p><p>Note that you should be careful any time you make use of
<strong>internal</strong> APIs (you can tell an API is internal by the package
name, <code>org.apache.tapestry5.internal). </code>Internal APIs may change
<em>at any time</em>; there's no guarantee of backwards compatibility. Please
always check
on the documentation, or consult the user mailing list, to see if there's a
stable, public alternative. If you do make use of internal APIs, be sure to get
a discussion going so that your needs can be met in the future by a stable,
public API.</p><h2
id="GeneralQuestions-WhyaretherebothRequestandHttpServletRequest?"><span
style="color: rgb(83,145,38);">Why are there both Request and
HttpServletRequest?</span></h2><p>Tapestry's Request interface is <em>very</em>
close to the standard HttpServletRequest interface. It differs in a few ways,
omitting some unneeded methods, and adding a couple of new methods (such as
<code>isXHR()</code>), as well as changing how some existing methods operate.
For example, <code>getParameterNames()</code> returns a sorted List of Strings;
HttpServletRequest returns an Enumeration, which is a very dated
approach.</p><p>However, the stronger reason for Request (and the related
interfaces Response and Session) is to enable the support for Portlets at some
point in the future. By writing code in terms of Tapestry's Request, and not
HttpServletRequest, you can be assured that the same code will operate in both
Servlet Tapestry and Portlet Tapestry.</p></div>
</div>
Modified: websites/production/tapestry/content/google-app-engine.html
==============================================================================
--- websites/production/tapestry/content/google-app-engine.html (original)
+++ websites/production/tapestry/content/google-app-engine.html Sun Apr 26
21:22:55 2020
@@ -76,7 +76,7 @@
<div id="content">
<div id="ConfluenceContent"><p>Tapestry apps should run fine
on Google App Engine (GAE) if you follow certain important steps.</p><h2
id="GoogleAppEngine-RequiredConfigurationSettings">Required Configuration
Settings</h2><ul><li><p>Set <code>tapestry.production-mode</code> to true (to
turn off live class reloading, among other things)</p></li><li><p>Set the
<code>tapestry.restrictive-environment</code> configuration symbol to true (to
prevent Tapestry from writing exception reports and cached resources to the
file system)</p></li><li><p>Set the <code>tapestry.thread-pool-enabled</code>
configuration symbol to false (to prevent Tapestry's PeriodicExecutor from
attempting to spawn threads)</p></li></ul><h3
id="GoogleAppEngine-Exampleconfiguration">Example configuration</h3><p>Your
application's module class (generally AppModule.java) can set these symbols
where it sets others (either in a method named contributeApplicationDefaults or
one annotated with @Applicatio
nDefaults and @Contribute), as shown below.</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>AppModule (partial)</b></div><div
class="codeContent panelContent pdl">
-<pre class="brush: java; gutter: false; theme: Default"
style="font-size:12px;">     @ApplicationDefaults
+<pre class="syntaxhighlighter-pre" data-syntaxhighlighter-params="brush: java;
gutter: false; theme: Default" data-theme="Default">    
@ApplicationDefaults
     @Contribute(SymbolProvider.class)
     public static void configureMyApp(
        MappedConfiguration<String,
String> configuration)