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" <[EMAIL PROTECTED]> To: "Struts Users Mailing List" <[EMAIL PROTECTED]> 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" > <[EMAIL PROTECTED] To: "Struts Users Mailing List" <[EMAIL PROTECTED]> > 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" <[EMAIL PROTECTED]> > To: "'Struts Users Mailing List'" <[EMAIL PROTECTED]> > 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:[EMAIL PROTECTED] > > 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" <[EMAIL PROTECTED]> > > To: "Struts Users Mailing List" <[EMAIL PROTECTED]> > > 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" > > > <[EMAIL PROTECTED] To: "Struts Users > > Mailing List" <[EMAIL PROTECTED]> > > > 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" <[EMAIL PROTECTED]> > > > To: "Struts Users Mailing List" <[EMAIL PROTECTED]> > > > 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: [EMAIL PROTECTED] > > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]