• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Tim Cooke
  • paul wheaton
  • Paul Clapham
  • Ron McLeod
Sheriffs:
  • Jeanne Boyarsky
  • Liutauras Vilda
Saloon Keepers:
  • Tim Holloway
  • Carey Brown
  • Roland Mueller
  • Piet Souris
Bartenders:

Data Table: Can't update ResultSet from JSP page

 
Bartender
Posts: 1973
17
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hello,

I'm trying to update a resultSet when the user interacts with a selectBooleanCheckbox on the JSP page, but it's not working.

My Managed Bean & database query creates an updatedable PreparedStatement and I see the Data Table with the selectBooleanCheckbox column I added to the Data Table on the JSP page.

So far so good. I can click "Submit" on the JSP page and see the values of the ResultSet.

So far so good...

But, when I try to click the checkbox on the JSP page (a column in the Data Table), I get a serious (Tomcat???) 5.0.28 error:

"Attribute o-n-C-l-i-c-k invalid for tag selectBooleanCheckbox according to TLD"

Does this version of Tomcat support the o-n-c-l-i-c-k=s-u-b-m-i-t() logic?

The o-n-C-l-i-c-k() code comes right out of an example in Core JSF.

I tried to include the logic for the tag, but couldn't get past the JavaRanch illegal character screener. Oh well, it's just the standard on click equals submit ( ) logic.

My Managed Bean (backing bean) has the bean methods to handle the boolean property isSelected (that is, a getter and a setter).

----------------------------------

Without the o-n-C-l-i-c-k=s-u-m-b-i-t() in the selectBooleanCheckbox above, the code runs fine and displays results, ***UNLESS*** I check a checkbox in the data table.

If I check a check box in the data table and then click Submit (on the JSP page), I get no output at all. If I un-check that checkbox in the Data table and click Submit again, I again see data output. Strange.

I'm sure I'm "close"....

Please help!!!

Thanks in advance.

-- Mike
 
Mike London
Bartender
Posts: 1973
17
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
To add a little more info to my posting above....

The basic problem is that I'm going a query and get a populated Data Table. The submit button's action goes to an update method on the bean which works as long as I don't click any of the selectBooleancheckboxes on the Data Table.

The selectBooleancheckboxes correctly get checked on the initial loading of the Data Table depending on whether the database column has a 1 or 0.

*** BUT*** If I click one of the selectBooleancheckboxes that were populated by the database query, and click submit on the form, then ***NOTHING*** happens. I get no output. The update method does not fire. If I un-check them and submit again, all is fine -- the update method works.

What I'm trying to do is save back to the database the items the user has checked so I'm just trying to get a handle, so to speak, on the changes made to the Data Table.

I added the read/write properties to the backing bean, but they don't fire either.

The data table populates (the parent tag) initially with a getAll method.

This is incredibly confusing.

Any and all ideas would be appreciated.

Thanks.

-- M
 
Saloon Keeper
Posts: 28768
211
Android Eclipse IDE Tomcat Server Redhat Java Linux
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
"onclick" isn't Java, it's JavaScript, and on top of that, it's case-sensitive, so "onClick()" and "onclick()" aren't the same when you're talking TLDs.

Since onClick() is JavaScript (client-side code), it's probably not really what you wanted here unless you're trying to do AJAX-style coding. More likely what you really wanted was to handle rows that you tagged via checkboxes as a unit event.

If you've set up a JSF table and mapped it against an array or collection of rows, each of which has a boolean column mapped to a checkbox, it's as simple as polling the updated checkbox values when you handle the Submit button. That is,



Your exact code may vary, especially if you use the Java 5 iterator or have to do a Java 4 cast of the "get()" operation results.
 
Mike London
Bartender
Posts: 1973
17
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hey Tim!

Thanks for writing back...Here's a little more detail...

I've actually set up a Data Table and mapped it to an updatedable ResultSet & a prepared statment. The checkbox column is part of that ResultSet (mapped to an integer MySQL field).

The Data Table comes up, initially, fine, with checks (from the database) in the right rows for the Data Table with the checkbox so there doesn't seem to be a DB/JDBC problem.

The problem is that, after the Data Table appears populated, and then if I _check_ one of the checkboxes and click Submit, **NOTHING** happens. The method that normally fires when I click submit doesn't do anything. I stuck a breakpoint there, but nada.

