The GET operation is also expected to be idempotent, meaning that it can safely be repeated. This is not quite the same as being safe, but in some common examples the requirements have the same result. For example, repeating queries is both safe and idempotent (unless payment is required!), but buying something or modifying data is neither safe nor idempotent.
I teach Java in a technical post-secondary school. We use a doPost that calls a doGet mostly for teaching purposes - that way, the students can use doGet and therefore, see the name/value pairs being passed to the server, and then, when they are ready for "production release", simply change their method to post. The doPost has one line of code in it - which calls the doGet and passes the appropriate request & response objects. Seeing the name/value pairs makes it easier for the beginning students to see what their program bugs might be. I recommend it to them as a development tool, but tell them that they would normally change it to a post before installing the program.