I’m just trying to get started with Java EE and related concepts. However, I’m having some trouble understanding the relations between some technologies and the roles they play.
As far as I understand, a Java EE Servlet is a Java class that runs inside a server, and generates responses to requests (typically HTML responses to HTTP requests, though Servlets can theoretically serve any protocol).
My questions:
- As far as I understand, I can either write a Servlet class directly, or I can use some technology like JSP or JSF, which will then generate/provide a Servlet for me. At any rate, the Java EE web container (e.g. Apache Tomcat) where I ultimately run my app will only see Servlets, and will not care how they were created (so Servlets are kind of a low level plumbing). Is that true?
- If Servlets are kind of low-level, is there any reason to actually use Servlets directly? I have seen many tutorials that explain how to write a Servlet, but that seems rather unpractical. Is there any situation where writing a Servlet directly is better/preferred to using JSP or similar?
- Finally, Servlets need a server to run in (e.g. Apache Tomcat). When reading about servers in that context, I’ve seen various names such as (Java EE) web container, or servlet container, or JSP container, or just Java EE server. Do these terms all mean the same, or is there a difference?
Thanks for helping me get started!
When the container loads the servlet, no, it won’t care much where it came from. That said, different containers handle this differently when it comes to things like dynamic loading and stuff like that, but I wouldn’t worry much about it.
Servlets are low level. They’re the base abstraction upon which all of the other Java EE web frameworks are based. In the “real world”, most of the time, people will use some higher level framework rather than a raw Servlet.
That said, Servlets are still useful when you actually want to get to that “bare metal” (well as bare as Servlets get) interface to an HTTP request. For simple things, it’s just easier to write a Servlet than stand up a bunch of framework jars and such.
As far as containers, the distinction is basically Java EE server vs Servlet container or server. Tomcat is NOT a Java EE server, it only handles the web portion of the Java EE stack. To confuse things, Java EE 6 now has a “web-profile”, which is basically the Servlet stack, but whereas before a Servlet container couldn’t be consider a “Java EE Server”, now it can be a “Java EE Server – Web Profile”.
Yea, I don’t know what it means either.
The key difference is that the Servlet containers (Tomcat, Jetty, Resin) don’t come bundled with the rest of the Java EE stack (notably EJBs), but have several other components that are part of the overall Java EE stack.
If you’re just getting in to Java EE, I would pick a full boat container (like Glassfish) since a) you can, b) it’s easy (GF is trivial to setup) and, c) you won’t have to second guess what is or isn’t included in your container vs whatever you’re reading about requires. GF will have “everything” that is Java EE. It won’t have Spring, for example, as that’s not Java EE, but if it’s in your Java EE book or web site article, GF will have it.
Later you can choose when you want the full kit or just want to use something like Tomcat or not.