580 likes | 703 Views
Servlets y JSPs. Servlets: Introducción. Módulos que amplían los servidores orientados a petición/respuesta . La respuesta en el lenguaje Java a los CGIs (Common Gateway Interface) para construir páginas “en el momento”. Poder basarse en datos del usuario. La información varía en el tiempo.
E N D
Servlets: Introducción • Módulos que amplían los servidores orientados a petición/respuesta. • La respuesta en el lenguaje Java a los CGIs (Common Gateway Interface) para construir páginas “en el momento”. • Poder basarse en datos del usuario. • La información varía en el tiempo. • Usar información de una base de datos.
Servlets: Ventajas sobre los CGIs • Eficiencia: JVM. • Facilidad de uso y aprendizaje. • Potentes: Comunicación directa con el servidor. • Portables. • Baratos, porque hay programadores Java • Las del Lenguaje Java
Servlets: Jerarquía • La jerarquía de clases java es... • Nosotros heredamos de HttpServlet!
Tipos de peticiones por formulario Un formulario puede enviar la información al servidor de dos formas: • GET: Paso de parámetros en la propia URL de acceso al servicio o recurso del servidor. Método “doGet” del servlet • POST: Lo mismo que GET pero los parámetros no van en la línea de URL sino en otra línea a parte. El manejo es idéntico. Método “doPost” del servlet.
Servlets: Métodos doGet y doPost • Son llamados desde el método “service”. • Reciben interfaces instanciadas: • “HttpServletRequest” para manejo de la informacion enviada por el usuario. • “HttpServletResponse” para poder enviar una respuesta en forma de pagina web. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException Habitualmente, implementamos uno de los dos y desde el otro delegamos en el implementado, de forma que pueda responder ambos tipos de peticiones.
Servlets: Respondiendo en HTML • La salida del servlet será, habitualmente, un documento HTML. 2 pasos: • Indicar la cabecera de la respuesta el tipo de contenido que vamos a retornar. El caso más habitual será devolver HMTL, aunque tb podemos devolver, por ejemplo, una imagen generada en tiempo de ejecución. • Al ser un proceso tan común existe un método que nos lo soluciona directamente: “setContentType” de “HttpServletResponse”. • Crear y enviar código HTML válido. • Ej: HolaMundoServlet
Servlets: Recogiendo la información de usuario. • En CGI, recoger parámetros de un usuario era muy tedioso. Con servlets, trabajamos SIEMPRE con objetos java. • Los parámetros nos llegan en la request, que representa el objeto de tipo HttpServletRequest que recibimos en la invocación del doXXX(…). • HttpServletRequest.getParameter(nombre) devuelve: • “” (si no hay valor) • null (si no existe). • El valor en caso de haber sido establecido.
Servlets: Políticas de acceso concurrente (threading) • Los servlets están diseñados para soportar múltiples accesos simultáneos por defecto. • Ojo! El problema puede surgir cuando se hace uso de un recurso compartido. Ej, abrimos un fichero desde un servlet. • Solución, • Hacer que el recurso sea el que posea la política de acceso concurrente.
Servlets: Ciclo de vida • Ciclo de vida de un servlet:
Servlets: Ciclo de vida INICIALIZACIÓN: • Una única llamada al metodo “init” por parte del servidor. public void init(ServletConfig config) throws ServletException • Se pueden recoger unos parametros concretos con “getInitParameter” de “ServletConfig”. Estos parámetros se especifican en el descriptor de despligue de la aplicación: web.xml DESTRUCCIÓN: • Cuando todas las llamadas desde el cliente cesen o un temporizador del servidor así lo indique. Se usa el método “destroy” public void destroy()
Ejemplo de Servlet con parámetros: HolaMundo Personalizado • Página con un formulario que nos pasa el parámetro “Nombre”: <html> <head> <title>Ejemplo "Mi Primer Servlet"</title> </head> <body> <form action=“http://localhost:8080/servlet/MiPrimerServlet” method=POST> <BR> <BR>Introduzca un texto en el cuadro y pulse "Submit"<BR> <BR> <input type=“text” name=“NOMBRE”> <BR> <BR><input type=submit><input type=reset></form> </body> </html>
Ejemplo de Servlet con parámetros: HolaMundo Personalizado // MiPrimerServlet.java import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class MiPrimerServlet extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { PrintStream out = new PrintStream(res.getOutputStream()); res.setContentType("text/html"); String Nombre = req.getParameter(“NOMBRE"); out.println("<p>Hola Mundo! Bienvenido : "+Nombre+"</p>"); } }
Gestión de la Sesión del Usuario. Mantenimiento del estado de la sesión. • El protocolo HTTP no posee la capacidad de almacenar estados. • Se complican mucho las tareas de guardar las acciones (Ej, las Compras) de un usuario. • Posibles soluciones: • Cookies. • Añadir información en la URL • Usar campos ocultos de formularios (HIDDEN) • Empleo del objeto HttpSession del servlet.
Servlets: Seguimiento de sesión • Los servlets proporcionan una solución técnica: La API HttpSession. • Una interfaz de alto nivel construida sobre los cookies y la reescritura de las urls (pero transparente para el desarrollador). • Permite almacenar objetos.
Servlets: Seguimiento de sesión • Pasos para trabajar con sesiones: • BUSCAR EL OBJETO HttpSession ASOCIADO A UNA PETICIÓN: Se usa el método “getSession” de “HttpServletRequest” que devuelve null si no hay una sesión asociada. Entonces podríamos crear una pero al ser una tarea sumamente común, se pasa true y él mismo se encarga de crear una.
Servlets: Seguimiento de sesión • AÑADIR y RECUPERAR INFORMACION DE UNA SESION • Método getAttribute(“nombre_variable”). Devuelve: • Una instancia de Object en caso de que la sesión ya tenga algo asociado a la etiqueta nombre_variable • null en caso de que no se haya asociado nada aún. • Método setAttribute(“nombre_variable”, referencia ). Coloca el objeto referenciado por referencia en la sesión del usuario bajo el nombre nombre_variable. A partir de este momento, el objeto puede ser recuperado por este mismo usuario en sucesivas peticiones. Si el objeto ya existiera, lo sobrescribe. • Método getAttributes() retorna una Ennumeration con los nombres de todos los atributos establecidos en la sesión del usuario.
Servlets: Seguimiento de sesión getId. Este método devuelve un identificador único generado para cada sesión. Algunas veces es usado como el nombre clave cuando hay un sólo valor asociado con una sesión, o cuando se uso la información de logging en sesiones anteriores. isNew. Esto devuelve true si el cliente (navegador) nunca ha visto la sesión, normalmente porque acaba de ser creada en vez de empezar una referencia a una petición de cliente entrante. Devuelve false para sesión preexistentes. getCreationTime. Devuelve la hora, en milisegundos desde 1970, en la que se creo la sesión. Para obtener un valor útil para impresión, pasamos el valor al constructor de Date o al método setTimeInMillis de GregorianCalendar. getLastAccessedTime. Esto devuelve la hora, en milisegundos desde 1970, en que la sesión fue enviada por última vez al cliente.
Servlets: Seguimiento de sesión • CADUCIDAD DE LA SESION: • Peculiaridad de las Aplicaciones WEB: No sabemos cuando el usuario se desconecta del servidor • Automáticamenteel servidor web invalida tras un periodo de tiempo (30’) sin peticiones o manualmente usando el método “invalidate”. OJO! ¡SOBRECARGAR LA SESIÓN ES PELIGROSO! Los elementos almacenados no se liberan hasta que no salta el timeout Ej: CarritoCompraServlet.java
Servlets: Contexto de la aplicación • Se trata de un saco “común” a todas las sesiones de usuario activas en el servidor. • Nos permite compartir información y objetos entre los distintos usuarios. • Se accede por medio del objeto “ServletContext”. public ServletContextgetServletContext()
Servlets: Contexto de la aplicación • Para colocar o recuperar objetos del contexto… • Añadir un atributo: Se usa el método “setAttribute” de “ServletContext”. El control de que varios servlets manejen un mismo atributo es responsabilidad del desarrollador. • Recoger un atributo: Se usa el método “getAttribute” de “ServletContext”. Hay que convertir el objeto que devuelve al tipo requerido (Retorna un tipo Object!) Ejemplo Contador de Visitas.
JSP: Introducción • Una tecnología que permite combinar código HTML estático con código generado dinámicamente en un mismo fichero. • Ventajas: • Separación de datos estáticos/dinámicos. • Independencia de formato/plataforma. • Sencillez (sabiendo servlets)
JSP: Introducción • Comparaciones con otras tecnologías: • Vs ASP (Active Server Pages). • Vs Servlets. • Los JSP nos permiten separar la parte dinámica de nuestras páginas Web del HTML estático. Simplemente escribimos el HTML regular de la forma normal y encerramos el código de las partes dinámicas en unas etiquetas especiales, la mayoría de las cuales empiezan con "<%" y terminan con "%>".
JSP: Introducción • Damos extensión .jsp. • Aunque el código parezca mas bien HTML, el servidor lo traduce a un servlet en la primera petición. • 3 elementos en un JSP: • Elementos script (scriptlets) • Directivas • Acciones
JSP: Sintaxis Expresión JSP <%= expression %>; La Expresión es evaluada y situada en la salida. El equivalente XML es <jsp:expression> expression </jsp:expression> Las variables predefinidas son request, response, out, session, application, config, y pageContext. Scriptlet JSP <% code %>; El código se inserta en el método service. El equivalente XML es: <jsp:scriptlet> code </jsp:scriptlet>.
JSP: Sintaxis Declaración JSP <%! code %> El código se inserta en el cuerpo de la clase del servlet, fuera del método service. Se utiliza para declarar variables y métodos. El equivalente XML es: <jsp:declaration> code </jsp:declaration>. Directivas JSP Afectan a la estructura general de la clase servlet. Normalmente tienen la siguiente forma: <%@ directive att="val" %> También podemos combinar múltiples selecciones de atributos para una sola directiva: <%@ directive attribute1="value1“ attribute2="value2“ ... attributeN="valueN" %>
JSP:Sintaxis Comentario JSP <%-- comment --%> Comentario ignorado cuando se traduce la página JSP en un servlet. Si queremos un comentario en el HTML resultante, usamos la síntaxis de comentario normal del HTML <!-- comment -->. Acciónes jsp <jsp:nombre-de-la-acción att=valor att2=valor2 …/> Usan construcciones de síntaxis XML para controlar el comportamiento del motor de Servlets. Podemos insertar un fichero dinámicamente, reutilizar componentes JavaBeans, reenviar al usuario a otra página, etc
JSP: Expresiones • EXPRESIONES: <%= expresión %> Se evalúan y se insertan en la salida. • Se tiene acceso a variables: • request, el HttpServletRequest • response, el HttpServletResponse • session, el HttpSession asociado con el request (si existe) • out, el PrintWriter (una versión con buffer del tipo JspWriter) usada para enviar la salida al cliente. Your hostname: <%= request.getRemoteHost() %> Ejemplo: ¿Como visualizar un contador de visitas en una JSP?
JSP: Expresiones • El equivalente en XML es usar una sintaxis alternativa para las expresiones JSP: <jsp:expression> Expresión Java </jsp:expression> • Los elementos XML, al contrario que los del HTML, son sensibles a las mayúsculas.
JSP: Scriptlets • SCRIPTLETS: <% código %> que se insertan dentro del método service del servlet. • Tienen acceso a las mismas variables que las expresiones. • El código dentro de un scriptlet se insertará exactamente como está escrito, y cualquier HTML estático (plantilla de texto) anterior o posterior al scriptlet se convierte en sentencias print. Ejemplo: <html> <% for ( int i = 0 ; i < 10 ; i ++ ) out.println(“<br>”+i);%> </html>
JSP: Scriptlets <% if (Math.random() < 0.5) { %> Have a <B>nice</B> day! <% } else { %> Have a <B>lousy</B> day! <% } %> • Que se traducirá en: if (Math.random() < 0.5) { out.println("Have a <B>nice</B> day!");} else { out.println("Have a <B>lousy</B> day!");}
JSP: Scriptlets • El equivalente XML de <% Código %> es: <jsp:scriptlet> Código </jsp:scriptlet> • Si se quiere poder usar los caracteres "%>" dentro de un scriptlet, hay que usar "%\>"
JSP: Declaraciones • DECLARACIONES:<%! codigo %>que se insertan en el cuerpo de la clase del servlet, fuera de cualquier método existente. • Permite insertar métodos, variables... • No generan salida alguna. Se usan combinadas con scriptlets. <%! private int accessCount = 0; %> Accesses to page since server reboot: <%= ++accessCount %>
JSP: Declaraciones • Como con los scriptlet, si queremos usar los caracteres "%>", ponemos "%\>". • El equivalente XML de <%! Código %> es: <jsp:declaration> Código </jsp:declaration>
JSP: Directivas • Afectan a la estructura general de la clase servlet. Normalmente tienen la siguiente forma: <%@ directive attribute="value" %> • También podemos combinar múltiples selecciones de atributos para una sola directiva: <%@ directive attribute1="value1“ attribute2="value2“ ... attributeN="valueN" %>
JSP: Directivas • PAGE: • import="package.class“ o import="package.class1,...,package.classN". Esto permite especificar los paquetes que deberían ser importados. El atributo import es el único que puede aparecer múltiples veces. • ContentType = "MIME-Type" o contentType = "MIME-Type; charset = Character-Set" Esto especifica el tipo MIME de la salida. El valor por defecto es text/html. Tiene el mismo valor que el scriptlet usando “response.setContentType”. • isThreadSafe="true|false".Un valor de true (por defecto) indica un procesamiento del servlet normal, donde múltiples peticiones pueden procesarse simultáneamente con un sólo ejemplar del servlet, bajo la suposición que del autor sincroniza los recursos compartidos. Un valor de false indica que el servlet debería implementar SingleThreadModel.
JSP: Directivas • session="true|false".Un valor de true (por defecto) indica que la variable predefinida session (del tipo HttpSession) debería unirse a la sesión existente si existe una, si no existe se debería crear una nueva sesión para unirla. Un valor de false indica que no se usarán sesiones, y los intentos de acceder a la variable session resultarán en errores en el momento en que la página JSP sea traducida a un servlet. • buffer="sizekb|none".Esto especifica el tamaño del buffer para el JspWriter out. El valor por defecto es específico del servidor y debería ser de al menos 8kb. • autoflush="true|false".Un valor de true (por defecto) indica que el buffer debería descargase cuando esté lleno. Un valor de false, raramente utilizado, indica que se debe lanzar una excepción cuando el buffer se sobrecargue. Un valor de false es ilegal cuando usamos buffer="none".
JSP: Directivas • extends="package.class".Esto indica la superclase del servlet que se va a generar. Debemos usarla con extrema precaución, ya que el servidor podría utilizar una superclase personalizada. • info="message". Define un string que puede usarse para ser recuperado mediante el método getServletInfo. • errorPage="url". Especifica una página JSP que se debería procesar si se lanzará cualquier Throwable pero no fuera capturado en la página actual. • isErrorPage="true|false".Indica si la página actual actúa o no como página de error de otra página JSP. El valor por defecto es false. • language="java". En algunos momentos, esto está pensado para especificar el lenguaje a utilizar. Por ahora, no debemos precuparnos por él ya que java es tanto el valor por defecto como la única opción legal.
JSP: Directivas • INCLUDE: Permite incluir ficheros en el momento en que la página JSP es traducida a un servlet. <%@ include file="url relativa" %> • Los contenidos del fichero incluido son analizados como texto normal JSP y así pueden incluir HTML estático, elementos de script, directivas y acciones. • Uso: Barras de navegación.
JSP: Directivas • La síntaxis XML para definir directivas es: <jsp:directive.TipoDirectiva atributo=valor /> Por ejemplo, el equivalente XML de: <%@ page import="java.util.*" %> es: <jsp:directive.page import="java.util.*" />
JSP: Variables predefinidas • REQUEST: Este es el HttpServletRequest asociado con la petición, y nos permite mirar los parámetros de la petición (mediante getParameter), el tipo de petición (GET, POST, HEAD, etc.), y las cabeceras HTTP entrantes (cookies, Referer, etc.). Estrictamente hablando, se permite que la petición sea una subclase de ServletRequest distinta de HttpServletRequest, si el protocolo de la petición es distinto del HTTP. Esto casi nunca se lleva a la práctica.
JSP: Variables predefinidas • RESPONSE: Este es el HttpServletResponse asociado con la respuesta al cliente. Como el stream de salida tiene un buffer, es legal seleccionar los códigos de estado y cabeceras de respuesta, aunque no está permitido en los servlets normales una vez que la salida ha sido enviada al cliente.
JSP: Variables predefinidas • OUT: Este es el PrintWriter usado para envíar la salida al cliente. Sin embargo, para poder hacer útil el objeto response, ésta es una versión con buffer de PrintWriter llamada JspWriter. Podemos ajustar el tamaño del buffer, o incluso desactivar el buffer, usando el atributo buffer de la directiva page. Se usa casi exclusivamente en scriptlets ya que las expresiones JSP obtienen un lugar en el stream de salida, y por eso raramente se refieren explícitamente a out.
JSP: Variables predefinidas • SESSION: Este es el objeto HttpSession asociado con la petición. Las sesiones se crean automáticamente, por esto esta variable se une incluso si no hubiera una sesión de referencia entrante. La única excepción es usar el atributo session de la directiva page para desactivar las sesiones, en cuyo caso los intentos de referenciar la variable session causarán un error en el momento de traducir la página JSP a un servlet.
JSP: Variables predefinidas • APPLICATION: El ServletContext obtenido mediante getServletConfig().getContext(). • CONFIG: El objeto ServletConfig. • PAGECONTEXT: JSP presenta una nueva clase llamada PageContext para encapsular características de uso específicas del servidor como JspWriters de alto rendimiento. La idea es que, si tenemos acceso a ellas a través de esta clase en vez directamente, nuestro código seguirá funcionando en motores servlet/JSP "normales".
JSP: Variables predefinidas • PAGE: Esto es sólo un sinónimo de this, y no es muy útil en Java. Fue creado como situación para el día que el los lenguajes de script puedan incluir otros lenguajes distintos de Java.
JSP: Acciones • Usan construcciones de síntaxis XML para controlar el comportamiento del motor de Servlets. Podemos insertar un fichero dinámicamente, reutilizar componentes JavaBeans, reenviar al usuario a otra página, etc.
JSP: Acciones: include a) ACCION jsp:include nos permite insertar ficheros en una página que está siendo generada. La síntaxis se parece a esto: <jsp:include page="relative URL" flush="true" /> Al contrario que la directiva include, que inserta el fichero en el momento de la conversión a un Servlet, inserta el fichero cuando la página es solicitada.