I have a JSP where I am showing date and description from database. Every entry has a unique id, but I am not showing on the page(showing checkbox) These entries are thrown using a "logic:iterate", so the number of rows is always changing based on entries. Now these fields are shown as a text field so that the user can also update the date or description. A checkbox is to the left so the user can select what all values they want to update. Remember the logic:iterate above, the checkbox has to be defined using name and cannot have id.
...
...
<logic:notEmpty name="specialResult" scope="request">
<logic:iterate name="specialResult" id="specialResult" indexId="index">
<tr align="center">
<td width="15%">
<input type="checkbox" name="upisActive" property="upisActive"
value="<bean:write name="specialResult" property="upId"/>"></input></td>
<td width="15%"><input type="text" name="upDate" value="<bean:write name="specialResult" property="upDate"/>"
property="upDate" size="20" class="Date" id="Date"></input></td>
<td width="15%"><input type="text" name="upDesc" value="<bean:write name="specialResult" property="upDesc"/>"
property="upDesc" size="20" id="Desc"/></td>
</tr>
</logic:iterate>
...
My error is that if I have three rows and I want to update third row and select third checkbox. My Action class is retrieving the first row date and desc. How can I edit my action class to retrieve the value against the checked checkboxes?
public ActionForward class(ActionMapping mapping, ActionForm theForm,
HttpServletRequest request, HttpServletResponse response) throws IOException,
SQLException, ServletException
{
Connection conn = null;
Service Serv = new Service();
List updList = new ArrayList();
Form upForm = (Form) theForm;
String[] values = request.getParameterValues("upisActive");
try
{
conn = getConnection(request, false);
for (int i=0;i<values.length;i++){
VO hdvo = new VO(); //Vo class with getters and setters
val = values[i];
hdvo.setDate(upForm.upDate[i]);
hdvo.setDesc(upForm.upDesc[i]);
updList.add(hdvo);
}
hdServ.updTest(updList, conn);
...
The problem is with how you've set up your page. You have all checkboxes with the same name (standard setup) but you also have the
upDate
andupDesc
fields also set up with the same name.That means that when you submit your form, on the server you will get (considering your example) a list of 3
upDate
values, a list of 3upDesc
values and a list of 3upisActive
checkboxes. Well... not quite!The problem is your checkboxes and the code you use to read the values to update.
First, checkboxes are not sent on the request if they are not checked. That means that, depending on your selection, on the server you will get a list of
upisActive
values of length 0, 1, 2 or 3.Second, you then have this code on the server:
In you example, you check the third checkbox and submit your form. That means that
String[] values
will be of length 1 because only the selected checkbox is send to the server. But the input fields are always sent in 3upDesc
and 3upDate
.Then you loop-it (once) and extract
upForm.upDate[0]
andupForm.upDesc[0]
. This way, you update the first row by checking the third checkbox.Other problems:
1) You have used the same identifier in the following code (it's asking for trouble):
2) You are using classic inputs and added
property
attribute to it:3) Not sure that the browser guaranties that the fields will be sent in the exact matching order each time, so using a single counter is, I guess, just "hoping" for the same order.
4) Also, read this