struts-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rick Reumann" <rick.reum...@gmail.com>
Subject Re: Accessing a row in a table on a JSP page.
Date Wed, 03 Oct 2007 14:33:59 GMT
On 10/2/07, JohnLangan <langanj@homes.com> wrote:
>
> I call the database and create an ArrayList of beans to hold the data. Using
> JSTL I iterate over the list
> to display the data in an html table inside a form in a JSP page.
>
> <c:set var="dataItems" value="${lmdao.listingManagerData}" />
> <c:forEach var="item" items="${dataItems}" varStatus="row" >
> I can give each row a number using ${row.index}
>
> The last but one column is a Struts html:select that allows the user to
> select what they want to do next. The last column contains a button to press
> to implement the selected action. So far so good.
>
> My problem is that in whichever row the button is pressed it always acts on
> the data in the first row.

You can do what you want, but you have to be careful when working on
items in a collection  like that based off the index. Personally, I'd
like to work off some unique id that represents that item and do
another lookup of it when I get to my Action.

For example...
<c:forEach items="${myList} item="foo">
   <tr>
       <td><a href="/EditMe.do?id=${foo.id}">${foo.name}</td>
   </tr>
</c:forEach>

Now, when the user clicks that link(or you can make it a button also),
you go to Action and look up tthe item from the db again and set up
the form to display for the user to edit on the next page.

If you want to use the collection approach. You have to first fix a few things.
First off using <c:set var="dataItems" value="${lmdao.listingManagerData}" />
will be VERY bad.  Imagine you display your list after the above, now
you pick the 3rd item. How do you plan to get the 3rd item again? Are
you going to call that lmdao.getListinManagerData again in your action
and then pick the 3rd index? For one, the list might have changed so
now you are editing the wrong one, and also, why get the whole list
again? If you go that route your much better using the approach I
showed. The list index approach will work if you first put that list
in session scope BEFORE you go to your page and then you'd just do

//no c:set - use the session scoped list...
<c:forEach var="item" items="${dataItems}" varStatus="row" >
   <tr><td><a href="/DoSomething.do?index=${row.index}">${item.name}</td></tr>
</c:forEach>

Now you have the index when you click on the link so in your next
action you can pull the list out of session scope and then get the
item. (Again, I'm not a huge fan of this approach - mainly because now
you just stuffed a large collection in the session that really doesn't
need to be there. Approach one doesn't have this problem.)

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


Mime
View raw message