craigmcc 02/03/16 18:49:06 Modified: doc/userGuide struts-html.xml src/share/org/apache/struts/taglib/html LinkTag.java Added: src/share/org/apache/struts/taglib/html FrameTag.java Log: Added a new <html:frame> tag that provides the same sort of manipulations to the "src" attribute that <html:link> does for the "href" attribute. PR: Bugzilla #6923 Submitted by: Joe Germuska <joe at germuska.com>, who also provided the implementation class Revision Changes Path 1.6 +374 -0 jakarta-struts/doc/userGuide/struts-html.xml Index: struts-html.xml =================================================================== RCS file: /home/cvs/jakarta-struts/doc/userGuide/struts-html.xml,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- struts-html.xml 17 Mar 2002 01:44:41 -0000 1.5 +++ struts-html.xml 17 Mar 2002 02:49:06 -0000 1.6 @@ -1499,6 +1499,380 @@ <tag> + <name>frame</name> + <summary>Render an HTML frame element</summary> + <tagclass>org.apache.struts.taglib.html.FrameTag</tagclass> + <info> + + <p>Renders an HTML <code><frame></code> element + with processing for the <code>src</code> attribute that is + identical to that performed by the <code><html:link></code> + tag for the <code>href</code> attribute. URL rewriting will be + applied automatically, to maintain session state in the + absence of cookies.</p> + + <p>The base URL for this frame is calculated based on + which of the following attributes you specify (you must + specify exactly one of them):</p> + <ul> + <li><em>forward</em> - Use the value of this attribute as the + name of a global <code>ActionForward</code> to be looked + up, and use the application-relative or context-relative + URI found there.</li> + <li><em>href</em> - Use the value of this attribute unchanged. + </li> + <li><em>page</em> - Use the value of this attribute as a + application-relative URI, and generate a server-relative + URI by including the context path and application + prefix.</li> + </ul> + + <p>Normally, the hyperlink you specify with one of the + attributes described in the previous paragraph will be left + unchanged (other than URL rewriting if necessary). However, + there are two ways you can append one or more dynamically + defined query parameters to the hyperlink -- specify a single + parameter with the <code>paramId</code> attribute (and its + associated attributes to select the value), or specify the + <code>name</code> (and optional <code>property</code>) + attributes to select a <code>java.util.Map</code> bean that + contains one or more parameter ids and corresponding values. + </p> + + <p>To specify a single parameter, use the <code>paramId</code> + attribute to define the name of the request parameter to be + submitted. To specify the corresponding value, use one of the + following approaches:</p> + <ul> + <li><em>Specify only the <code>paramName</code> attribute</em> + - The named JSP bean (optionally scoped by the value of the + <code>paramScope</code> attribute) must identify a value + that can be converted to a String.</li> + <li><em>Specify both the <code>paramName</code> and + <code>paramProperty</code> attributes</em> - The specified + property getter method will be called on the JSP bean + identified by the <code>paramName</code> (and optional + <code>paramScope</code>) attributes, in order to select + a value that can be converted to a String.</li> + </ul> + + <p>If you prefer to specify a <code>java.util.Map</code> that + contains all of the request parameters to be added to the + hyperlink, use one of the following techniques:</p> + <ul> + <li><em>Specify only the <code>name</code> attribute</em> - + The named JSP bean (optionally scoped by the value of + the <code>scope</code> attribute) must identify a + <code>java.util.Map</code> containing the parameters.</li> + <li><em>Specify both <code>name</code> and + <code>property</code> attributes</em> - The specified + property getter method will be called on the bean + identified by the <code>name</code> (and optional + <code>scope</code>) attributes, in order to return the + <code>java.util.Map</code> containing the parameters.</li> + </ul> + + <p>As the <code>Map</code> is processed, the keys are assumed + to be the names of query parameters to be appended to the + hyperlink. The value associated with each key must be either + a String or a String array representing the parameter value(s), + or an object whose toString() method will be called. + If a String array is specified, more than one value for the + same query parameter name will be created.</p> + + <p>Additionally, you can request that the current transaction + control token, if any, be included in the generated hyperlink + by setting the <code>transaction</code> attribute to + <code>true</code>. + You can also request that an anchor ("#xxx") be added to the + end of the URL that is created by any of the above mechanisms, + by using the <code>anchor</code> attribute.</p> + + </info> + + <attribute> + <name>anchor</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>Optional anchor tag ("#xxx") to be added to the generated + hyperlink. Specify this value <strong>without</strong> any + "#" character.</p> + </info> + </attribute> + + <attribute> + <name>forward</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>Logical name of a global <code>ActionForward</code> that + contains the actual content-relative URI of the destination + of this transfer. This hyperlink may be dynamically + modified by the inclusion of query parameters, as described + in the tag description. You <strong>must</strong> specify + exactly one of the <code>forward</code> attribute, the + <code>href</code> attribute, + or the <code>page</code> attribute.</p> + </info> + </attribute> + + <attribute> + <name>frameborder</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>Should a frame border be generated around this frame (1) + or not (0)?</p> + </info> + </attribute> + + <attribute> + <name>frameName</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>Value for the <code>name</code> attribute of the rendered + <code><frame></code> element.</p> + </info> + </attribute> + + <attribute> + <name>href</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The URL to which this hyperlink will transfer control + if activated. This hyperlink may be dynamically modified + by the inclusion of query parameters, as described in the + tag description. You <strong>must</strong> specify + exactly one of the <code>forward</code> attribute, the + <code>href</code> attribute, + or the <code>page</code> attribute.</p> + </info> + </attribute> + + <attribute> + <name>longdesc</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>URI of a long description of the frame. This description + should supplement the short description provided by the + <code>title</code> attribute, and may be particularly useful + for non-visual user agents.</p> + </info> + </attribute> + + <attribute> + <name>marginheight</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The amount of space (in pixels) to be left between the + frame's contents and its top and bottom margins.</p> + </info> + </attribute> + + <attribute> + <name>marginwidth</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The amount of space (in pixels) to be left between the + frame's contents and its left and right argins.</p> + </info> + </attribute> + + <attribute> + <name>name</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The name of a JSP bean that contains a <code>Map</code> + representing the query parameters (if <code>property</code> + is not specified), or a JSP bean whose property getter is + called to return a <code>Map</code> (if <code>property</code> + is specified).</p> + </info> + </attribute> + + <attribute> + <name>noresize</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>Should users be disallowed from resizing the frame? + (true, false).</p> + </info> + </attribute> + + <attribute> + <name>page</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The applicaiton-relative path (beginning with a "/" + character) to which this hyperlink will transfer control + if activated. This hyperlink may be dynamically modified + by the inclusion of query parameters, as described in the + tag description. You <strong>must</strong> specify exactly + one of the <code>forward</code> attribute, the + <code>href</code> attribute, + or the <code>page</code> attribute.</p> + </info> + </attribute> + + <attribute> + <name>paramId</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The name of the request parameter that will be dynamically + added to the generated hyperlink. The corresponding value is + defined by the <code>paramName</code> and (optional) + <code>paramProperty</code> attributes, optionally scoped by + the <code>paramScope</code> attributel</p> + </info> + </attribute> + + <attribute> + <name>paramName</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The name of a JSP bean that is a String containing the + value for the request parameter named by <code>paramId</code> + (if <code>paramProperty</code> is not specified), or a JSP + bean whose property getter is called to return a String + (if <code>paramProperty</code> is specified). The JSP bean + is constrained to the bean scope specified by the + <code>paramScope</code> property, if it is specified.</p> + </info> + </attribute> + + <attribute> + <name>paramProperty</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The name of a property of the bean specified by the + <code>paramName</code> attribute, whose return value must + be a String containing the value of the request parameter + (named by the <code>paramId</code> attribute) that will be + dynamically added to this hyperlink.</p> + </info> + </attribute> + + <attribute> + <name>paramScope</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The scope within which to search for the bean specified + by the <code>paramName</code> attribute. If not specified, + all scopes are searched.</p> + </info> + </attribute> + + <attribute> + <name>property</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The name of a property of the bean specified by the + <code>name</code> attribute, whose return value must be + a <code>java.util.Map</code> containing the query parameters + to be added to the hyperlink. You <strong>must</strong> + specify the <code>name</code> attribute if you specify + this attribute.</p> + </info> + </attribute> + + <attribute> + <name>scope</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The scope within which to search for the bean specified + by the <code>name</code> attribute. If not specified, all + scopes are searched.</p> + </info> + </attribute> + + <attribute> + <name>scrolling</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>Should scroll bars be created unconditionally (yes), + never (no), or only when needed (auto)?</p> + </info> + </attribute> + + <attribute> + <name>style</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>CSS styles to be applied to this element.</p> + </info> + </attribute> + + <attribute> + <name>styleClass</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>CSS stylesheet class to be applied to this element.</p> + </info> + </attribute> + + <attribute> + <name>styleId</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + Identifier to be assigned to this HTML element. + </info> + </attribute> + + <attribute> + <name>title</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The advisory title for this element.</p> + </info> + </attribute> + + <attribute> + <name>titleKey</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The message resources key for the advisory title + for this element.</p> + </info> + </attribute> + + <attribute> + <name>transaction</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>If set to <code>true</code>, any current transaction + control token will be included in the generated hyperlink, + so that it will pass an <code>isTokenValid()</code> test + in the receiving Action.</p> + </info> + </attribute> + + </tag> + + + <tag> + <name>hidden</name> <summary> Render A Hidden Field 1.22 +61 -43 jakarta-struts/src/share/org/apache/struts/taglib/html/LinkTag.java Index: LinkTag.java =================================================================== RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/LinkTag.java,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- LinkTag.java 13 Jan 2002 00:25:37 -0000 1.21 +++ LinkTag.java 17 Mar 2002 02:49:06 -0000 1.22 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/LinkTag.java,v 1.21 2002/01/13 00:25:37 craigmcc Exp $ - * $Revision: 1.21 $ - * $Date: 2002/01/13 00:25:37 $ + * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/LinkTag.java,v 1.22 2002/03/17 02:49:06 craigmcc Exp $ + * $Revision: 1.22 $ + * $Date: 2002/03/17 02:49:06 $ * * ==================================================================== * @@ -89,7 +89,7 @@ * Generate a URL-encoded hyperlink to the specified URI. * * @author Craig R. McClanahan - * @version $Revision: 1.21 $ $Date: 2002/01/13 00:25:37 $ + * @version $Revision: 1.22 $ $Date: 2002/03/17 02:49:06 $ */ public class LinkTag extends BaseHandlerTag { @@ -343,47 +343,9 @@ return (EVAL_BODY_TAG); } - // Generate the hyperlink URL - Map params = RequestUtils.computeParameters - (pageContext, paramId, paramName, paramProperty, paramScope, - name, property, scope, transaction); - - // if "indexed=true", add "index=x" parameter to query string - // since 1.1 - if( indexed ) { - // look for outer iterate tag - IterateTag iterateTag = (IterateTag) findAncestorWithClass(this, IterateTag.class); - if (iterateTag == null) { - // this tag should only be nested in iteratetag, if it's not, throw exception - JspException e = new JspException(messages.getMessage("indexed.noEnclosingIterate")); - RequestUtils.saveException(pageContext, e); - throw e; - } - - //calculate index, and add as a parameter - if (params == null) { - params = new HashMap(); //create new HashMap if no other params - } - if (indexId != null) { - params.put(indexId, Integer.toString(iterateTag.getIndex())); - } else { - params.put("index", Integer.toString(iterateTag.getIndex())); - } - } - - String url = null; - try { - url = RequestUtils.computeURL(pageContext, forward, href, - page, params, anchor, false); - } catch (MalformedURLException e) { - RequestUtils.saveException(pageContext, e); - throw new JspException - (messages.getMessage("rewrite.url", e.toString())); - } - // Generate the opening anchor element StringBuffer results = new StringBuffer("<a href=\""); - results.append(url); + results.append(calculateURL()); results.append("\""); if (target != null) { results.append(" target=\""); @@ -465,6 +427,62 @@ target = null; text = null; transaction = false; + + } + + + // ------------------------------------------------------ Protected Methods + + + /** + * Return the complete URL to which this hyperlink will direct the user. + * + * @exception JspException if an exception is thrown calculating the value + */ + protected String calculateURL() throws JspException { + + // Identify the parameters we will add to the completed URL + Map params = RequestUtils.computeParameters + (pageContext, paramId, paramName, paramProperty, paramScope, + name, property, scope, transaction); + + // if "indexed=true", add "index=x" parameter to query string + // since 1.1 + if( indexed ) { + + // look for outer iterate tag + IterateTag iterateTag = + (IterateTag) findAncestorWithClass(this, IterateTag.class); + if (iterateTag == null) { + // This tag should only be nested in an iterate tag + // If it's not, throw exception + JspException e = new JspException + (messages.getMessage("indexed.noEnclosingIterate")); + RequestUtils.saveException(pageContext, e); + throw e; + } + + //calculate index, and add as a parameter + if (params == null) { + params = new HashMap(); //create new HashMap if no other params + } + if (indexId != null) { + params.put(indexId, Integer.toString(iterateTag.getIndex())); + } else { + params.put("index", Integer.toString(iterateTag.getIndex())); + } + } + + String url = null; + try { + url = RequestUtils.computeURL(pageContext, forward, href, + page, params, anchor, false); + } catch (MalformedURLException e) { + RequestUtils.saveException(pageContext, e); + throw new JspException + (messages.getMessage("rewrite.url", e.toString())); + } + return (url); } 1.1 jakarta-struts/src/share/org/apache/struts/taglib/html/FrameTag.java Index: FrameTag.java =================================================================== /* * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/FrameTag.java,v 1.1 2002/03/17 02:49:06 craigmcc Exp $ * $Revision: 1.1 $ * $Date: 2002/03/17 02:49:06 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.struts.taglib.html; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.Iterator; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.TagSupport; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionForwards; import org.apache.struts.util.MessageResources; import org.apache.struts.util.RequestUtils; import org.apache.struts.util.ResponseUtils; /** * Generate an HTML <code><frame></code> tag with similar capabilities * as those the <code><html:link></code> tag provides for hyperlink * elements. The <code>src</code> element is rendered using the same technique * that {@link LinkTag} uses to render the <code>href</code> attribute of a * hyperlink. Additionall, the HTML 4.0 * frame tag attributes <code>noresize</code>, <code>scrolling</code>, * <code>marginheight</code>, <code>marginwidth</code>, * <code>frameborder</code>, and <code>longdesc</code> are supported. * The frame * <code>name</code> attribute is rendered based on the <code>frameName</code> * property. * * Note that the value of <code>longdesc</code> is intended to be a URI, but * currently no rewriting is supported. The attribute is set directly from * the property value. * * @author Joe Germuska * @author Craig R. McClanahan * @version $Revision: 1.1 $ $Date: 2002/03/17 02:49:06 $ * @since 1.1 */ public class FrameTag extends LinkTag { // ------------------------------------------------------------- Properties /** * The frameborder attribute that should be rendered (1, 0). */ protected String frameborder = null; public String getFrameborder() { return (this.frameborder); } public void setFrameborder(String frameborder) { this.frameborder = frameborder; } /** * The <code>name</code> attribute that should be rendered for this frame. */ protected String frameName = null; public String getFrameName() { return (this.frameName); } public void setFrameName(String frameName) { this.frameName = frameName; } /** * URI of a long description of this frame (complements title). */ protected String longdesc = null; public String getLongdesc() { return (this.longdesc); } public void setLongdesc(String longdesc) { this.longdesc = longdesc; } /** * The margin height in pixels, or zero for no setting. */ protected int marginheight = 0; public int getMarginheight() { return (this.marginheight); } public void setMarginheight(int marginheight) { this.marginheight = marginheight; } /** * The margin width in pixels, or zero for no setting. */ protected int marginwidth = 0; public int getMarginwidth() { return (this.marginwidth); } public void setMarginwidth(int marginwidth) { this.marginwidth = marginwidth; } /** * Should users be disallowed to resize the frame? */ protected boolean noresize = false; public boolean getNoresize() { return (this.noresize); } public void setNoresize(boolean noresize) { this.noresize = noresize; } /** * What type of scrolling should be supported (yes, no, auto)? */ protected String scrolling = null; public String getScrolling() { return (this.scrolling); } public void setScrolling(String scrolling) { this.scrolling = scrolling; } // --------------------------------------------------------- Public Methods /** * Render the appropriately encoded URI. * * @exception JspException if a JSP exception has occurred */ public int doStartTag() throws JspException { // Print this element to our output writer StringBuffer results = new StringBuffer("<frame "); results.append("src=\""); results.append(calculateURL()); results.append("\""); if (frameName != null) { results.append(" name=\""); results.append(frameName); results.append("\""); } if (noresize) { results.append(" noresize=\"noresize\""); } if (scrolling != null) { results.append(" scrolling=\""); results.append(scrolling); results.append("\""); } if (marginheight > 0) { results.append(" marginheight=\""); results.append(marginheight); results.append("\""); } if (marginwidth > 0) { results.append(" marginwidth=\""); results.append(marginwidth); results.append("\""); } if (frameborder != null) { results.append(" frameborder=\""); results.append(frameborder); results.append("\""); } if (longdesc != null) { results.append(" longdesc=\""); results.append(frameborder); results.append("\""); } results.append(prepareStyles()); results.append(">"); ResponseUtils.write(pageContext,results.toString()); // Skip the body of this tag return (SKIP_BODY); } /** * Ignore the end of this tag. * * @exception JspException if a JSP exception has occurred */ public int doEndTag() throws JspException { return (EVAL_PAGE); } /** * Release any acquired resources. */ public void release() { super.release(); frameborder = null; frameName = null; longdesc = null; marginheight = 0; marginwidth = 0; noresize = false; scrolling = null; } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>