O COMMON STACK basicamente significa ter um PADRÃO. O stack J2EE é um padrão utilizado em tecnologias distribuídas.
Contém tecnologias tanto de front end quanto de back end.
Para as tecnologias de front end, inicialmente os desenvolvedores tinham que lidar apenas com Servlets e JavaServer Pages (JSP), o que não era uma ideia muito ótima para criar Interfaces de Usuário baseadas na Web. O Struts resolveu o problema em certa medida, mas implicava uma quantidade considerável de trabalho repetitivo.
A introdução do JavaServer Faces (JSF) ajudou a resolver ainda mais o problema, pois é uma linguagem de marcação e pode ser executada em qualquer cliente. O modelo de navegação do JSF é semelhante ao Struts e utiliza beans gerenciados para fornecer lógica empresarial.
A próxima camada no stack é o framework do contêiner EJB que lida com chamadas de procedimentos remotos e semântica transacional para que o desenvolvedor possa se concentrar na lógica empresarial real.
Embora existam várias opções para o back end, as 2 tecnologias de back end dominantes são Hibernate e CMP. Também podemos implementar POJO em sistemas distribuídos usando contêineres leves.