see my comments below...

| chris wilson || web dev ||| [EMAIL PROTECTED] || | www.wondergeek.com |
|

> -----Original Message-----
> From: Craig R. McClanahan [mailto:[EMAIL PROTECTED]]
> Sent: Tuesday, January 09, 2001 3:32 PM
> To: [EMAIL PROTECTED]
> Subject: Re: Can I use a Map.Entry as a bean?
>
>
> Chris Wilson wrote:
>
> > here's a simple example  of what i'm talking about.  would one of your
> > wizards please try this servlet and jsp page to see what i'm
> talking about?
> > thanks very much!
> >
>
> I did some playing with this as well.  It seems to be a Java API issue --
> Map.Entry is an inner class, so apparently Java reflection APIs
> are not allowed
> to call it's methods dynamically (the way that the Struts tags
> need to in order
> to be generalized :-(.

i suspected that might be the case...

>
> As you noted, using mapEntry.getKey() and mapEntry.getValue()
> directly seems to
> work, so we could cheat if need be -- but I would hate to start
> special casing
> the code in <bean:write> (and all the other tags that can access
> properties) for
> wierd situations like this ...

i agree, i wouldn't advocate hacking struts to 'fix' special cases like
this.  interestingly enough, the <jsp:getProperty ... /> tag fails in the
same way.  oh well...  i will work around it.  just wanted to make sure i
wasn't crazy/doing something wrong.

cheers!

>
> Craig
>
>
> >
> > i tried this on tomcat 3.2.1, jdk 1.3, win 2000
> >
> > ###### Begin TestServlet.java ######
> >
> > import javax.servlet.http.HttpServlet;
> > import javax.servlet.http.HttpServletRequest;
> > import javax.servlet.http.HttpServletResponse;
> > import javax.servlet.ServletException;
> > import java.util.HashMap;
> > import java.io.IOException;
> >
> > public class TestServlet extends HttpServlet {
> >    public void doGet(HttpServletRequest req, HttpServletResponse res)
> >    throws ServletException, IOException {
> >       HashMap map = new HashMap();
> >       map.put("test", "hope this works");
> >       map.put("foo", "bar");
> >       req.setAttribute("map", map);
> >       getServletContext().getRequestDispatcher("/display.jsp").forward(
> >          req, res);
> >    }
> > }
> >
> > ###### End TestServlet.java ######
> >
> > ###### Start display.jsp ######
> >
> > <%@ taglib uri="struts-logic.tld" prefix="logic" %>
> > <%@ taglib uri="struts-bean.tld" prefix="bean" %>
> > <html>
> > <head>
> >         <title>display.jsp</title>
> > </head>
> >
> > <body>
> > <logic:iterate name="map" id="entry" scope="request"
> > type="java.util.Map.Entry">
> > <!-- i get an IllegalAccessException when running the following two
> > lines -->
> > <!-- delete the following two lines to elimate the
> > IllegalAccessException -->
> > <bean:write name="entry" property="key" scope="page" /> ->
> > <bean:write name="entry" property="value" scope="page" /><br>
> > <!-- why dosen't this work? -->
> > <!-- end delete -->
> >
> > <!-- these two lines work!  they don't throw an exception -->
> > <!-- they are functionally equivelent to the above two lines right? -->
> > <%=
> ((java.util.Map.Entry)pageContext.getAttribute("entry")).getKey() %> ->
> > <%= ((java.util.Map.Entry)pageContext.getAttribute("entry")).getValue()
> > %><br>
> > </logic:iterate>
> > </body>
> > </html>
> >
> > ###### End display.jsp ######
> >
> > | chris wilson || web dev ||| [EMAIL PROTECTED] || |
> www.wondergeek.com |
> > |
> >
> > > -----Original Message-----
> > > From: Chris Wilson [mailto:[EMAIL PROTECTED]]
> > > Sent: Thursday, January 04, 2001 10:46 AM
> > > To: [EMAIL PROTECTED]
> > > Subject: RE: Can I use a Map.Entry as a bean?
> > >
> > >
> > > yes,
> > >
> > > i've included both taglib defs...  in fact, the tags are
> working great.
> > > it's only the write tag that's having a problem, and only when i
> > > try to get
> > > a property on a Map.Entry
> > >
> > > <bean:write name="subjectEntry" property="value" scope="page"
> /> // this
> > > fails with an IllegalAccessException...
> > >
> > > ((java.util.Map.Entry)pageContext.getAttribute("subjectEntry)).get
> > > Value() //
> > > this works!
> > >
> > > if i use my own bean in the write tag, everything is dandy.
> it's just the
> > > dang Map.Entry!
> > >
> > > | chris wilson || web dev ||| [EMAIL PROTECTED] || |
> > > www.wondergeek.com |
> > > |
> > >
> > > > -----Original Message-----
> > > > From: Ted Husted [mailto:[EMAIL PROTECTED]]
> > > > Sent: Thursday, January 04, 2001 10:11 AM
> > > > To: Struts List
> > > > Subject: Re: Can I use a Map.Entry as a bean?
> > > >
> > > >
> > > > So, you've included the Struts bean tag library along with
> logic, yes?
> > > >
> > > > <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
> > > > <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
> > > >
> > > > You can get some weird and misleading error messages if you omit a
> > > > taglibs you're using.
> > > >
> > > > The inner class shouldn't cause a problem, since the iterate tag is
> > > > designed for that (an attribute or property of an attribute).
> > > >
> > > > For more troubleshooting, did you try setting the inner class as a
> > > > standalone page attribute, to see if that works too?
> > > >
> > > > *********** REPLY SEPARATOR  ***********
> > > >
> > > > On 1/4/2001 at 9:17 AM Chris Wilson wrote:
> > > >
> > > > hello,
> > > >
> > > > sorry to post this similar message again, but i'm really stumped...
> > > >
> > > > i've run into a problem however trying to use the iterate tag with a
> > > > TreeMap
> > > > and the write tag...  here's a snippet of my code:
> > > >
> > > > <logic:iterate name="subjects" id="subjectEntry" scope="request"
> > > > type="java.util.Map.Entry">
> > > > // subjects is a TreeMap in the request object... no problem there
> > > > // it's my understanding that when the iterate tag is used
> with a map,
> > > > the
> > > > // iterator is on the Set of Map.Entries returned by
> Map.entitySet(),
> > > > // therefore the object exposed as subjectEntry should be a
> > > > java.util.Map.Entry
> > > >
> > > > <bean:write name="subjectEntry" property="value" scope="page" />
> > > > // this is where i get an IllegalAccessException attempting
> to access
> > > > the
> > > > //property value of subjectEntry, even though there is a getValue()
> > > > method
> > > > in the
> > > > //api...
> > > >
> > > > </logic:iterate>
> > > >
> > > > just for fun, i replaced the write tag above with the following
> > > > scriptlet
> > > > which i believe is logically equivalent:
> > > > <%=
> > > >
> ((java.util.Map.Entry)pageContext.getAttribute("subjectEntry)).getValue(
> > > > )
> > > > %>
> > > >
> > > > and that works!  of course, i could simply use this scriptlet and my
> > > > problem
> > > > would be solved, but i'd like to use only taglibs if possible and it
> > > > seems
> > > > to me that the <bean:write> tag should do the same thing...
> > > >
> > > > will <bean:write> only work on "bean-like" objects that are
> public?  in
> > > > this
> > > > case the object implementing the Map.Entry interface is an
> inner class
> > > > in
> > > > TreeMap.  is that causing the problem?
> > > >
> > > > what am i missing?  thanks for any help!
> > > >
> > > > cheerio,
> > > > chris
> > > >
> > > > | chris wilson || web dev ||| [EMAIL PROTECTED] || |
> > > > www.wondergeek.com |
> > > > |
> > > >
> > > >
> > > >
> > > >
> > >
> > >
>
>

Reply via email to