Páginas estáticas
El cliente solicita una página que se encuentra en el servidor y el servidor envía al cliente la página tal cual la tiene alojada, sin hacerle ninguna modificación en función de la petición del cliente o de cualquier otro parámetro.
Contenedor de aplicaciones vs Servidor de aplicaciones
Un Contenedor de aplicaciones
Sólo alberga Servlets (aplicaciones Java).
JEE es una especificación que determina las APIs para construir una aplicación corporativa. Por tanto, los diferentes servidores de aplicaciones deberán tener ciertas clases que harán lo que J2E determina, aunque la implementación de sus clases difiera.
JEE nace de la necesidad de tener aplicaciones distribuídas. Una aplicación distribuída es aquella en la que sus componentes (el código que la compone) se ejecuta en varios entornos (ordenadores). Para unir todos esos entornos se utiliza el servidor web.
Un servidor de aplicaciones
Permite ejecutar aplicaciones con EJB. Un Contenedor de aplicaciones es un software que puede vivir dentro de un servidor de aplicaciones.
Algunos ejemplos de servidores de aplicaciones
De pago
- WebLogic (Oracle)
- JBoss Enterprise Application Platform (Red Hat)
- WebSphere (IBM)
Gratuitos
- JOnAS (Object Web)
- Wildfly (Versión de JBoss por la comunidad)
- GlassFish (Oracle)
- Gerónimo y TomEE (Apache)
EJB
EJB - es una API de java que implementa diferentes servicios:
- permite persistir una jerarquía de clases en una base de datos (igual que Hibernate).
- facilita la realización de transacciones complejas.
- facilita la interacción entre diferentes servidores (invocar desde un servidor métodos de otro).
- facilita la implementación de seguridad en el proyecto.
- reduce la velocidad de proceso, ya que se hacen más operaciones de las necessarias
- la curva de aprendizaje es bastante pronunciada
Cargar apache Tomcat en Eclipse
Descargar el servidor apache tomcat de internet
http://tomcat.apache.org
Cargar un servidor en eclipse
Menú Window → Preferences → Server → Runtime Enviroment → Add → Apache Tomcat v.9 → Next
Browse → Seleccionamos la ubicación del servidor.
JRE → Seleccionamos la ubicación del jdk.
Ejercicio - crear dos páginas estáticas
Crear un proyecto dynamic web project con dos páginas estáticas. Una contiene un enlace, de tal forma que al pulsar sobre el mismo lanzaremos una petición que hará que lleguemos a la otra página.
Peticiones al servidor: GET vs POST
GET: Hey servidor! Mira lo que te mando en la URL y haz algo, quieres?!
POST: Hey servidor! Mira lo que te mando en mi cuerpecito y haz algo quieres?!
- GET es más rápido que POST.
- El número de caracteres que puedes enviar utilizando GET es limitado y depende del servidor.
- La información enviada por GET se puede visualizar en la URL, y por tanto no podríamos enviar información delicada (passwords, etc.)
Servlet
Descargar WorkspaceEs una clase Java que se ejecuta en el contexto de un servicio de red y su misión es recibir y responder a las peticiones de uno o más clientes.
El servlet lee cosas del request y escribe cosas en el response.

Fichero web.xml, dentro de la carpeta WEB-INF
Contiene información sobre la configuración de nuestro proyecto web.
Inicialmente contiene una <welcome-file-list>, que indica el fichero que se va a ir a buscar al acceder al servidor.
Ejercicio: crear el paquete de los servlets
Java resources: src → New package
Por convenio, el paquete suele empezar por el nombre del dominio dado la vuelta.
Ej:
pablomonteserin.com → com.pablomonteserin
Ejercicio: crear un nuevo servlet
Selecciono el paquete → Botón derecho → new → Servlet
Al hacer esto se crea una referencia al servlet en el web.xml que debemos actualizar si renombramos el servlet. De lo contrario obtendríamos un error 404 al ejecutar el servlet:
Nota:
Para ejecutar el servlet:
Btn derecho sobre el código → Run as → Run on server
Alt + shift + x + r
Para cada servlet...
Al hacer una petición, esta busca en los servlet-mapping un url-pattern que coincida con la misma. Si encuentra coincidencia buscará el servlet-class a partir del servlet-name recién obtenido.
<servlet-mapping>
<servlet-name>A_HolaMundo</servlet-name>
<url-pattern>/A_HolaMundo</url-pattern>
</servlet-mapping>
<servlet>
<description>
</description>
<display-name>A_HolaMundo</display-name>
<servlet-name>A_HolaMundo</servlet-name>
<servlet-class>com.pablomonteserin.servlets.A_HolaMundo</servlet-class>
</servlet>
A partir de Java 7, con la especificación de Servlets 3.0, es posible cambiar estas entradas en el fichero web.xml, por anotaciones:
@WebServlet("/saludar")
public class NoSeQueNoSeCuantoServlet extends HttpServlet {
...
Ejercicio: crear un Servlet hola mundo
package com.pablomonteserin.servlets;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class A_HolaMundo extends HttpServlet {
private static final long serialVersionUID = 1L;
public A_HolaMundo() {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Hola mundo!");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
Librerías necesarias
Btn derecho sobre el proyecto → Properties → Java build path → libraries

Add JARs → añade un jar a partir de nuestra carpeta de proyecto.
Add External JARs → añade un jar ubicado en una carpeta de nuestro equipo.
Add Library → añade una librería a partir de las que se encuentren disponibles. Ya que nuestro propio servidor TomCat cuenta con librerías para desplegar las aplicaciones, dependiendo del servidor al que hayamos vinculado eclipse, podremos añadir o no ciertas librerías.
Servlet's live
public class ServletLive extends HttpServlet {
private static final long serialVersionUID = 1L;
public ServletLive() {
super();
System.out.println("Constructor");
}
@Override
public void init() throws ServletException {
System.out.println("Inicio");
super.init();
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("Service");
super.service(arg0, arg1);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet");
destroy();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
@Override
public void destroy() {
super.destroy();
System.out.println("Fin");
}
}
Salida:
Constructor
Inicio
Service
doGet
Fin
Recuperar parámetros del browser
Pondremos el parámetro en el propio broswer:
http://localhost/proyecto/servlet?param1=valor1¶m2=valor2
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String nombre = request.getParameter("param1");
response.getWriter().append("Adios " + nombre);
}
Ejercicios
Suma
Hacer un servlet que recoja de la url dos números y calcule la suma. Enviaremos los datos desde un formulario web.
Calculadora
Hacer un servlet que recoja de la url la operación (suma, resta, multiplicación, división), opere en consecuencia y muestre el resultado en una página web. Enviaremos los datos desde un formulario de una página HTML.
Notas: Para evitar problemas, mejor usar la palabra ”sumar” en vez del símbolo +, etc...
Ejercicio CRUD con BD (Create, Read, Update, Delete)
Este ejercicio es una ampliación del anterior.
Hacer un servlet que pueda realizar 4 operaciones en función de un parámetro action que le llegue: alta, baja, modificación y consulta.
Estas operaciones serán evaluadas mediante sentencias condicionales if dentro del servlet. Luego llamaremos a un método de la clase Servicio en el que se efectuará la conexión y la correspondiente operación sobre la base de datos
Para la conexión a la base de datos usaremos un método estático definido por nosotros, llamado getConnection(), de una clase Java llamada Conexion que nosotros crearemos.
La tabla sobre la que opera el servlet tiene tres campos id(int, PK), titulo(String), precio(int).
La operación de consulta devolverá una colección de beans Libro que recorreremos en el servlet.