I think the most important distinction between HttpServletResponse.send*(...) methods and using a RequestDispatcher is that the former are all part of the HTTP communication between server & browser, where the RequestDispatcher is specific to internal communication within your application server.
When you call sendRedirect, an HTTP "Location:" header is added to the send buffer to be flushed to the client. You're using the HttpServletResponse interface to speak HTTP to the client browser. And then you're done talking to the browser!
I use the sendRedirect when the servlet cannot fulfill the request, for example when a login is required (redirect to login page), or required form data is missing (redirect back to form). Basically, I'm just sending back in HTTP "I can't help you, go HERE".
When you use a RequestDispatcher, you're passing the request & response objects back to your app server, and telling it to do further work in order to fulfill the request. The browser never sees any of these URIs where the request & response objects are being dispatched.
RequestDispatcher plays a major role in Front Controller
Pattern or MVC. The majority of my servlets serve no content directly, but look at the incoming data, and then use a RequestDispatcher to dispatch the request (and response) onto the appropriate worker and/or
JSP template.