I was just wondering if I could get some hints and tips about wall strafing, and collision detection in general.
This is actually the HARDEST part of 3D game programming for me. For some reason, the math and physics of it all makes my head spin after a while. It starts simple, with something like AABB or simple sphere collisions, paired with penetration measurements so you can backup/strafe/slide the moving object appropriately. Then you realize that you need to do "over-time" collision detection to prevent rare, yet occasional warping through objects. Mix that with the eventual "need" to do more bounding shapes; adding complex and convex hulls and the like. It turns into a huge mess for those of us not blessed with grade A minds.
Anyway, because of that death spiral, my recommendation is to find the absolute easiest collision detection and response system that you can get away with. If you're in 3D, start with spheres OR AABB, but not both. ONLY go further if you absolutely HAVE to. Also, consider using something prebuilt (like jBullet) if you want something more advanced (don't try to reinvent the wheel on this one).
Also, looking at your code, you probably don't want to be calling the "didCollideTerrain()" method multiple times (I'm assuming that's where your math is for detecting the collision). Try to setup a method that both detects and returns all of the variables you need to respond to the collision. Loop through your collidable objects once to gather the data, then loop through once more for the response. Also, don't just set your object to it's previous position; rather, create a reverse vector built off of how far your "player" has penetrated into the other object.
Phew... is that enough for now?
I'd also recommend looking into some books. Something like Brackeen's "Developing Games in Java" or for something to really make your head pop, Ericson's "Real-time Collision Detection."