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]>

Reply via email to