I try to explain what i know:
J2EE is basically a specification that estabilish how to construct web application but not only.
Application Server like Jboss, WebSphere, Tomcat and others are compliant to J2EE.
Framework like Struts or Spring help you to configure and develop web application based on servlet which are some of the basically element which j2ee web application relies on.
To understand better how they works i suggest this article which starts from some definition of a j2ee application:
I hope that it can help you.
that was quite interesting, but I was more interested in undertanding when and where to sue each technology, and how they fit together.
I understand that all J2EE App Servers provide support for Servlets, JSP, Messaging etc, but I was realy wondering if you had to use something like JBoss or Websphere to host things like Spring!
Spring is composed by some jar that you include in your j2ee project to give it some functionality, then you can package your application and deploy it to Application server. These are only words which can mean nothing, if you try to follow the step by step i gave you, i'm sure you understand more.
That is a really really big question to answer. I would suggest starting out on the Sun site and start with the three SDKs, J2ME, J2SE, and J2EE, which essentially all build upon each other.
Then from there you can see different packages that have been developed for diffent SDKs levels.