It's one thing to bounce a little form with a couple of fields back and forth between a browser and an idle web server. It's another to saddle a user with a screen full on a busy server. I've had that experience as a user, and if I was on a site that I could avoid, I'd just close the browser. As the interactive experience deteriorates because of the constant bouncing of a large complicated form, the slower the server gets. Very unfriendly and very bad for business.
While returning the same form with error messages right on it is the right (although well-known) approach, the friendliness is enhanced by cagey use of both client-side and server-side validation. We have code that keeps the submit buttons inoperative until all manditory fields are completed, the manditory fields are labeled in red as a visual clue, the field content errors are presented field-by-field or as a group depending on the flow of the form, and the server-side processing is limited to protecting the application and the database.