Page And Component ClassesPage edited by Howard M. Lewis ShipChanges (6)
Full ContentPage And Component ClassesWhat's the difference between a page and a component?There's very little difference between the two. Pages clases must be in the root-package.pages package; components must be in the Other than that, they are more equal than they are different. They may have templates or may render themselves in code (pages usually have a template, components are more likely to render only in code). The major difference is that Tapestry page templates may be stored in the web context directory, as if they were static files (they can't be accessed from the client however; a specific rule prevents access to files with the .tml extension).
How do I store my page classes in a different package?Tapestry is very rigid here; you can't. Page classes must go in root-package.pages, component classes in root-package.components, etc. You are allowed to create sub-packages, to help organize your code better and more logically. For example, you might have _root-package.pages.account.ViewAccount, which would have the page name "account/viewaccount" 1 In addition, it is possible to define additional root packages for the application: public static void contributeComponentClassResolver(Configuration<LibraryMapping> configuration) { configuration.add(new LibraryMapping("", "com.example.app.tasks")); configuration.add(new LibraryMapping("", "com.example.app.chat")); }
In a Tapestry application, most application classes are loaded from the middle class loader. Additional class loaders are used When a page or component is passed as a parameter to a service, a failure occurs The solution is to define an interface with the methods that the service will invoke on the page or component instance. The service will expect an object implementing the interface (and doesn't care what class loader loaded the implementing class). Just be sure to put the interface class in a non-controlled package, such as your application's root-package (and not root-package.pages). Which is better, using magic method names (i.e., beginRender()) or annotations (i.e. BeginRender)?There is no single best way; this is where your taste may vary. Historically, the annotations came first, and the method naming conventions came later. The advantage of using the method naming conventions is that the method names are more concise, which fewer characters to type, and fewer classes to import. The main disadvantage of the method naming conventions is that the method names are not meaningful. onSuccessFromLoginForm() is a less meaningful name than storeUserCredentialsAndReturnToProductsPage(), for example. The second disadvantage is you are more susceptible to off-by-a-character errors. For example, onSucessFromLoginForm() will never be called because the event name is misspelled; this would not happen using the annotation approach: @OnEvent(value=EventConstants.SUCCESS, component="loginForm") Object storeUserCredentialsAndReturnToProductsPage() { . . . } The compiler will catch a misspelling of the constant SUCCESS. Likewise, local constants can be defined for key components, such as "loginForm".
Why do I have to inject a page? Why can't I just create one using new?Tapestry tranforms your class at runtime. It tends to build ____
Change Notification Preferences
View Online
|
View Changes
|
- [CONF] Apache Tapestry > Page And Component Classes confluence
