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" <[EMAIL PROTECTED]> To: "Struts Users Mailing List" <[EMAIL PROTECTED]> 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" > <[EMAIL PROTECTED] To: "Struts Users Mailing List" <[EMAIL PROTECTED]> > 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" <[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] > > > > > > > --------------------------------------------------------------------- > 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]