craigmcc 01/02/19 18:59:00 Modified: src/doc struts-html.xml src/share/org/apache/struts/taglib/html ImageTag.java ImgTag.java Log: Retrofit the <html:image> tag so that it offers the same support for dynamically looking up alternate text, context-relative URIs, or source URLs in a message resources bundle that the <html:img> tag has. NOTE: This change is *not* backwards compatible, but the changes are very easy: * Change any use of 'src="foo" isKey="true"' to 'srcKey="foo"' instead * Change any use of 'path="/foo"' to 'page="/foo"' instead Revision Changes Path 1.14 +144 -74 jakarta-struts/src/doc/struts-html.xml Index: struts-html.xml =================================================================== RCS file: /home/cvs/jakarta-struts/src/doc/struts-html.xml,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- struts-html.xml 2001/02/20 01:48:44 1.13 +++ struts-html.xml 2001/02/20 02:58:59 1.14 @@ -1251,165 +1251,235 @@ </tag> - <tag> - <name>image</name> - <summary> - Renders an input of type "image" - </summary> - <tagclass>org.apache.struts.taglib.html.ImageTag</tagclass> - <info> - This tag renders an input of type "image". Use the "src" attribute - in conjunction with a non-null "isKey" attribute to retrieve a - property value from a resource bundle. Use the "path" - attribute to specify a direct path to the image. See info on - the "property" attribute if you would like to obtain the coordinates - of the mouse click submitted with the request. - </info> - <attribute> - <name>locale</name> - <required>false</required> - <rtexprvalue>true</rtexprvalue> - <info> - The locale to use to retrieve the key specified by "src". - </info> - </attribute> - <attribute> - <name>bundle</name> - <required>false</required> - <rtexprvalue>true</rtexprvalue> - <info> - The servlet context attribute key for the MessageResources - instance to use. - </info> - </attribute> - <attribute> - <name>accesskey</name> - <required>false</required> - <rtexprvalue>true</rtexprvalue> - </attribute> + <tag> + <name>image</name> + <summary> + Render an input tag of type "image" + </summary> + <tagclass>org.apache.struts.taglib.html.ImageTag</tagclass> + <info> + + <p>Renders an HTML <code><input></code> tag of type + "image". The base URL for this image is calculated directly + based on the value specified in the <code>src</code> or + <code>page</code> attributes, or indirectly by looking up a + message resource string based on the <code>srcKey</code> or + <code>pageKey</code> attributes. You <strong>must</strong> + specify exactly one of these attributes.</p> + + <p>If you would like to obtain the coordinates of the mouse + click that submitted this request, see the information below + on the <code>property</code> attribute.</p> + + </info> + + <attribute> + <name>accesskey</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The keyboard character used to move focus immediately + to this element.</p> + </info> + </attribute> + + <attribute> + <name>alt</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The alternate text for this image.</p> + </info> + </attribute> + + <attribute> + <name>altKey</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The message resources key of the alternate text for this + image.</p> + </info> + </attribute> + + <attribute> + <name>bundle</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The servlet context attribute key for the MessageResources + instance to use. If not specified, defaults to the + application resources configured for our action servlet.</p> + </info> + </attribute> + + <attribute> + <name>locale</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The session attribute key for the Locale used to select + internationalized messages. If not specified, defaults to the + Struts standard value.</p> + </info> + </attribute> + <attribute> <name>onblur</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>onchange</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>onclick</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>ondblclick</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>onfocus</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>onkeydown</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>onkeypress</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>onkeyup</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>onmousedown</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>onmousemove</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>onmouseout</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>onmouseover</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>onmouseup</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> - <attribute> - <name>property</name> - <required>false</required> - <rtexprvalue>true</rtexprvalue> - <info> - The name of this image tag. The parameter names for the request - will appear as "property.x" and "property.y", the x and y - representing the coordinates of the mouse click for the image. - A way of retrieving these values through a form bean is to - define getX(), getY(), setX(), and setY() methods, and specify - your propery as a blank string (property=""). - </info> - </attribute> - <attribute> - <name>src</name> - <required>true</required> - <rtexprvalue>true</rtexprvalue> - <info> - The "src" attribute of the input tag, or if "isKey" is not null, - the key of the bundle value to use for this attribute. - </info> - </attribute> + + <attribute> + <name>page</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The context-relative path of the image for this + input tag.</p> + </info> + </attribute> + + <attribute> + <name>pageKey</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The key of the message resources string specifying the + context-relative path of the image for this input tag.</p> + </info> + </attribute> + + <attribute> + <name>property</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The property name of this image tag. The parameter names + for the request will appear as "property.x" and "property.y", + the x and y representing the coordinates of the mouse click + for the image. A way of retrieving these values through a + form bean is to define getX(), getY(), setX(), and setY() + methods, and specify your propery as a blank string + (property="").</p> + </info> + </attribute> + + <attribute> + <name>src</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The source URL of the image for this input tag.</p> + </info> + </attribute> + + <attribute> + <name>srcKey</name> + <required>false</required> + <rtexprvalue>true</rtexprvalue> + <info> + <p>The key of the message resources string specifying the + source URL of the image for this input tag.</p> + </info> + </attribute> + <attribute> <name>style</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>styleClass</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>tabindex</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> + <attribute> <name>value</name> <required>false</required> <rtexprvalue>true</rtexprvalue> - </attribute> - <attribute> - <name>path</name> - <required>false</required> - <rtexprvalue>true</rtexprvalue> - <info> - The path of image for image button. - </info> - </attribute> - <attribute> - <name>isKey</name> - <required>false</required> - <rtexprvalue>true</rtexprvalue> - <info> - Whether or not the "src" attribute represents a ResourceBundle key. - </info> </attribute> + </tag> 1.4 +214 -148 jakarta-struts/src/share/org/apache/struts/taglib/html/ImageTag.java Index: ImageTag.java =================================================================== RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/ImageTag.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- ImageTag.java 2001/01/08 21:36:06 1.3 +++ ImageTag.java 2001/02/20 02:59:00 1.4 @@ -1,13 +1,13 @@ /* - * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/ImageTag.java,v 1.3 2001/01/08 21:36:06 craigmcc Exp $ - * $Revision: 1.3 $ - * $Date: 2001/01/08 21:36:06 $ + * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/ImageTag.java,v 1.4 2001/02/20 02:59:00 craigmcc Exp $ + * $Revision: 1.4 $ + * $Date: 2001/02/20 02:59:00 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * - * Copyright (c) 1999 The Apache Software Foundation. All rights + * Copyright (c) 1999-2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,7 +29,7 @@ * 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 + * 4. The names "The Jakarta Project", "Struts", 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] @@ -66,18 +66,22 @@ import java.lang.reflect.Method; import java.io.IOException; import java.util.Locale; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.JspWriter; import org.apache.struts.action.Action; import org.apache.struts.util.MessageResources; +import org.apache.struts.util.RequestUtils; +import org.apache.struts.util.ResponseUtils; /** * Tag for input fields of type "image". * * @author Oleg V Alexeev - * @version $Revision: 1.3 $ $Date: 2001/01/08 21:36:06 $ + * @version $Revision: 1.4 $ $Date: 2001/02/20 02:59:00 $ */ public class ImageTag extends SubmitTag { @@ -87,173 +91,138 @@ /** - * The source of image for image button. - */ - protected String src = null; - - /** - * The path of image for image button. - */ - protected String path = null; - - /** - * The name attribute for the image button - */ - protected String property = ""; - - /** - * If not null - src property will - * treated as key to retrieve string - * from message bundle. - */ - protected String isKey = null; - - /** - * The servlet context attribute key for our resources. - */ - protected String bundle = Action.MESSAGES_KEY; - - - /** * The default Locale for our server. */ protected static final Locale defaultLocale = Locale.getDefault(); - /** - * The session scope key under which our Locale is stored. - */ - protected String localeKey = Action.LOCALE_KEY; - // ------------------------------------------------------------- Properties /** - * Return the property. + * The alternate text for this image. */ - public String getProperty() { + protected String alt = null; - return (this.property); + public String getAlt() { + return (this.alt); + } + public void setAlt(String alt) { + this.alt = alt; } /** - * Set the property name. - * - * @param property The property name + * The message resources key for the alternate text for this image. */ - public void setProperty(String property) { - - this.property = property; + protected String altKey = null; + + public String getAltKey() { + return (this.altKey); + } + public void setAltKey(String altKey) { + this.altKey = null; } + /** - * Return the bundle key. + * The servlet context attribute key for our resources. */ - public String getBundle() { + protected String bundle = Action.MESSAGES_KEY; + public String getBundle() { return (this.bundle); - } - - /** - * Set the bundle key. - * - * @param bundle The new bundle key. - */ public void setBundle(String bundle) { - this.bundle = bundle; - } + /** - * Return the locale key. + * The session attribute key for our locale. */ - public String getLocale() { + protected String locale = Action.LOCALE_KEY; - return (this.localeKey); - + public String getLocale() { + return (this.locale); } - - /** - * Set the locale key. - * - * @param locale The new locale key - */ public void setLocale(String locale) { - - this.localeKey = locale; - + this.locale = locale; } + /** - * Return the src of image. + * The context-relative URI of the image. */ - public String getSrc() { + protected String page = null; - return (this.src); + public String getPage() { + return (this.page); + } + public void setPage(String page) { + this.page = page; } /** - * Set the image src. - * - * @param value The image src. + * The message resources key of the context-relative URI of the image. */ - public void setSrc(String src) { - - this.src = src; + protected String pageKey = null; + public String getPageKey() { + return (this.pageKey); } - - /** - * Return the path of image. - */ - public String getPath() { - return (this.path); - + public void setPageKey(String pageKey) { + this.pageKey = pageKey; } /** - * Set the image path. - * - * @param value The image path. + * The name attribute for the image button. */ - public void setPath(String path) { + protected String property = ""; - this.path = path; + public String getProperty() { + return (this.property); + } + public void setProperty(String property) { + this.property = property; } + /** - * Return the isKey. + * The URL of this image. */ - public String getIsKey() { + protected String src = null; - return (this.isKey); + public String getSrc() { + return (this.src); + } + public void setSrc(String src) { + this.src = src; } /** - * Set the isKey value. - * - * @param value The isKey switcher. + * The message resources key for the URL of this image. */ - public void setIsKey(String isKey) { - - this.isKey = isKey; + protected String srcKey = null; + public String getSrcKey() { + return (this.srcKey); } + public void setSrcKey(String srcKey) { + this.srcKey = srcKey; + } // --------------------------------------------------------- Public Methods @@ -279,42 +248,30 @@ */ public int doEndTag() throws JspException { - if( isKey!=null ) { - MessageResources resources = (MessageResources) - pageContext.getAttribute( bundle, PageContext.APPLICATION_SCOPE); - if (resources == null) - throw new JspException - (messages.getMessage("messageTag.resources", bundle)); - Locale locale = null; - try { - locale = (Locale) - pageContext.getAttribute( localeKey, PageContext.SESSION_SCOPE); - } catch (IllegalStateException e) { // Invalidated session - locale = null; - } - if (locale == null) - locale = defaultLocale; - src = resources.getMessage( locale, src); - if( src==null ) - src = ""; - } - - // Acquire the alt label value we will be generating - String alt = value; - if ((alt== null) && (bodyContent != null)) - alt = bodyContent.getString().trim(); - if ((alt == null) || (alt.length() < 1)) - alt = "Submit"; - - // Generate an HTML element + // Generate an HTML <input type="image"> element + HttpServletResponse response = + (HttpServletResponse) pageContext.getResponse(); + String tmp = null; StringBuffer results = new StringBuffer(); results.append("<input type=\"image\" name=\""); results.append(property); - results.append("\" alt=\""); - results.append(alt); - results.append("\" value=\""); - results.append(value); - results.append("\""); + tmp = src(); + if (tmp != null) { + results.append(" src=\""); + results.append(response.encodeURL(ResponseUtils.filter(tmp))); + results.append("\""); + } + tmp = alt(); + if (tmp != null) { + results.append(" alt=\""); + results.append(tmp); + results.append("\""); + } + if (value != null) { + results.append(" value=\""); + results.append(value); + results.append("\""); + } if (accesskey != null) { results.append(" accesskey=\""); results.append(accesskey); @@ -325,24 +282,16 @@ results.append(tabindex); results.append("\""); } - results.append(" src=\""); - if( path != null ) - results.append(path); - results.append(src); - results.append("\""); results.append(prepareEventHandlers()); results.append(prepareStyles()); results.append(">"); // Render this element to our writer - JspWriter writer = pageContext.getOut(); - try { - writer.print(results.toString()); - } catch (IOException e) { - throw new JspException - (messages.getMessage("common.io", e.toString())); - } + ResponseUtils.write(pageContext, results.toString()); + + // Evaluate the remainder of this page return (EVAL_PAGE); + } @@ -352,7 +301,124 @@ public void release() { super.release(); - src = "submit"; + alt = null; + altKey = null; + bundle = Action.MESSAGES_KEY; + locale = Action.LOCALE_KEY; + page = null; + pageKey = null; + property = ""; + src = null; + srcKey = null; + + } + + + // ------------------------------------------------------ Protected Methods + + + /** + * Return the alternate text to be included on this generated element, + * or <code>null</code> if there is no such text. + * + * @exception JspException if an error occurs + */ + protected String alt() throws JspException { + + if (this.alt != null) { + if (this.altKey != null) { + JspException e = new JspException + (messages.getMessage("imgTag.alt")); + RequestUtils.saveException(pageContext, e); + throw e; + } else { + return (this.alt); + } + } else if (this.altKey != null) { + MessageResources resources = (MessageResources) + pageContext.getAttribute(this.bundle, + PageContext.APPLICATION_SCOPE); + if (resources == null) { + JspException e = new JspException + (messages.getMessage("imgTag.bundle", this.bundle)); + throw e; + } + Locale locale = null; + try { + locale = (Locale) + pageContext.getAttribute(this.locale, + PageContext.SESSION_SCOPE); + } catch (IllegalStateException e) { + locale = null; // Invalidated session + } + if (locale == null) + locale = defaultLocale; + return (resources.getMessage(locale, this.altKey)); + } else { + return (null); + } + + } + + + /** + * Return the base source URL that will be rendered in the <code>src</code> + * property for this generated element, or <code>null</code> if there is + * no such URL. + * + * @exception JspException if an error occurs + */ + protected String src() throws JspException { + + // Deal with a direct context-relative page that has been specified + if (this.page != null) { + if ((this.src != null) || (this.srcKey != null) || + (this.pageKey != null)) { + JspException e = new JspException + (messages.getMessage("imgTag.src")); + RequestUtils.saveException(pageContext, e); + throw e; + } + HttpServletRequest request = + (HttpServletRequest) pageContext.getRequest(); + return (request.getContextPath() + this.page); + } + + // Deal with an indirect context-relative page that has been specified + if (this.pageKey != null) { + if ((this.src != null) || (this.srcKey != null)) { + JspException e = new JspException + (messages.getMessage("imgTag.src")); + RequestUtils.saveException(pageContext, e); + throw e; + } + HttpServletRequest request = + (HttpServletRequest) pageContext.getRequest(); + return (request.getContextPath() + + RequestUtils.message(pageContext, bundle, + locale, this.pageKey)); + } + + // Deal with an absolute source that has been specified + if (this.src != null) { + if (this.srcKey != null) { + JspException e = new JspException + (messages.getMessage("imgTag.src")); + RequestUtils.saveException(pageContext, e); + throw e; + } + return (this.src); + } + + // Deal with an indirect source that has been specified + if (this.srcKey == null) { + JspException e = new JspException + (messages.getMessage("imgTag.src")); + RequestUtils.saveException(pageContext, e); + throw e; + } + return (RequestUtils.message(pageContext, bundle, + locale, this.srcKey)); } 1.7 +10 -15 jakarta-struts/src/share/org/apache/struts/taglib/html/ImgTag.java Index: ImgTag.java =================================================================== RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/ImgTag.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- ImgTag.java 2001/02/20 01:48:46 1.6 +++ ImgTag.java 2001/02/20 02:59:00 1.7 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/ImgTag.java,v 1.6 2001/02/20 01:48:46 craigmcc Exp $ - * $Revision: 1.6 $ - * $Date: 2001/02/20 01:48:46 $ + * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/ImgTag.java,v 1.7 2001/02/20 02:59:00 craigmcc Exp $ + * $Revision: 1.7 $ + * $Date: 2001/02/20 02:59:00 $ * * ==================================================================== * @@ -79,6 +79,7 @@ import org.apache.struts.util.MessageResources; import org.apache.struts.util.PropertyUtils; import org.apache.struts.util.RequestUtils; +import org.apache.struts.util.ResponseUtils; /** @@ -96,7 +97,7 @@ * * @author Michael Westbay * @author Craig McClanahan - * @version $Revision: 1.6 $ + * @version $Revision: 1.7 $ */ public class ImgTag extends BaseHandlerTag { @@ -509,13 +510,14 @@ String srcurl = url(tmp); if (srcurl != null) { results.append(" src=\""); - results.append(response.encodeURL(BeanUtils.filter(srcurl))); + results.append(response.encodeURL(ResponseUtils.filter(srcurl))); results.append("\""); } String lowsrcurl = url(this.lowsrc); if (lowsrcurl != null) { results.append(" lowsrc=\""); - results.append(response.encodeURL(BeanUtils.filter(lowsrcurl))); + results.append + (response.encodeURL(ResponseUtils.filter(lowsrcurl))); results.append("\""); } tmp = alt(); @@ -574,16 +576,9 @@ results.append(">"); // Print this element to our output writer - JspWriter writer = pageContext.getOut(); - try { - writer.print(results.toString()); - } catch (IOException e) { - pageContext.setAttribute(Action.EXCEPTION_KEY, e, - PageContext.REQUEST_SCOPE); - throw new JspException - (messages.getMessage("common.io", e.toString())); - } + ResponseUtils.write(pageContext, results.toString()); + // Evaluate the reaminder of this page return (EVAL_PAGE); }