There are various solutions, but none of them will allow a 100% plain web app (i.e. no Flash, Java or ActiveX) to connect directly to a 100% plain VNC server. The biggest issue is that web browsers cannot make plain TCP connections. The closest thing is the incomplete WebSockets standard, but even that is a framed protocol that has a HTTP-like handshake to initiate it.
Even though Adobe Flash programs can make plain TCP connections, they still require that the server you are connecting to answer with a policy file either on port 843 or the port you are connecting to (http://code.google.com/p/doctype/wiki/ArticleFlashSecurity).
As has been noted, Guacamole requires a Java proxy to communicate between their HTML5 based interface and the VNC server.
Another option is noVNC (github) which has a full VNC client implementation in Javascript/HTML5 (unlike Guacamole where the VNC protocol is in the proxy). However, noVNC is still limited by the fact that Javascript cannot make plain TCP connections. noVNC uses WebSockets to connect to the server. noVNC includes a generic WebSockets to TCP bridge that you can run on the server (or the client for that matter) and it has no extra dependencies to install.
Update: QEMU, PocketVNC and projects derived from LibVNCServer now have built-in WebSocket server support so the websockify bridge is not needed to connect with noVNC. Also, I forgot to note as a disclaimer that I created noVNC.