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