Weil ich mich langweile:
Servlets: im Prinzip normale Java-Klassen, deren Eingabe und Ausgabe dem Post/Get des HTML-Servers entsprechen.
Vorteil: Sehr flexibel, man kann damit alles machen, was man sich wünscht.
Nachteil: man muß quasi per "println" die gesamte HTML-Seite erzeugen: dadurch sind Code und Layout nicht voneinander getrennt.
JSP: Java-Code ist in HTML-Code eingebettet. Wird vom Servlet-Container (Tomcat o.ä.) erst bei Bedarf in ein Servlet überführt und kompiliert (im Gegensatz zu Servlets, die als kompilierte Klassen auf dem Server liegen).
Vorteil: man kann die Seite wie gewohnt in HTML gestalten und fügt dynamische Komponenten an Ort und Stelle ein.
Im Zusammenspiel mit Beans und Servlets läßt sich so Code und Layout sauber trennen.
Nachteil: große Funktionalitäten zu implementieren wird leicht unübersichtlich und schlecht wartbar.
-> Richtig sinnvoll ist in den meisten Fällen die Kombination aus Servlets, Beans und JSP.
JSP zur Ausgabe von Daten in einem bestimmten Format (z.B. Ausgabemaske einer Datenbank).
Servlets für Ausgabe, die kein starres oder ein sehr einfaches Layout haben (Listen/Diagramme usw.).
Beans zum Einlesen der Daten aus Eingabemasken.
Bei großen Projekten kann sich der Einsatz eines Frameworks wie Struts oder Cocoon lohnen. JSF (Java Server Faces) schlägt in die selbe Kerbe. Für kleinere Privatprojekte ist das aber IMHO unnötiger Ballast.