But get this.... if I then remove the check I just checked and click Submit again, it works again.

Ouch.

Here's what the checkbox column definition looks like within the Data Table definition:

<h:column>
<f:facet name="header">
<h utputText value="#{msgs.selected}" />
</f:facet>
<h:selectBooleanCheckbox value="#{form.selected}" />
</h:column>

Then I have a method in the bean that has a getter/setter method. That method never fires either when I click the check box.

-------------------

Could the problem be that this checkbox is part of an (updateable) ResultSet and just doesn't take well to manual changes? This doesn't sound like it would be possible, but I'm not sure why the GUI stops working after I click a check box.

Maybe I need to do more to "wire up" the connection to the Managed Bean -- though it seems to be working unless I click the check box.

I hope to hear back from you again with ideas.

Thanks.

-- M
 
Ranch Hand
Posts: 15304
6
Mac OS X IntelliJ IDE Chrome
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator


I don't see anything in this code that would suggest any method would be called when you check/uncheck this checkbox.

What kind of updatable ResultSet are you wiring too? Not sure that this is the cause of your immediate problems, but unless the ResultSet object works offline, I would recommend moving to an object that contains your data but is not connected at all to the database. A Collection of some sort.

Also, what JSF implementation are you using?
 
Gregg Bolinger
Ranch Hand
Posts: 15304
6
Mac OS X IntelliJ IDE Chrome
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator


I tried to include the logic for the tag, but couldn't get past the JavaRanch illegal character screener. Oh well, it's just the standard on click equals submit ( ) logic.



Sorry, I didn't see that the first run through. That is probably why you didn't inlude the on click information...Still looking into this problem for you. I have setup a small test environment so I am running through some code.
 
Mike London
Bartender
Posts: 1973
17
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hi Gregg,

Thanks a lot for your reply. Here's some more detail. I'll get you as much detail as you need and work with you on this issue! <s>

I'm using MyEclipse 4.0.3 and added the JSF libraries from there.

The crucial issue is I don't know how to bind a column to an updateable resultSet. If I can't, what good is a resultSet to bind to a Data Table in the first place?

My Data Table comes up populated with the updateable ResultSet so I'm not sure how I could use a collection instead.

I checked the metadata and, sure enough the connection reports that its an updateable ResultSet with a data type of TINYINT(1) for the checkbox field.

I also tried to edit another column in the Data Table bound to the resultSet but also got conversion errors.

The checkboxes come up, initially, correctly checked or unchecked from the query, so I'm part way there (but still "no where" <g> .

I think my using the value ="#{tx.updated}" implies a read/only attribute, but using the binding tag didn't work either though using "binding=" did hit the Managed Bean's methods I set up. However, when you're bound to a resultSet, I don't think you'd want to have bean properties with getters/setters, right? That's what being bound to the updateable ResultSet is for (I think, anyway...).

The bottom line: I don't seem to know how to bind a control to an updateable ResultSet (or for that matter a JSTL Result). I haven't found a single example on it.

I'm probably missing something SO basic, but I've been trying to figure this out for over a week and gotten nowhere.

Regarding your other question, clicking Submit button is when I see the "conversion errors".

It's:

<h:commandButton value="#{msgs.saveText}" action="#{TableData.update}" />

It's interesting to note that cliking the Submit button also re-runs the method that populates the Data Table first. I never get to the 'update' method called for in the commandButton above.

--- Here's the column with the checkbox.

<%-- checkbox column --%>
<h:column>
<f:facet name="header">
<h utputText value="#{msgs.updated}" />
</f:facet>
<h:selectBooleanCheckbox value ="#{tx.updated}" />
<h:messages layout="table" />
</h:column>

=========

The method that populates the Data Table is this:
(Pseudo-code shown below)

String sql = "select ....?";
PreparedStatement stmt = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE );

// set the prepared Statement Parameter
stmt.setLong(1, variableGottenFromEnvironment);
resultSet = stmt.executeQuery();
model = new ResultSetDataModel(resultSet);
return model;

===========

Hope you can help me figure this out.

Please let me know if you need any additional information, OK?

Thanks very much in advance.

-- Mike
 
Consider Paul's rocket mass heater.
reply
    Bookmark Topic Watch Topic
  • New Topic