Have you check Tiles capabilities ? Tiles are considered as "extended template"
framework.
Tiles provide an extension mechanism allowing default values specification.
Cedric
"Adam P. Jenkins" wrote:
> I added the ability to specifiy default content for the template:get tag.
> This content is output by the get tag only if there is no corresponding
> template:put tag in the inserting page. I did this by making it so
> template:get accepts a "content" attribute and "direct" attribute, and can
> also have a body. These have the same meaning as for the template:put tag,
> except that they are only evaluated if there is no content with the given
> name on the ContentMapStack. Here is an example of the usage:
>
> <!-- template.jsp -->
> <%@ page language="java" %>
> <%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %>
>
> <template:get name="title" content="Default Title" direct="true"/>
> <template:get name="body">
> This is the default page body
> </template:get>
>
> <!-- page.jsp -->
> <%@ page language="java" %>
> <%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %>
>
> <template:insert template="template.jsp">
> <template:put name="title" content="Page Title" direct="true"/>
> <!-- I don't specify a body, so default will be used. -->
> </template:insert>
>
> In the above example, page.jsp inserts template.jsp, and only specifiies a
> title. So in template.jsp, <template:get name="title"> will output the title
> given in page.jsp, but <template:get name="body"> will use the default body
> specified in template.jsp.
>
> My motivation for adding this is that often when I write templates, I want to
> make them very configurable. But often there are sensible defaults for most
> of the parameters. It makes the templates much more useful if when I insert
> them, I only need to specify values where I want to override the defaults.
>
> I had to modify two files to add this:
> src/share/org/apache/struts/taglib/template/GetTag.java
> doc/userGuide/struts-template.xml
>
> Here are the patches.
>
> Index: struts-template.xml
> ===================================================================
> RCS file: /home/cvspublic/jakarta-struts/doc/userGuide/struts-template.xml,v
> retrieving revision 1.1
> diff -u -r1.1 struts-template.xml
> --- struts-template.xml 20 Feb 2002 00:41:14 -0000 1.1
> +++ struts-template.xml 6 Apr 2002 16:51:01 -0000
> @@ -117,7 +117,7 @@
> put tag.
> </summary>
> <tagclass>org.apache.struts.taglib.template.GetTag</tagclass>
> - <bodycontent>empty</bodycontent>
> + <bodycontent>JSP</bodycontent>
> <info>
> Retrieve content from request scope and include it.
> </info>
> @@ -154,6 +154,26 @@
> </info>
> </attribute>
>
> + <attribute>
> + <name>content</name>
> + <required>false</required>
> + <rtexprvalue>true</rtexprvalue>
> + <info>
> + Content that's put into request scope if there is no
> + corresponding put element.
> + </info>
> + </attribute>
> +
> + <attribute>
> + <name>direct</name>
> + <required>false</required>
> + <rtexprvalue>true</rtexprvalue>
> + <info>
> + Determines how content is handled: true means content is
> + printed <i>direct</i>ly; false, the default, means content
> + is included.
> + </info>
> + </attribute>
> </tag>
>
>
> Index: GetTag.java
> ===================================================================
> RCS file:
>
>/home/cvspublic/jakarta-struts/src/share/org/apache/struts/taglib/template/GetTag.java,v
> retrieving revision 1.12
> diff -u -r1.12 GetTag.java
> --- GetTag.java 12 Mar 2002 05:55:08 -0000 1.12
> +++ GetTag.java 6 Apr 2002 16:52:19 -0000
> @@ -67,6 +67,7 @@
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.jsp.JspException;
> import javax.servlet.jsp.PageContext;
> +import javax.servlet.jsp.tagext.BodyTagSupport;
> import javax.servlet.jsp.tagext.TagSupport;
> import org.apache.struts.action.Action;
> import org.apache.struts.taglib.template.util.*;
> @@ -79,7 +80,7 @@
> * @author David Geary
> * @version $Revision: 1.12 $ $Date: 2002/03/12 05:55:08 $
> */
> -public class GetTag extends TagSupport {
> +public class GetTag extends BodyTagSupport {
>
> // ----------------------------------------------------- Instance Variables
>
> @@ -101,6 +102,18 @@
> private String role;
>
> /**
> + * The default content's URI (or text).
> + */
> + private String content = null;
> +
> +
> + /**
> + * Determines whether content is included (false) or printed (true).
> + * Content is included (false) by default.
> + */
> + private String direct = null;
> +
> + /**
> * Set the flush-before-include property
> * @param flush The new flush property
> */
> @@ -131,6 +144,27 @@
> }
>
> /**
> + * Set the content's URI (if it's to be included) or text (if it's to
> + * be printed).
> + */
> + public void setContent(String content) {
> +
> + this.content = content;
> +
> + }
> +
> +
> + /**
> + * Set direct to true, and content will be printed directly, instead
> + * of included (direct == false).
> + */
> + public void setDirect(String direct) {
> +
> + this.direct = direct;
> +
> + }
> +
> + /**
> * Get the flush-before-include attribute.
> */
> public boolean getFlush() {
> @@ -158,6 +192,24 @@
>
> }
>
> +
> + /**
> + * Get the content attribute.
> + */
> + public String getContent() {
> +
> + return content;
> +
> + }
> +
> + /**
> + * Returns the direct attribute associated with this tag.
> + */
> + public String getDirect() {
> + if(hasBody()) return "true";
> + else return direct == null ? "false" : "true";
> + }
> +
> // --------------------------------------------------------- Public Methods
>
> /**
> @@ -174,6 +226,29 @@
> ContentMap map = ContentMapStack.peek(pageContext);
> Content content = map.get(name);
>
> + if (content == null) {
> + // see if default content was provided
> + String bodyAndContentMismatchError =
> + "Please specify template content in this tag's body " +
> + "or with the content attribute, but not both.",
> + bodyAndDirectMismatchError =
> + "If content is specified in the tag body, the " +
> + "direct attribute must be true.";
> +
> + boolean hasBody = hasBody(), contentSpecified = (this.content != null);
> +
> + if(hasBody && contentSpecified)
> + throw new JspException(bodyAndContentMismatchError);
> +
> + if(hasBody && direct != null && direct.equalsIgnoreCase("false"))
> + throw new JspException(bodyAndDirectMismatchError);
> +
> + String actualContent =
> + hasBody ? bodyContent.getString() : this.content;
> + if (actualContent != null)
> + content = new Content(actualContent, direct);
> + }
> +
> if(content != null) {
> if(content.isDirect()) {
> try {
> @@ -202,7 +277,16 @@
>
> }
>
> + /**
> + * Returns a boolean indicating whether this tag has a body.
> + */
> + private boolean hasBody() {
> + if (bodyContent == null)
> + return (false);
> + return ! bodyContent.getString().equals("");
> + }
>
> +
> /**
> * Reset member values for reuse. This method calls super.release(),
> * which invokes TagSupport.release(), which typically does nothing.
>
> --
> To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>