The Struts framework provides the controller component in the MVC-style
application. The controller is a servlet called org.apache.struts.action.ActionServlet.class.
In the web.xml file of the application, a servlet mapping of *.do is
added for this Struts ActionServlet servlet so that every request for a Web
address that ends with .do is processed. The ActionServlet servlet
uses the information in the struts-config.xml file to decide which
Struts action class runs the request for the specified resource.
Cache
policy using a previous version of WebSphere Application Server
In
the previous version of WebSphere Application Server, only one cache policy
per servlet was supported. However, when you are using Struts, every request
that ends in .do maps to the same ActionServlet servlet. To cache
Struts responses, write a cache policy for the ActionServlet servlet based
on its servlet path.
For example, consider two Struts actions:
/HelloParam.do and
/HelloAttr.do.
To cache the responses based on the id request parameter and the arg request
attribute respectively, use the following cache policy:
<cache-entry>
<class>servlet</class>
<name>org.apache.struts.action.ActionServlet.class</name>
<cache-id>
<component id="" type="servletpath">
<value>/HelloParm.do</value>
</component>
</cache-id>
<cache-id>
<component id="" type="servletpath">
<value>/HelloAttr.do</value>
</component>
<component id="arg" type="attribute">
<required>true</required>
</component>
</cache-id>
</cache-entry>
Cache policy using WebSphere Application
Server, Version 6.0 or later
With the current version of WebSphere
Application Server, you can map multiple cache policies for a single servlet.
You can rewrite the previous cache policy as in the following example:
<cache-entry>
<class>servlet>
<name>/HelloParam.do</name>
<cache-id>
<component id="id" type="parameter">
<required>true</required>
</component>
</cache-entry>
<cache-entry>
<class>servlet</class>
<name>/HelloAttr.do</name>
<cache-id>
<component id="arg" type="attribute">
<required>true</required>
</component>
</cache-id>
</cache-entry>
The Tiles framework is built on the jsp:include tag, so everything that
applies to JSP caching also applies to Tiles. You must set the flush attribute
to true in any fragments that are included using the tiles:insert
tag for the fragments to be cached correctly. The extra feature in tiles caching
over JSP caching is based on the tiles attribute. For example, you might develop
the following layout.jsp template:<html>
<%String categoryId = request.getParameter("categoryId")+"test"; %>
<tiles:insert attribute="header">
<tiles:put name="categoryId" value="<%= categoryId %>" />
</tile:insert>
<table>
<tr>
<td width="70%" valign="top"><tiles:insert attribute="body" /> </td>
</tr>
<tr>
<td colspan="2"><tiles:insert attribute="footer" /></td>
</tr>
</table>
</body>
</html>
The nested tiles:put tag specifies the attribute of the inserted
tile. In the layout.jsp template, the categoryId attribute is defined
and passed on to the tile that is inserted into the placeholder for the header.
In the following example, the layout.jsp file is inserted into another
JSP file:<html>
<body>
<tiles:insert page="layout.jsp?categoryId=1002" flush="true">
<tiles:put name="header" value="/header.jsp" />
<tiles:put name="body" value="/body.jsp" />
<tiles:put name="footer" value="/footer.jsp" />
</tiles:insert>
</body>
</html>
The categoryId tile attribute is passed on to the header.jsp file.
The header.jsp file can use the <tiles:useAttribute> tag to retrieve
the value of categoryId. To cache the header.jsp file based on the
value of the categoryId attribute, you can use the following cache policy:<cache-entry>
<class>servlet</class>
<name>/header.jsp</name>
<cache-id>
<component id="categoryId" type="tiles_attribute">
<required>true</required>
</component>
</cache-id>
</cache-entry>