Under Tapestry, it is common to define new components by combining existing components. The existing components are embedded in the containing component. This is always true at the top level; Pages, which are still Tapestry components, always embed other Tapestry components.
Each embedded component has an id
(an identifying string)
that must be unique within the containing component.
Every non-page component is embedded inside some other
component forming a hierarchy that can get quite deep
(in real Tapestry applications, some pages have components nested three to five levels deep).
In some cases, a component will be referenced by its id path. This is a series of component ids separated by periods, representing a path from the page to a specific component. The same notation as a property path is used, but the information being represented is quite different.
For example, the id path border.navbar.homeLink
represents the component named homeLink
,
embedded inside a component named navbar
,
embedded inside a component named border
, embedded inside some page.
Tapestry components are "black boxes". They have a set of parameters that may be bound, but their internals, how they are implemented, are not revealed.
Primitive components may not embed other components, or even have a template. Nearly all the built-in components are primitive; they are building blocks for constructing more complex components.
Alternately, a component may be implemented using a template and embedded components. In either case, the names, types or very existence of embedded components is private, hidden inside the containing component's "black box".