Cactus - seems to be the ideal choice when it comes to performing server side (servlet, JSP) unit tests. Since it proposes an incontainer approach your client testcases are reflected on the server container before your actual classes are unit tested. The prime focus is on integration testing.
The only cons I see is that they dont have a plugin for Eclipse where you can run off your tests like we do for JUnit. I use RAD integrated with Tomcat and Cactus lends very well with Tomcat. However the missing plugin uncovers some of the complexities in running these tests using Ant or through a manual deployment process using browser.
HTTPUnit: Have used this tool a lot - very good from a functional testing standpoint, you can build your own wrappers around it to customize as per the needs of your application
JWebUnit - was initally written as a wrapper to HTTPUnit, now it is being recirculated as a wrapper to HTMLUnit which seems to have a better JS support. This framework encourages writing easy testcases.
I have mostly used HtmlUnit and JWebUnit in past, after briefly checking out Canoo Web Test (too much xml for my taste at that time )
I tried JWebUnit for a while. It really simplifies the usage of HtmlUnit, but I found it falling behind in its support of newer versions of HtmlUnit. Ended up writing my own simple wrapper for HtmlUnit.
My comment about Canoo Web Test having too much XML was only half serious. XML may be suitable for many cases, but in my case, many of the tests were going to have similar steps, and I wanted to factor that out into a base class. If anyone knows how to define certain steps, and parameterize and use them from different Canoo XML files, I will be really interested in hearing about it.