Apache Struts, Tiles and ADF
Written By Duncan Mills, Oracle Corporation
July 2004
Introduction
Tiles is a technology that is widely used in conjunction with
the Apache Struts Page flow controller used by the Oracle ADF framework. Tiles
provides a way of defining Page fragments or "tiles" which can be
assembled into a complete page at runtime. This allows you to define the common
part of your applications such as page headers and menus just once as reusable
tiles, rather than repeating such common information in every page definition.
Tiles is, in principle, similar to technologies such as JSP or JSTL include
files.
Tiles can be assembled into a template page using conventional
JSP tags from the Struts <tiles> tag library or by using an XML definition
of a page which offers a more manageable reuse model with capabilities for reusing
and extending definitions throughout the application.
This paper assumes the reader already has a working knowledge of Tiles, however,
if you are not yet familiar with Tiles and would like to learn more then the
following articles will provide a good introduction.
Tiles and ADF Working Together
Tiles can be successfully integrated with ADF data bound pages,
but care must be taken to make sure that events such as page submissions go
to the correct place. A common problem is using a DataPage with a Form on it
as a tile. When the Form is submitted the submission goes to the DataPage itself
rather than the while Tile set, so the chrome provided by the surrounding tiles
is lost. The best approach when using tiles is to let the DataPage action be
the top level entry point to a tile set, this has the advantage of removing
the requirement to edit the JSP pages to redirect links and Form Actions, and
also means that the DataPage can also be used to prepare data for binding onto
any of the Tiles in the tile set.
Creating a DataPage for Use in a Tile Set.
- First of all, create your DataPage (e.g. /deptEdit.do)
as normal on the page flow diagram, drill into it and define the JSP that
will be displayed by the DataPage.
- In the JSP create the data bindings that you require for
this screen as you would for a non-Tiles application.
- Test your page at this point to make sure that you are
seeing the data that you expect and that the functionality exposed by the
page works correctly.
- Now edit your tiles definition and nominate the JSP file
name defined for the DataPage as the Tile content. For instance:
<tiles-definitions xmlns="http://jakarta.apache.org/struts/dtds/tiles-config_1_1"> <definition name="base.page" path="/templates/template.jsp"> <put name="title" value="Not Used Directly"/> <put name="header" value="/tiles/header.jsp"/> <put name="footer" value="/tiles/footer.jsp"/> <put name="content" value=""/> </definition> ... <definition name="departments.edit" extends="base.page"> <put name="title" value="Edit Department- Databound Screen"/> <put name="content" value="/deptEdit.jsp"/> </definition> </tiles-definitions>
- Now switch to the Struts page flow and select the DataPage
that you've just created in the structure pane.
- In the property inspector, change the parameter
attribute of the DataPage to point to the tiles definition (in this case "departments.edit")
rather than the original JSP.
So the action definition of:
<action path="/deptEdit"
className="oracle.adf.controller.struts.actions.DataActionMapping"
type="oracle.adf.controller.struts.actions.DataForwardAction"
name="DataForm"
parameter="/deptEdit.jsp"> <set-property property="modelReference" value="deptEditUIModel"/> <forward name="Submit" path="/deptView.do"/> </action>
Is changed to:
<action path="/deptEdit"
className="oracle.adf.controller.struts.actions.DataActionMapping"
type="oracle.adf.controller.struts.actions.DataForwardAction"
name="DataForm"
parameter="departments.edit"> <set-property property="modelReference" value="deptEditUIModel"/> <forward name="Submit" path="/deptView.do"/> </action>
Now when you run or submit to the DataPage, the model integration
will take place, and the required data placed on the request, after which the
DataPage will forward to display the entire tiles set rather than just the original
data bound JSP. This also means that you can use JSTL expressions on other tiles
within the set to bind to data that the DataPage is preparing.
Simplifying the Editing of Tiles Definition Files
To help you in editing the tiles definition XML file you can
register an XML schema with JDeveloper and associate this with your tiles definition.
This will provide support for the tiles definition in the Structure Pane, Property
Inspector and the XML editor itself with code insight and completion. An XML
schema is not provided in the basic Struts distribution from Apache (it only
comes with a DTD file). However, a XSD, created from the DTD is available on
OTN
for you to use. The figure below shows an extract from the XSD file shown in
the JDeveloper XSD editor.

Installing the Schema in JDeveloper
To install the XSD file you will need to carry out the following
steps
- Download the XSD from OTN (here)
and save it into the %JDeveloperHome%/jakarta-struts/lib
directory.
- From to Tools > Preferences
menu, select the XML Schema option in the preference navigator and
add a new schema:
- Finally when you create a tiles-def.xml
file, the only additional step you have to take is to add the XML namespace
definition to the normal <tiles-definitions> top level element, so that
it reads: <tiles-definitions xmlns="http://jakarta.apache.org/struts/dtds/tiles-config_1_1">.
Once you reopen the XML document JDeveloper will provide full property inspector
support and XML code insight to help with the creation and validation of your
Tiles definitions.
Restrictions in 9.0.5.n of Oracle JDeveloper 10g
With the current release of JDeveloper, the page flow
diagram is not set up to handle Tiles (XML) definition references directly.
Thus an Action definition such as:
<action path="/logon" forward="logon.view"/>
Will not display correctly on the diagram and the Action
will show with the following icon ,
indicating that the Struts Diagram cannot find the underlying page.
Additionally if you try and create a Forward which uses an
XML Tiles definition as the path attribute then additional "phantom"
pages will be created on the diagram .
To avoid this problem you can either choose to work without the diagram enabled
(see the technical tip "Suppressing
the Struts Page Flow Diagram" on OTN) or you can define ActionForwards
for each Tiles definition you will need as Forward targets in the flow. If you
choose this technique then the flow will be correctly represented in the diagram,
however, the ActionForwards will still be shown with the warning icon. Future
versions of JDeveloper will recognize Tiles definitions as valid forward targets.
| Note: A simple sample
application showing Databound pages as tiles is available here |
drmills v1.0 28/July/2004
|