On the other side of this coin, is it problematic to enable use of
linkName and (forward,href,page) together. 

Right now, it's an either/or. 

I tend to use the equivalent of <a name="{anchor}" href="{link}"> often.

[EMAIL PROTECTED] wrote:
> 
> craigmcc    01/03/06 09:00:50
> 
>   Modified:    src/share/org/apache/struts/taglib/html LinkTag.java
>   Log:
>   Correctly place any anchor ("#xxx") at the end of the generated hyperlink.
> 
>   Add a new "anchor" attribute, so that you can specify a (possibly calculated)
>   anchor that will be appended to the generated hyperlink.
> 
>   Submitted by:  Howard Moore <[EMAIL PROTECTED]>
>   PR: Bugzilla #707
> 
>   Revision  Changes    Path
>   1.5       +73 -105   
>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.4
>   retrieving revision 1.5
>   diff -u -r1.4 -r1.5
>   --- LinkTag.java      2001/02/08 01:08:15     1.4
>   +++ LinkTag.java      2001/03/06 17:00:50     1.5
>   @@ -1,13 +1,13 @@
>    /*
>   - * $Header: 
>/home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/LinkTag.java,v 1.4 
>2001/02/08 01:08:15 craigmcc Exp $
>   - * $Revision: 1.4 $
>   - * $Date: 2001/02/08 01:08:15 $
>   + * $Header: 
>/home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/LinkTag.java,v 1.5 
>2001/03/06 17:00:50 craigmcc Exp $
>   + * $Revision: 1.5 $
>   + * $Date: 2001/03/06 17:00:50 $
>     *
>     * ====================================================================
>     *
>     * 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]
>   @@ -86,7 +86,7 @@
>     * Generate a URL-encoded hyperlink to the specified URI.
>     *
>     * @author Craig R. McClanahan
>   - * @version $Revision: 1.4 $ $Date: 2001/02/08 01:08:15 $
>   + * @version $Revision: 1.5 $ $Date: 2001/03/06 17:00:50 $
>     */
> 
>    public class LinkTag extends BaseHandlerTag {
>   @@ -96,6 +96,20 @@
> 
> 
>        /**
>   +     * The anchor to be added to the end of the generated hyperlink.
>   +     */
>   +    protected String anchor = null;
>   +
>   +    public String getAnchor() {
>   +        return (this.anchor);
>   +    }
>   +
>   +    public void setAnchor(String anchor) {
>   +        this.anchor = anchor;
>   +    }
>   +
>   +
>   +    /**
>         * The logical forward name from which to retrieve the hyperlink URI.
>         */
>        protected String forward = null;
>   @@ -372,6 +386,7 @@
>        public void release() {
> 
>         super.release();
>   +        anchor = null;
>         forward = null;
>         href = null;
>            linkName = null;
>   @@ -414,8 +429,7 @@
>            if (n != 1) {
>                JspException e = new JspException
>                    (messages.getMessage("linkTag.destination"));
>   -            pageContext.setAttribute(Action.EXCEPTION_KEY, e,
>   -                                     PageContext.REQUEST_SCOPE);
>   +            RequestUtils.saveException(pageContext, e);
>                throw e;
>            }
> 
>   @@ -432,13 +446,19 @@
>             ActionForwards forwards = (ActionForwards)
>                 pageContext.getAttribute(Action.FORWARDS_KEY,
>                                          PageContext.APPLICATION_SCOPE);
>   -         if (forwards == null)
>   -             throw new JspException
>   +         if (forwards == null) {
>   +                JspException e = new JspException
>                     (messages.getMessage("linkTag.forwards"));
>   +                RequestUtils.saveException(pageContext, e);
>   +                throw e;
>   +            }
>             ActionForward forward = forwards.findForward(this.forward);
>   -         if (forward == null)
>   -             throw new JspException
>   +         if (forward == null) {
>   +                JspException e = new JspException
>                     (messages.getMessage("linkTag.forward"));
>   +                RequestUtils.saveException(pageContext, e);
>   +                throw e;
>   +            }
>             HttpServletRequest request =
>                 (HttpServletRequest) pageContext.getRequest();
>                href = RequestUtils.absoluteURL(request, forward.getPath());
>   @@ -451,116 +471,58 @@
>                href = RequestUtils.absoluteURL(request, page);
>            }
> 
>   +        // Save any currently specified anchor string
>   +        String anchor = this.anchor;
>   +        int hash = href.indexOf('#');
>   +        if (hash >= 0) {
>   +            if (anchor == null)
>   +                anchor = href.substring(hash + 1);
>   +            href = href.substring(0, hash);
>   +        }
>   +
>            // Append a single-parameter name and value, if requested
>   +        StringBuffer sb = new StringBuffer(href);
>            if ((paramId != null) && (paramName != null)) {
>                if (href.indexOf('?') < 0)
>   -                href += '?';
>   +                sb.append('?');
>                else
>   -                href += '&';
>   -            href += paramId;
>   -            href += '=';
>   -            Object bean = RequestUtils.lookup(pageContext,
>   -                                              paramName, paramScope);
>   -            if (bean != null) {
>   -                if (paramProperty == null)
>   -                    href += bean.toString();
>   -                else {
>   -                    try {
>   -                        Object value =
>   -                            PropertyUtils.getProperty(bean, paramProperty);
>   -                        if (value != null)
>   -                            href += value.toString();
>   -                    } catch (IllegalAccessException e) {
>   -                        pageContext.setAttribute(Action.EXCEPTION_KEY, e,
>   -                                                 PageContext.REQUEST_SCOPE);
>   -                        throw new JspException
>   -                            (messages.getMessage("getter.access",
>   -                                                 paramProperty, paramName));
>   -                    } catch (InvocationTargetException e) {
>   -                        Throwable t = e.getTargetException();
>   -                        pageContext.setAttribute(Action.EXCEPTION_KEY, t,
>   -                                                 PageContext.REQUEST_SCOPE);
>   -                        throw new JspException
>   -                            (messages.getMessage("getter.result",
>   -                                                 paramProperty, t.toString()));
>   -                    } catch (NoSuchMethodException e) {
>   -                        pageContext.setAttribute(Action.EXCEPTION_KEY, e,
>   -                                                 PageContext.REQUEST_SCOPE);
>   -                        throw new JspException
>   -                            (messages.getMessage("getter.method",
>   -                                                 paramProperty, paramName));
>   -                    }
>   -                }
>   -            }
>   +                sb.append('&');
>   +            sb.append(paramId);
>   +            sb.append('=');
>   +            Object value = RequestUtils.lookup(pageContext, paramName,
>   +                                               paramProperty, paramScope);
>   +            if (value != null)
>   +                sb.append(value.toString());
>            }
> 
>         // Just return the "href" attribute if there is no bean to look up
>         if ((property != null) && (name == null)) {
>             JspException e = new JspException
>                 (messages.getMessage("getter.name"));
>   -            pageContext.setAttribute(Action.EXCEPTION_KEY, e,
>   -                                     PageContext.REQUEST_SCOPE);
>   +            RequestUtils.saveException(pageContext, e);
>                throw e;
>   +        }
>   +     if (name == null) {
>   +            if (anchor != null) {
>   +                sb.append('#');
>   +                sb.append(anchor);
>   +            }
>   +         return (sb.toString());
>            }
>   -     if (name == null)
>   -         return (href);
> 
>         // Look up the map we will be using
>   -     Object bean = RequestUtils.lookup(pageContext, name, scope);
>   -        if (bean == null) {
>   -         JspException e = new JspException
>   -             (messages.getMessage("getter.bean", name));
>   -            pageContext.setAttribute(Action.EXCEPTION_KEY, e,
>   -                                     PageContext.REQUEST_SCOPE);
>   -            throw e;
>   +        Map map = null;
>   +        try {
>   +            map = (Map) RequestUtils.lookup(pageContext, name,
>   +                                            property, scope);
>   +        } catch (ClassCastException e) {
>   +            RequestUtils.saveException(pageContext, e);
>   +            throw new JspException
>   +                (messages.getMessage("linkTag.type"));
>            }
>   -     Map map = null;
>   -     if (property == null) {
>   -         try {
>   -             map = (Map) bean;
>   -         } catch (ClassCastException e) {
>   -                pageContext.setAttribute(Action.EXCEPTION_KEY, e,
>   -                                         PageContext.REQUEST_SCOPE);
>   -             throw new JspException
>   -                 (messages.getMessage("linkTag.type"));
>   -         }
>   -     } else {
>   -         try {
>   -             map = (Map) PropertyUtils.getProperty(bean, property);
>   -             if (map == null) {
>   -                 JspException e = new JspException
>   -                     (messages.getMessage("getter.property", property));
>   -                    pageContext.setAttribute(Action.EXCEPTION_KEY, e,
>   -                                             PageContext.REQUEST_SCOPE);
>   -                    throw e;
>   -                }
>   -         } catch (IllegalAccessException e) {
>   -                pageContext.setAttribute(Action.EXCEPTION_KEY, e,
>   -                                         PageContext.REQUEST_SCOPE);
>   -             throw new JspException
>   -                 (messages.getMessage("getter.access", property, name));
>   -         } catch (InvocationTargetException e) {
>   -             Throwable t = e.getTargetException();
>   -                pageContext.setAttribute(Action.EXCEPTION_KEY, t,
>   -                                         PageContext.REQUEST_SCOPE);
>   -             throw new JspException
>   -                 (messages.getMessage("getter.result",
>   -                                      property, t.toString()));
>   -         } catch (ClassCastException e) {
>   -                pageContext.setAttribute(Action.EXCEPTION_KEY, e,
>   -                                         PageContext.REQUEST_SCOPE);
>   -             throw new JspException
>   -                 (messages.getMessage("linkTag.type"));
>   -         } catch (NoSuchMethodException e) {
>   -                pageContext.setAttribute(Action.EXCEPTION_KEY, e,
>   -                                         PageContext.REQUEST_SCOPE);
>   -             throw new JspException
>   -                 (messages.getMessage("getter.method", property, name));
>   -         }
>   -     }
> 
>         // Append the required query parameters
>   -     StringBuffer sb = new StringBuffer(href);
>   +        href = sb.toString();
>         boolean question = (href.indexOf("?") >= 0);
>         Iterator keys = map.keySet().iterator();
>         while (keys.hasNext()) {
>   @@ -601,6 +563,12 @@
>                 sb.append(URLEncoder.encode(value.toString()));
>             }
>         }
>   +
>   +        // Append the anchor (if any)
>   +        if (anchor != null) {
>   +            sb.append('#');
>   +            sb.append(anchor);
>   +        }
> 
>         // Return the final result
>         return (sb.toString());
> 
> 
> 

-- Ted Husted, Husted dot Com, Fairport NY USA.
-- Custom Software ~ Technical Services.
-- Tel 716 737-3463.
-- http://www.husted.com/about/struts/

Reply via email to