| Aspecto | JSP (JavaServer Pages) | JSF (JavaServer Faces) |
|---|---|---|
| Tipo | Tecnología de vistas | Framework web completo |
| Modelo | Basado en páginas | Basado en componentes |
| Arquitectura | MVC (con Servlets) | MVC propio integrado |
| Ejecución | Servidor | Servidor |
| Cliente recibe | HTML, CSS, JS | HTML, CSS, JS |
| Uso de Java en vista | ✔ Directo (scriptlets, EL) | ❌ No directo |
| Importar clases | <%@ page import="paquete.Clase" %> |
❌ No en vista |
| Expresiones | ${} |
#{} |
| Acceso a lógica | Directo o con Servlets | Mediante Managed Beans |
| Anotaciones | ❌ No | ✔ Sí (@ManagedBean, @Named) |
| Estado | Stateless | Stateful |
| Reutilización | Baja | Alta |
Tecnología Java EE que permite embeber código Java dentro de HTML para generar contenido dinámico en el servidor. El servidor compila la página JSP en un Servlet en tiempo de ejecución.
Cliente → Petición HTTP
↓
Servidor (Tomcat)
↓
¿Primera vez?
Sí → Compilar JSP → Servlet → ejecutar → HTML
No → Usar Servlet ya compilado → HTML
↓
Respuesta HTTP (HTML al cliente)
| Elemento | Sintaxis | Uso |
|---|---|---|
| Scriptlet | <% código Java %> |
Ejecutar código Java |
| Expresión | <%= valor %> |
Imprimir valor en HTML |
| Declaración | <%! método/variable %> |
Declarar miembros de clase |
| Directiva de página | <%@ page ... %> |
Configurar la página |
| Directiva de importación | <%@ page import="pkg.Clase" %> |
Importar clases Java |
| Comentario JSP | <%-- comentario --%> |
No se envía al cliente |
| EL (Expression Language) | ${expresion} |
Acceder a beans/atributos |
<%@ page import="java.util.Date" %>
<html>
<body>
<% String nombre = "Opositor"; %>
<p>Hola, <%= nombre %></p>
<p>Fecha: ${pageContext.response.locale}</p>
</body>
</html>
| Objeto | Tipo | Descripción |
|---|---|---|
request |
HttpServletRequest |
Datos de la petición |
response |
HttpServletResponse |
Datos de la respuesta |
session |
HttpSession |
Sesión del usuario |
application |
ServletContext |
Contexto de la aplicación |
out |
JspWriter |
Escritura de salida |
pageContext |
PageContext |
Contexto de la página |
config |
ServletConfig |
Configuración del Servlet |
page |
Object |
La propia página (this) |
exception |
Throwable |
Solo en páginas de error |
Framework MVC orientado a componentes para el desarrollo de interfaces web en Java EE. Define un ciclo de vida propio y separa completamente la vista de la lógica mediante Managed Beans.
Vista (Facelets .xhtml)
↕ #{bean.propiedad}
Managed Bean (lógica + estado)
↕
Capa de servicio / modelo
1. Restore View → Reconstruir el árbol de componentes
2. Apply Request Values → Poblar componentes con datos enviados
3. Process Validations → Ejecutar validadores
4. Update Model Values → Actualizar propiedades del Managed Bean
5. Invoke Application → Ejecutar la acción del usuario
6. Render Response → Generar HTML y enviar al cliente
⚠️ Si hay error en validación, se salta directamente a la fase 6 (Render Response).
| Componente JSF | ¿Qué hace? |
|---|---|
| UI Components | Elementos visuales (inputs, botones, tablas) |
| Managed Bean | Lógica de negocio / controlador |
| Validator | Valida datos de entrada |
| Converter | Convierte tipos de datos |
| Renderer | Genera la salida (HTML) |
| Navigation Handler | Controla navegación entre páginas |
| FacesContext | Contexto de ejecución |
| ❌ NO es componente JSF |
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean(name = "usuarioBean")
@SessionScoped
public class UsuarioBean {
private String nombre;
public String getNombre() { return nombre; }
public void setNombre(String n) { this.nombre = n; }
public String login() {
// lógica de autenticación
return "inicio"; // nombre de la vista destino
}
}
| Scope | Anotación | Duración |
|---|---|---|
| Request | @RequestScoped |
Una petición HTTP |
| View | @ViewScoped |
Mientras el usuario está en la vista |
| Session | @SessionScoped |
Duración de la sesión |
| Application | @ApplicationScoped |
Vida de la aplicación |
<!DOCTYPE html>
<html xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head><title>Ejemplo JSF</title></h:head>
<h:body>
<h:form>
<h:inputText value="#{usuarioBean.nombre}" />
<h:commandButton value="Enviar" action="#{usuarioBean.login}" />
</h:form>
</h:body>
</html>
#{} vs ${}| Expresión | Framework | Evaluación |
|---|---|---|
${} |
JSP / EL estándar | Inmediata (al renderizar) |
#{} |
JSF / EL unificada | Diferida (en el ciclo de vida JSF) |
─────────────────────────────────────────────────────────
JSP
Browser ──GET/POST──▶ Servlet ──lógica──▶ JSP (.jsp)
│ genera HTML
Browser ◀──HTML──────────────────────────────┘
─────────────────────────────────────────────────────────
JSF
Browser ──POST──▶ FacesServlet
│
[Ciclo de vida 6 fases]
│
Managed Bean (lógica)
│
Facelets (.xhtml) → HTML
│
Browser ◀──HTML───────┘
─────────────────────────────────────────────────────────
JSP es una tecnología de vistas que convierte páginas con código Java embebido en Servlets en el servidor; usa ${} para EL y scriptlets <% %> para lógica directa. Es stateless y de baja reutilización.
JSF es un framework MVC completo orientado a componentes reutilizables; separa vista (Facelets .xhtml) de lógica (Managed Beans anotados con @ManagedBean), usa #{} para EL diferida y gestiona un ciclo de vida de 6 fases.
La diferencia clave para el examen: JSF es stateful (mantiene estado del árbol de componentes), JSP es stateless; JSF accede a la lógica solo mediante Managed Beans, nunca con código Java en la vista; el Depurador NO es un componente JSF.