struts-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "atta-ur rehman" <at...@numetrics.com>
Subject Re: Indexed Properties
Date Tue, 29 Jul 2003 18:35:04 GMT
Bingo!

The deceptive ActionForm.getBlock(int):Block was not there. Just added it
and wow!

This is opened up a whole paradigm for me. I can see how easy and manageable
code becomes not to mention its reduced size! Its just what i've been
looking for, for quite sometime! Learning new things pays, after all ;)

My sincere thanks for your help and patience! It took some time, but was
worth it!

ATTA


----- Original Message ----- 
From: "Nicholas L Mohler" <Nicholas_L_Mohler@raytheon.com>
To: "Struts Users Mailing List" <struts-user@jakarta.apache.org>
Sent: Tuesday, July 29, 2003 11:19 AM
Subject: Re: Indexed Properties


>
>
>
>
>
> Hi Atta
>
> Just to clatify:
> 1)  You have a form that contains a "blocks" property which is a
collection
> of "test.Block" objects.
> 2)  The "test.Block" object has the following properties(get/set methods
> for each): id, name, and category
> 3)  As we discussesed in our earlier emails, you have the get/set methods
> for the "blocks" property in your form.
> 4)  You also have a singular "getBlock" method that takes an int (index)
> and returns the "Block" object from the collection for the given index.
>
> A couple possible causes for the error:
> -  Item 4) is not implemented correctly.  You need the method shown below.
> Note that since your form is in the session, you shouldn't need the
> "sizing" logic.
> public Block getBlock(int index) {
>   while (index >= this.blocks.size()) {
>     this.blocks.add(new Block());
>   }
>   return (Block) this.blocks.get(index);
> }
>
> -  When looking at your page, look at the source and confirm that your
> indexed properties are named correctly.  You should see block[0].id,
> block[0].name, block[0].category.
>
> If none of this helps, I'm not sure where else to look.  It sounds like
> everything else is lining up...
>
> Nick
>
>
>
>
>

