I started with Java before the advent of EJB, Servlets and Java EE. And it was a huge mess. You had to implement business code agains (too) many, completely different, not even similar application servers. You didn't had any chance to take even a simplistic server side application from one product and install it on another. Some application servers were half "native" and half "pure Java". Also it was absolutely impossible to be knowledgable in more than two products.

The introduction of Servlets, JNDI, EJBs, JMS, JDBC, RMI simplified the development, but the portability still suffered. You could not rely on the availability of a give API on all servers.

The old J2EE brought ...simplicity. With the advent of J2EE in 1999 you knew what you could expect of a certified server. Ironically: J2EE was too simple and incomplete.

For me J2EE and later Java EE brought simplicity and productivity, and I always was puzzled by developers stating "J2EE is too complex" and implementing home-grown infrastructure instead.

In 2014 Java EE 7 is still the most productive, and simple platform:

Java EE is probably the best documented platform. The documentation, specification, samples and even the reference implementation are free and available on the release day. You "only" have to learn the APIs. All the documentation is free. The core programming model is based on injection and dependency injection JSR-330 used by many other frameworks in the same way, even the exact same annotations (thanks to Rod Johnson and Bob Lee for this). You cannot escape JMS, JPA, Servlets sometimes JAX-RS and JCA. Even if you choose a Java EE alternative, you will have to learn these specs. At the same time you can learn Java EE programming model based on Convention over Configuration and Dependency Injection in few minutes. All modern Java EE Application Servers can be installed in seconds. IDE integration is also very good. Because the server comes already with all the "plumbing", your WARs are going to be skinny and the turn-around cycles very fast. The Java EE community is vibrant. JUGs and conference sessions are sold out and Java EE articles are very popular. After the commercial support for GlassFish was cancelled, many of my clients decided to move to WildFly or TomEE. The "migration" went surprisingly smooth. I don't have to discuss "best of breeds" technologies or constantly bundle APIs "à la carte". At the very first project day you can start implementing the business logic. Without any initial overhead. Java EE effectively prevents meetings and superfluous discussions. It is hard to find any other leaner platform. With Java EE you can build either complex applications, or simplistic CRUD use case with the minimal amount of code. It is good to know, that I'm not alone. Many startups this year chosen Java EE ...because of productivity.

[See also an in-depth discussion in the "Real World Java EE Patterns--Rethinking Best Practices" book (Second Iteration, "Green Book"), page 7 in, chapter "A Brief History of Java EE"]