>                       "atta-ur rehman"
>                       <attar@numetrics.        To:       "Struts Users
Mailing List" <struts-user@jakarta.apache.org>
>                       com>                     cc:
>                                                Subject:  Re: Indexed
Properties
>                       07/29/2003 12:57
>                       PM
>                       Please respond to
>                       "Struts Users
>                       Mailing List"
>
>
>
>
>
>
> Hello again Nick.
>
> Well i've come a step forward in that i've been able to successfully show
> the jsp page using index="true" for all the rows and submit the form
> without
> any errors too:
>
> <logic:iterate name="theForm" property="blocks" id="block"
> type="test.Block">
>    <tr>
>     <td align="center">
>      <html:text property="id" name="block" indexed="true" />
>     </td>
>     <td>
>      <html:text property="name" name="block" indexed="true" />
>     </td>
>     <td>
>      <html:select property="category" name="block" indexed="true">
>       <html:options collection="optionList" property="value"
> labelProperty="label"/>
>      </html:select>
>     </td>
>    </tr>
>   </logic:iterate>
>
> works like a charm!
>
> What i'm still missing what is updated when i submit the form? where can i
> get updated values from? my ActionForm has list attirbute called "blocks"
> each element in the list is a Block bean object. The Block bean has
> getter/setters for id, name and category.
>
> In ActionForm I also included setCategory(int) and getCategory(int,
string)
> which doesn't seem to be called at all!
>
> something obvious that i'm missing?
>
> Thanks.
>
> ATTA
>
>
> ----- Original Message -----
> From: "Nicholas L Mohler" <Nicholas_L_Mohler@raytheon.com>
> To: "Struts Users Mailing List" <struts-user@jakarta.apache.org>
> Sent: Tuesday, July 29, 2003 2:57 AM
> Subject: Re: Indexed Properties
>
>
> >
> >
> >
> >
> >
> > Atta,
> >
> > It sounds to me like you have it.  As long as your names match up, it
> > should work fine.  Ajay has given a full code example that looks good.
> >
> > Nick
> >
> >
> >
> >
> >                       "atta-ur rehman"
> >                       <attar@numetrics.        To:       "Struts Users
> Mailing List" <struts-user@jakarta.apache.org>
> >                       com>                     cc:
> >                                                Subject:  Re: Indexed
> Properties
> >                       07/28/2003 08:44
> >                       PM
> >                       Please respond to
> >                       "Struts Users
> >                       Mailing List"
> >
> >
> >
> >
> >
> >
> > Yes, I currently have two independent String arrays for blockName and
> > blockType. Putting them, and all the other block related properties, is
> > what
> > seems to be the right thing to do! So you have confirmed.
> >
> > here is what i have understood from your text:
> >
> > 1) my form would have "blocks" property that would be a collection of
> Block
> > beans
> > 2) iterating each block in the blocks collection i can sure display each
> > block with "indexed=true" directive for text boxes and dropdowns.
> > 3) now for the submission part i'd need to have setBlockType(int,
string)
> > and getBlockType(int) and same for the rest of properties. The name of
> > property in the Block Form and name of the property in the Block Bean
> must
> > match.
> > 4) and it should work?
> >
> > I've had my head stuck in my computer whole day today and i'm barely
able
> > to
> > write this email :) Tommorrow morning i'd come back and confirm it by
> > running it. meanwhile I'd appreciate if you could confirm these 4 points
> > i've noted above!
> >
> > Thankyou very much for your help. It really did help.
> >
> > Regards,
> >
> > ATTA
> >
> >
> > ----- Original Message -----
> > From: "Nick" <nmohler@adelphia.net>
> > To: "'Struts Users Mailing List'" <struts-user@jakarta.apache.org>
> > Sent: Monday, July 28, 2003 5:08 PM
> > Subject: RE: Indexed Properties
> >
> >
> > > Hi Atta,
> > >
> > > No problem with the assistance.  Just hope that I can be helpful :-)
> In
> > > the cases where I use indexed properties, the property is part of a
> > > larger object.  It sounds to me like you have two arrays in your form
> > > class: one for blockName and one for blockType.  I would suggest
> > > creating a bean with the two properties, and then have a collection of
> > > those objects in your form.
> > >
> > > Building on my previous example, you'd have something like this:
> > >  <logic:iterate name="blocks" id="oneBlock"
> > >          type="com.myco.beans.Block">
> > >      <td>
> > >        <html:text name="oneBlock" property="blockName" indexed
> ="true"/>
> > >      </td>
> > >      <td>
> > >        <html:select name="oneBlock" property="blockType"
> > >                     indexed="true" size="1">
> > >           <html:options name="myForm" property="blockTypes"/>
> > >        </html:select.
> > >      </td>
> > >  </logic:iterate>
> > >
> > > This example assumes your collection of blockTypes is part of your
> form,
> > > but it could be a collection that was in request/session/application
> > > scope.  You would create form entries for the collection like you
> > > implemented in our previous emails.
> > >
> > > I have almost this exact code in a few places and it works well.
> > >
> > > Hope this helps.
> > > Nick
> > >
> > > -----Original Message-----
> > > From: atta-ur rehman [mailto:attar@numetrics.com]
> > > Sent: Monday, July 28, 2003 3:37 PM
> > > To: Struts Users Mailing List
> > > Subject: Re: Indexed Properties
> > >
> > > Thanks, for the reply.
> > >
> > > Okay, here is the background. I'm trying to learn the user of Indexed
> > > Properties. Why I'm doing that? Well, I have a form that lists, let's
> > > say
> > > for the sake of simplicity, Block Name and Block Type columns. Block
> > > Name is
> > > a readonly text field while the Block Type is a dropdown list box with
> a
> > > set
> > > of reference values  coming from the database. User can have n blocks
> on
> > > the
> > > page and he can change the block type of any block on the page. user
> > > cannot
> > > define a new block on this page.
> > >
> > > In my form I've got String[] getter/setters for blockName and
blockType
> > > properties. In my action, I set both these arrays reading from the
> > > database.
> > > Block Names show allright, but the block type dropdown, that is using
> > > html:select tag, shows same type for all the blocks irrespective of
the
> > > type
> > > of the block read from database.
> > >
> > > Now a few days back i asked a question on this forum regarding how to
> > > have
> > > my dropdowns display the right block type as set in the blockType
> > > String[]
> > > property of the form. Someone, I think it was Wendy Smoak, and i've
> seen
> > > quite a lot of helpful mails from him, mentioned that Indexed
> Properties
> > > might be the way go. Althogh, he also mentioned that he hasn't used
> > > them.
> > >
> > > I solved the problem by using "value" property of html:select tag. the
> > > doc
> > > says that "value" property denotes the value of the listbox that would
> > > be
> > > used to select an item in the list. so far so good.
> > >
> > > now the kind of guy i'm, i thought why not try it thrue index
> properties
> > > and
> > > learn something new ;) so i set out to learn indexed properties. read
> > > some
> > > articles and still i'm not sure what i'm missing.
> > >
> > > Hope this gives you the background and thanks once more for taking
some
> > > out
> > > to hlep me.
> > >
> > > ATTA
> > >
> > > ----- Original Message -----
> > > From: "Nicholas L Mohler" <Nicholas_L_Mohler@raytheon.com>
> > > To: "Struts Users Mailing List" <struts-user@jakarta.apache.org>
> > > Sent: Monday, July 28, 2003 1:09 PM
> > > Subject: Re: Indexed Properties
> > >
> > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > Atta,
> > > >
> > > > The complaint you are getting is because the property "fruit" is not
> a
> > > > property of the "oneF" bean.  That the oneF object is not a bean
with
> > > > properties will give you problems.  Depending on your goal, you need
> > > to do
> > > > something different.  What are you trying to do?
> > > >
> > > > I'm off work in a minute, but I'll check messages at home later this
> > > > evening and see if I can help at all.
> > > > Nick
> > > >
> > > >
> > > >
> > > >
> > > >                       "atta-ur rehman"
> > > >                       <attar@numetrics.        To:       "Struts
> Users
> > > Mailing List" <struts-user@jakarta.apache.org>
> > > >                       com>                     cc:
> > > >                                                Subject:  Re: Indexed
> > > Properties
> > > >                       07/28/2003 03:44
> > > >                       PM
> > > >                       Please respond to
> > > >                       "Struts Users
> > > >                       Mailing List"
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > Thanks very much Nick! It was indeed helpful. I was missing
> > > getter/setter
> > > > for individual list items!
> > > >
> > > > now my form has following methods:
> > > > private String[] fruit = {"Apple", "Orange", "Banana"};
> > > >
> > > > public List getFruits() {
> > > >
> > > > return Arrays.asList(this.fruit);
> > > >
> > > > }
> > > >
> > > > public void setFruits(List l) {
> > > >
> > > > this.fruit = (String[]) l.toArray();
> > > >
> > > > }
> > > >
> > > >
> > > > public String getFruit(int index) {
> > > >
> > > > if (this.fruit == null) return "null";
> > > >
> > > > return this.fruit[index];
> > > >
> > > > }
> > > >
> > > > public void setFruit(int index, String f) {
> > > >
> > > > this.fruit[index] = f;
> > > >
> > > > }
> > > >
> > > > my JSP has following has this html:iterator:
> > > >
> > > > <logic:iterate name="theForm" property="fruits" id="oneF"
> > > > type="java.lang.String" >
> > > >    <tr>
> > > >     <td align="center">
> > > >      hi!
> > > >     </td>
> > > >     <td>
> > > >      <html:text property="fruit" name="oneF" indexed="true" />
> > > >     </td>
> > > >    </tr>
> > > >   </logic:iterate>
> > > >
> > > > and exception i get is this:
> > > >
> > > > javax.servlet.jsp.JspException: No getter method for property fruit
> of
> > > bean
> > > > oneF
> > > >              at
> > > > org.apache.struts.util.RequestUtils.lookup(RequestUtils.java:968)
> > > >
> > > >
> > > > i think it has to do with the fact that my individual fruit is a
> > > string
> > > > object rather than being a bean in itself if some getter method(s)?
> > > >
> > > > can you see what's going wrong!
> > > >
> > > > Thanks again.
> > > >
> > > > ATTA
> > > >
> > > > ----- Original Message -----
> > > > From: "Nicholas L Mohler" <Nicholas_L_Mohler@Raytheon.com>
> > > > To: "Struts Users Mailing List" <struts-user@jakarta.apache.org>
> > > > Sent: Monday, July 28, 2003 11:58 AM
> > > > Subject: Re: Indexed Properties
> > > >
> > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > Atta,
> > > > >
> > > > > You can use indexed properties in your ActionForm class.  The key
> is
> > > > having
> > > > > all of the correct methods in your form class.
> > > > >
> > > > > 1)  Getter and setter:  You need a get/Set method for the
> collection
> > > that
> > > > > you refer to in your jsp.  for example:
> > > > > public Collection getLocations()
> > > > > public void setLocations(Collection locs)
> > > > >
> > > > > 2) Getter and setter for one instance in the collection.  The name
> > > that
> > > > you
> > > > > use must match the name you define in your jsp as a single
instance
> > > from
> > > > > the collection (specified as the id).  For example:
> > > > >     <logic:iterate name="locations" id="oneLocation"
> > > > >             type="com.myco.toolkits.beans.Location">
> > > > >         <td>
> > > > >             <html:text name="oneLocation" property="locationName"
> > > indexed
> > > > > ="true"/>
> > > > >         </td>
> > > > >         <td>
> > > > >             <html:text name="oneLocation" property
> ="locationAddress"
> > > > > indexed="true"/>
> > > > >         </td>
> > > > >     </logic:iterate>
> > > > >
> > > > > Your form should in this case have the following get/set methods:
> > > > > public com.myco.toolkits.beans.Location getOneLocation(int index)
> > > > > public void setOneLocation(int index,
> > > com.myco.toolkits.beans.Location
> > > > > oneLocation)
> > > > >
> > > > > Your code may never use either of the "oneLocation" methods, but
> > > they
> > > are
> > > > > important for Struts.  When your page is submitted, your two
> indexed
> > > > > properties will be submitted as oneLocation[ix].locationName &
> > > > > oneLocation[ix].locationAddress where ix is the index of the row
> > > (0-10
> > > > for
> > > > > example).  As Struts proceses the indexed items, Struts will use
> the
> > > > > "getOneLocation" method to get the Collection instance for the
> > > provided
> > > > > index.  This method must resize the collection as needed and then
> > > return
> > > > > the object for the provided index.  For example, if your
collection
> > > has
> > > > no
> > > > > objects and the getter receives an index of 2, the method should
> > > load
> > > the
> > > > > first three (0, 1, 2) collection locations with an initialized
> > > object
> > > and
> > > > > return the third object.  Struts will then populate the
appropriate
> > > > > property in that object.
> > > > >
> > > > > As an aside, I tend to use the ArrayList object as my collection
> > > type
> > > > when
> > > > > working with indexed properties, but I know that the Vector works
> > > equally
> > > > > well.  A simple array will work fine, but the logic to expand the
> > > size
> > > is
> > > > a
> > > > > little more involved.
> > > > >
> > > > > Let me know if this helps.
> > > > > Nick
> > > > >
> > > > >
> > > > >
> > > > >
> > > ---------------------------------------------------------------------
> > > > > To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
> > > > > For additional commands, e-mail:
> struts-user-help@jakarta.apache.org
> > > > >
> > > > >
> > > >
> > > >
> > > >
> > >
> ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
> > > > For additional commands, e-mail: struts-user-help@jakarta.apache.org
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > >
> ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
> > > > For additional commands, e-mail: struts-user-help@jakarta.apache.org
> > > >
> > > >
> > >
> > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
> > > For additional commands, e-mail: struts-user-help@jakarta.apache.org
> > >
> > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
> > > For additional commands, e-mail: struts-user-help@jakarta.apache.org
> > >
> > >
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
> > For additional commands, e-mail: struts-user-help@jakarta.apache.org
> >
> >
> >
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
> > For additional commands, e-mail: struts-user-help@jakarta.apache.org
> >
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: struts-user-help@jakarta.apache.org
>
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: struts-user-help@jakarta.apache.org
>
>



---------------------------------------------------------------------
To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: struts-user-help@jakarta.apache.org


Mime
View raw message