Aplicaciones WEB - newton.uam.mxnewton.uam.mx/xgeorge/hmoncayo/Modelado/AplicacionesWEB.pdf · Que...
Transcript of Aplicaciones WEB - newton.uam.mxnewton.uam.mx/xgeorge/hmoncayo/Modelado/AplicacionesWEB.pdf · Que...
Aplicaciones WEB
Proceso de una solicitud El cliente (navegador) abre un socket en el servidor
con el puerto 80 (default) El cliente envía texto ASCII por el socket seguido de
algunos encabezados HTTP, una línea vacía seguida de datos adicionales
El servidor revisa la solicitud y ubica los recursos necesarios para responder a la solcitud
El servidor escribe en el socket el resultado (normalmente un documento HTML)
El servidor cierra el socket.
Modelo sin estado No hay conversación entre el cliente y el servidor Cada solicitud se toma como nueva Las aplicaciones requieren información de estado Solución
Identificar las solicitudes de una misma sesión El cliente puede recordar la identificación de la sesión El cliente incluye la identificación de la sesión en cada
solicitud
Solicitud Web
http://www.ace.com/MiAplicacion/principal.html
Protoicolo Servidor
Ruta y nombre deldocumento
Formato de la solicitud
<línea de solicitud><encabezado de solicitud>
<llave> : <valor><linea vacía>
Formato de una solicitudLínea de solicitud
<metodo> <URI> <HTTP version>
Ejemplo:GET /MiAplicacion/index.html HTTP/1.0
Métodos
ReservadoCONNECT
ECO de solicitudes y encabezadosTRACE
¿Qué solicitudes acepta el servidor?OPTIONS
Elimina URIDELETE
Los datos se almacenan como nuevo contenido del URIPUT
Envío de datosPOST
Similar a GET pero el servidor no regresa un documento solamente líneas de estado
HEAD
Solicitud simple de un documentoGET
Capas de aplicaciones Web
Navegador (HTML y applets)
Servidor de aplicaciones
Servidor de bases de datos
Contenedores J2EE
Componentes J2EE Son:
Servlets Son clases java que generan código HTML Generan respuestas al cliente
JSP (Java Server Pages) Son páginas HTML que contienen código java Es una forma mas organizada
Java Beans Son clases java que se apegan a las especificaciones
de Java Beans
Clientes Web Páginas conteniendo texto dinámico (HTML, XML)
generado la capa web desplegado por un navegador y applets
Se les llama clientes ligeros y no: Consultan la base de datos Realizan lógica de negocios
Applets Pequeñas aplicaciones escritas en Java Requieren que la máquina virtual de Java se encuentre
cargada en el navegador Aplicaciones cliente
Programas de ventanas creados con Swing para proporcionar una interfaz mas rica para el usuario
Que es un servlet Es una clase java usada para extender las
capacidades del servidor. Las clases e interfaces para el desarrollo de
servlets se encuentran en los paquetes: javax.servlet javax.servlet.http
Un servlet debe implementar la interfaz Servlet Los servlets pueden derivarse de
GenericServlet HttpServlet
Diseñado para atender las solicitudes: Get, Post, etc.
Servlet (erjemplo)package servlets;
import java.io.*;import java.util.*;import java.sql.*;import javax.servlet.*;import javax.servlet.http.*;/** * This is a simple example of an HTTP Servlet. It responds to the GET * method of the HTTP protocol. */public class GreetingServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.setBufferSize(8192);
PrintWriter out = response.getWriter();
// then write the data of the response out.println("<html>" + "<head><title>Hello</title></head>");
// then write the data of the response out.println("<body bgcolor=\"#ffffff\">" + "<img src=\"duke.waving.gif\" alt=\"Duke waving\">" + "<h2>Hello, my name is Duke. What's yours?</h2>" + "<form method=\"get\">" + "<input type=\"text\" name=\"username\" size=\"25\">" + "<p></p>" + "<input type=\"submit\" value=\"Submit\">" + "<input type=\"reset\" value=\"Reset\">" + "</form>");
String username = request.getParameter("username");
if ((username != null) && (username.length() > 0)) { RequestDispatcher dispatcher = getServletContext() .getRequestDispatcher("/response");
if (dispatcher != null) { dispatcher.include(request, response); } }
out.println("</body></html>"); out.close(); }
public String getServletInfo() { return "The Hello servlet says hello."; }}
Que es una JSP Java Server Page Es un documento de texto que contiene
Texto estático (HTML, SVG, WML, XML) Elementos JSP
Las JSP son convertidas por el contenedor en Servlets los cuales son ejecutados por el contenedor para generar una respuesta
JSP Ejemplo<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %><html><head><title>Hello</title></head><body bgcolor="white"><img src="duke.waving.gif"> <h2>Hello, my name is Duke. What's yours?</h2><form method="get"><input type="text" name="username" size="25"><p></p><input type="submit" value="Submit"><input type="reset" value="Reset"></form>
<c:if test="${fn:length(param.username) > 0}" > <%@include file="response.jsp" %></c:if></body></html>
Java Beans Componentes basados en la arquitectura
JavaBeans Se usan para contener la lógica de la aplicación y
pueden comunicar: Cliente y componentes J2EE J2EE y la base de edatos
Contienen propiedades y métodos para su consulta y modificación
Se deben apegar a los estándares de nomenclatura y diseño de la arquitectura JavaBeans
Componentes del negocio Son componentes que contienen las reglas
del negocio Se denominan Enterprise Beans
Soporte para servicios Web Los servicios Web son aplicaciones que atienden
solicitudes de clientes u otras aplicaciones Utilizan XML para el intercambio de información y
SOAP Se cuenta con el API para la manipulación de XML SOAP (Simple Object Transport Protocol)
Se usa para transmitir mensajes entre los clientes y los servicios WEB
Es independiente de la plataforma y ubicación WSDL (Web Service Description Languaje)
¿Que es? Es un lenguaje de marcado que define contenido
(HTML define presentación) Texto plano Ideal para intercambio de información en la red Contiene la definición de los datos (semántica) Estructura jerárquica Usos
Intercambio de información entre componentes Programación dirigida por documentos
Ejemplo<?xml version='1.0' encoding='utf-8'?> <!-- A SAMPLE set of slides --> <slideshow
title="Sample Slide Show" date="Date of publication" author="Yours Truly" >
<!-- TITLE SLIDE --> <slide type="all">
<title>Wake up to WonderWidgets!</title> </slide> <!-- OVERVIEW --> <slide type="all">
<title>Overview</title> <item>Why <em>WonderWidgets</em> are great</item> <item/> <item>Who <em>buys</em> WonderWidgets</item>
</slide </slideshow>
Servlets
JSP (Java Service Page)
JSP
Textofuente
Fuentejava
Servlet
claseCompilada
Elementos JSP Directivas Comentarios Expresiones Scriptles Declaraciones Acciones estándar
Directivas Formato
<%@ nombre [atributo="valor" …]%> Se usan para describir como se debe generar el
código Directivas
page include taglib
Atributos de la directiva page language
Solo se acepta java extends
para derivar una JSP de otra import
Una lista separada por comas de paquetes y clases
<%@ page import="java.io.*,java.text.*" %>
sesion true o false.- Indica si la JSP
requiere sesion buffer
Tamaño del buffer (8K por omisión) autoFlush
Indica se el buffer se vacía automáticamente o se genera una excepción
isThreadSafe true o false.- Indica si la página
puede atender solicitudes simultáneas
info Una cadena que regresa el
método getServletInfo() isErrorPage
true si esta página va a ser usada por otra como página de error
errorPage Indica el URL de una página
de error contentType
Especifica el tipo MINE pageEncoding
Indica como está codificada la página
Directiva include Se usa para agregar el contenido de otro
archivo (similar a #include de C) <%@ include file="archivo" %> El contenido de archivo sustituye a la
directiva La sustitución se produce al generarse el
Servlet correspondiente
Comentarios Comentarios visibles solo en JSP
Se puede usar para comentar secciones de código<%-- Esto es un comentario --%>
Comentarios generados en la respuesta HTML<!– Esto se incluye en el texto HTML -->
Expresiones Formato
<%= exp %> Con las expresiones se puede usar el valor
de una variable java Ejemplo
<h2>La hora exacta es: <%= new java.util.Date()%></h2>
scriptles Es un conjunto de instrucciones java que se
van a incluir en la función _jspService() Puede haber tantos scrptles como se desee.
Su texto se concatena el el orden de aparición
Formato <% texto java %>
scriptles (ejemplo)<%@ page import="java.text.*" session="false" %><html><head>
<title> Ejemplo de scriptles </title></head/<body>
<table border="0" cellpadding="3"><tr> <th>Fahrenheit</th> <th>Celsius</th></tr>
<%NumberFormat fmt = new DecimalFormat("###.000");for(int f = 32; f < 212; f +=20) {
double c = ((f - 32) * 5)/9.0;string cs = fmt.format(c);
%><tr>
<td align ="RIGHT"> <%= f %> </td><td align ="RIGHT"> <%= f %> </td>
</tr><% } %></table></body></html>
Declaraciones Se usa para incluir texto java fuera de la
función _jspService() Se puede usar para definir variables de
instancia y funciones A las funciones y variables definidas en las
declaraciones se puede hacer referencia desde los scriptles
Formato:<%! texto java %>
Ejemplo de declaraciones
<%!private String normaliza(String valor){
StringBuffer sb = new StringBuffer();for(int i = 0; i < valor.length(); i++) {
char c = valor.charAT(i);sb.append©;if (c == ';')sb.append("<br>");
}return sb.toString();
}%>
Java Estándar Tag Library
JSTL
Que es JSTL Una biblioteca de etiquetas (tags) para
realizar operaciones comunes Aplicables a cualquier contenedor Tienen código optimizado Algunos usos
Control de flujo Acceso a bases de datos Manipulación de XML Internacionalización
Core JSTL
Soporte de variablesremoveset
Control de flujochoose
whenotherwise
forEachforTokensif
Manejo de URL'simport
paramredirect
paramurl
paramMiscelaneos
catchout
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Tags para soporte de variables
set
<c:set var="cuenta" scope="session" value="$param.CuentaId"/>
remove
<c:remove var="cuenta" scope="session"/>
if<c:if test="${!empty param.Add}"> <c:set var="bid" value="${param.Add}"/> <jsp:useBean id="bid" type="java.lang.String" /> <sql:query var="books" dataSource="${applicationScope.bookDS}"> select * from PUBLIC.books where id = ? <sql:param value="${bid}" /> </sql:query> <c:forEach var="bookRow" begin="0" items="${books.rows}"> <jsp:useBean id="bookRow" type="java.util.Map" /> <jsp:useBean id="addedBook" class="database.BookDetails" scope="page" /> ... <% cart.add(bid, addedBook); %> ... </c:if>
choose
<c:choose> <c:when test="${customer.category == 'trial'}" > ... </c:when> <c:when test="${customer.category == 'member'}" > ... </c:when> <c:when test="${customer.category == 'preferred'}" > ... </c:when> <c:otherwise> ... </c:otherwise> </c:choose>
Etiquetas para iteración<c:forEach var="item" items="${sessionScope.cart.items}"> ... <tr> <td align="right" bgcolor="#ffffff"> ${item.quantity} </td> ... </tr> </c:forEach>
o
<c:foreach var="indice" begin="10" end="30" step="2">…
</c:foreach>
Etiquetas para URL
<c:import url="/books.xml" var="xml" /> <x:parse doc="${xml}" var="booklist" scope="application" />
Etiquetas para SQL
query dateParam paramtransactionupdate dateParam param
SQLsqlsetDataSourcedatabase
PrefijoEtiquetaFunciónArea
setDataSource
<sql:setDataSource dataSource="jdbc/BookDB" />
•Esta etiqueta se usa solamente para generar prototipos•La operaciones de bases de datos deberán realizarse mediante en JavaBeana
Etiqueta query<c:set var="sufficientInventory" value="true" /> <sql:transaction> <c:forEach var="item" items="${sessionScope.cart.items}"> <c:set var="book" value="${item.item}" /> <c:set var="bookId" value="${book.bookId}" /> <sql:query var="books" sql="select * from PUBLIC.books where id = ?" > <sql:param value="${bookId}" /> </sql:query> <jsp:useBean id="inventory" class="database.BookInventory" /> <c:forEach var="bookRow" begin="0" items="${books.rowsByIndex}"> <jsp:useBean id="bookRow" type="java.lang.Object[]" /> <jsp:setProperty name="inventory" property="quantity" value="${bookRow[7]}" /> …
Etiquetas definidas por el usuario
Etiquetas de usuario Son agregados a la sintaxis de JSP
desarrollados por el usuario en un lenguaje similar a XML
El manejador de la etiqueta es una clase java La definición de varias etiquetas se pueden
almacenar en un archivo .jar Pueden distribuirse fácilmente
Ejemplo de definición de etiqueta
<%@ page session="false" %><%@ taglib prefix="diag" uri="WEB-INF/diagnostics.tld" %><html><head> <title>Basic example of custom tag</title> <style>h1 {font-size: 140% } </style></head><body><h1>Basic example of custom tags</h1>The server is <diag:getWebServer /></body></html>
Clase que implementa la etiqueta
public class GetWebServerTag extends TagSupport{
public int doStartTag() throws JspException{
try{
// Get server host and port number// from the page context
HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
String host = request.getServerName();int port = request.getServerPort();URL url = new URL("http", host, port, "/");HttpURLConnection con = (HttpURLConnection)
url.openConnection();con.setRequestMethod("OPTIONS");String webserver = con.getHeaderField("server");JspWriter out = pageContext.getOut();out.print(webserver);
}catch (IOException e){
throw new JspException(e.getMessage());}return SKIP_BODY;
}}
Como funciona? Al generar el servlet
Las etiquetas <%@ page, <%@taglib proporcionan información para la traducción
Las expresiones JSP y texto HTML generan instrucciones out.print("…") en _jspService()
Los scriptlets se copian en _jspService() Las declarativas se copian fuera de _jspService() Las etiquetas estándar como <jsp:include>, <jsp:useBean>
se traducen en funciones que realizan su función Las etiquetas de usuario se expanden como llamados a los
métodos de su clase manejadora
Se genera código para: Crear una instancia del manajador de la
etiqueta Pasar una referencia de pageContext al
manejador Pasar una referencia a la etiqueta padre (si
hay anicamiento) Una llamada a la función correspondiente por
cada parámetro de la etiqueta Una llamada al método doStartTag
Interfases javax.servlet.jsp.tagext.Tag
Etiquetas simples que no operan en su cuerpo javax.servlet.jsp.tagext.IterationTag
Para etiquetas que requieren evaluar su cuerpo en forma iterativa
javax.servlet.jsp.tagext.BodyTag Para etiquetas que requieren operar sobre el
contenido de su cuerpo
Clases predefinidas Se usan para derivar clases que se usaran
como manejadores de etiquetas TagSupport
Implementa IterationTag, JspTag, Tag Incluye métodos predefinidos
BodyTagSupport Implementa BodyTag, IterationTag, JspTag, Tag Contiene métodos para evaluar el cuerpo de la
etiqueta
Bibliotecas de etiquetas Se utilizan para distribución Contienen
Manejadores de etiquetas (clases java) Clases de información adicional
Opcionales, Validar atributos Crear variables
Validador de etiquetas. Clases opcionales Usadas en tiempo de generación de los servlets
Descriptores Archivos XML que describen las propiedades de las
etiquetas
Definición de etiquetas Pueden tener cualquier nombre Las definiciones siempre están en un
namespace Pueden tener cualquier número de atributos Pueden crear variables que se usan
En otras etiquetas En servlets
Pueden tener etiquetas anidadas
Decriptor de biblioteca de etiquetas Se almacena en un .tdl Es un archivo XML que describe
Etiquetas Clases manejadoras La biblioteca misma
Elementos de las etiquetas tlib-version (requerido)
Version de la biblioteca "1.0", 1.3.50, … jsv-version (requerido)
Version mínima de JSP. "1.2", 2.0", … short-name
Identifica la biblioteca uri
uri que identifica la biblioteca display-name (opcional)
Nombre descriptivo de la biblioteca validator
Clase usada para verificación de sintaxis Tag Describe una etiqueta
Puede habber varias
Subetiquetas de tag description
Texto descriptivo de la etiqueta display-name
El nombre usado en IDE's name
El nombre usado en las JSP tag-class
Clase manejadora del tag tei-class (tag extra information)
Una clase que proporciona información acerca de variables creadas por la etiqueta y validación de atributos
body-content (opcional) Describe el contenido del cuerpo de la etiqueta Los valores son: empty, JSP, tagdependent
Metodos de la interfaz Tag
Se invoca a la salida de la página. Se usa para liberar recursos.
public void release()
Se invoca el llegar al final del tag. El codigo de retorno indica si el servlet deberá continuar evaluando el resto de la página(EVAL_PAGE, SKIP_PAGE)
public void doEndTag() throws JspException
Se invoca despues de establecido el contexto, el padre y los parámetros. El valor de retorno indica si el servlet debe evaluar o no cuerpo (EVAL-BODY_INCLUDE, SKIP_BODY)
public int doStartTag() throws JspException
Regresa el tag padrepublic void getParent()
Establece el tag de nivel superior. Se llama después de setPageContext
public void serParent(Tag parent)
El servlet generado invoca esta función antes que nada.ctx se debe salvar para uso posterior
public void setPageContext (PageContext ctx)
Ciclo del manejador de etiquetas
inicio
Obtener una instancia del manejador
Establece context y etiqueta padre
Llama a los metodos para
establecer atributos
doStartTag
rc
Procesa cuerpo de la etiqueta
Procesa fin de etiqueta
EVAL_BODY_INCLUDE
SKIP_BODY
rc
regresa
SKIP_PAGE
Continua
EVAL_PAGE
Atributos de etiquetas
Clase manejadorapublic class Database{
private String user;private String pw;public void setUser(String user){
this.user = user;}public void setPw(String pw){
this.pw = pw;}…
}
Descriptor<attribute>
<name>user</name><required>true</required><rtexprvalue>false</rtexprvalue>
</attribute>
JSP<db:conexión user="${usuario}" pw="${password}" />
Atributos simples Son evaluados por el contenedor antes de
pasarlos al manejador Tienen formato nombre="valor" Su valor puede ser unha constante de
dadena o una expresión de lenguaje (EL) o susando jsp:attribute
Ejemplo:<sc:catalog bookDB="${bookDB}" color="#cccccc">
Atributos de fragmento Es una porción de código pasado al
manjador Puede ser invocado varias veces Es como una plantilla con la que el
manejador produce contenido dinámico Es evaluado por el manjador de la etiqueta Se usa el atributo fragment de la directiva
attibute o el subelemento fragment
Atributos dinámicos No se especifica en en la definición de la
etiqueta Se usa cuando los atributos tienen el mismo
tratamiento pero se desconocen sus nombres en tiempo de desarrollo
La siguiente etiqueta acepta un número variable de atributos:<colored:colored color1="red" color2="yellow color3="blue"/>
javax.servlet.jsp.targext.IterationTag
Adicionalmente contiene el método public int doAfterBody()
Se llama después de cada evaluación del tag Puede indicar si el tag se vuelve a evaluar o
se sale del ciclo. Valor de retorno
EVAL_BODY_AGAIN SKIP_BODY
Lenguaje expresion Tiene la forma:${nombre}
El nombre puede ser calificado${reactor.tempeartura}
Uso del atributo test<c:if test="${numeroCitas > 0}" >
El carácter de escape es el apostrofe<mistags:ejemplo titulo="Las EL tienen la forma ${'${nombre'}}"/>
Establecer atributos de una etiquetaAsignación<mistags:titulo empresa="$empresa.nombre}"/>
Concatenaciónmistags:dewtino domicilio="${calle}<br>${colonia}<br>${ciudad}" />
Cadenas numéricas<mistags:cuenta importe="125.50" />Nota
Las cadenas se convierten al tipo del atributo
Variables El contenedor busca las variables en los
ámbitos: page request session application
Si no se encuentra, su valor será null Si se trata de un objeto implícito regresa el
objeto
Operador[ ] La expresión expa[expb]se evalua:
1. Se evalua expa y expb en vala y valb2. Si vala o valb es nulo la expresión es nula3. Se vala es de tipo Map regresa
valz.get(valb)si no esta en el mapa regresa null
4. Si vala es un arreglo o lista, valb se convierte a entero y se usa como índice
5. Si vala es un java bean, valb se toma como el nombre de una propiedad del bean
Objetos implícitos pageContext a través del cual se tiene acceso a:
servletContext session request response
Otros objetos impícitos param nombre valor simple paramValues nombre arreglo de valores header header.name valor simple headerValues headerName arreglo de valaores cookie cookieName cookie simple initParam context initialization params valor simple
Literales Booleanas
true y false Enteros.- como en java Flotantes.- como en java Cadenas con comillas simples y dobles
símbolo secuencia de escape" \"' \'\ \\
Null: null
Operadores Aritméticos: +, -, *, / y % Lógicos: &&, ||, y ! Relacionales: ==, eq, !=, ne, <, lt, >, gt, <=, le,
>=, ge Empty: empty prueba por valor nulo o vacío Condicional: a ? b : c igual que en java
Precedencia de operadores [ ] ( ) - (unario), not ! empty *, /, %, mod +, - (binario) <, >, <=, >=, lt, gt, le, ge &&, and ||, or ? :
FuncionesDefiniciónpackage mypkg;public class MyLocales {
…public static boolean equals(String s1, String s2)
return s1.equals(s2);}
}Descripción en TLD<function>
<name>equals</name>function-class> mypkg.MyLocales</function-class><function-signature>
boolean equals(java.lang.String, java.lang.String)</function-signature>
</function>Uso<c:when test="${f:equals(selectedLocaleString, localeString)}" >
Java Beans Tienen propiedades (R, W, R/W) Por cada propiedad R debe tener una
función:ClasePropiedad getPropiedad()
Por cada propiedad W debe tener una funciónsetPropiedad(ClasePropiedad)
Debe tener una constructora sin argumentos
Uso de java beansCreración de un objeto
<jsp:useBean id="beanName"class="nombre de la clase calificado"scope="scope" />
o con algunos parámetros
<jsp:useBean id="beanName" class="nombre de la clase calificado"scope="scope" ><jsp:setParameter …/>
</jsp:useBean>
Si existe el bean lo recupera y beanName se usará como una referencia al objeto.Si no existe se crea y se almacena en el ámbito especificado.Todos los beans deben estar contenidos en un paquete.
Establecer propiedades de un bean
<jsp:setProperty name="beanName"property="*" />
Propiedades con nombres iguales a los parámetros
<jsp:setProperty name="beanName"property="propName" param="paramName" />
Request Parameter
<jsp:setProperty name="beanName" property="propName"value="string constant" />
String constantSintaxisorigen
Establecer propiedades de un bean
<jsp:setProperty name="beanName"property="propName" value="expresion" />
<jsp:setProperty name="beanName"property="propName"><jsp:attribute name="attName"> expresion</jsp:attribute><jsp:setProperty>
expresionSintaxisorigen
Recuperación de propiedades En expresiones${bookDB.bookDetails.title}
Usando la etiqueta getProperty<jsp:getProperty name="beanName" property="propName" />
Acceso a base de datos
JDBC Es una API para utilizar las bases de datos
desde JAVA Un programa java usa métodos de clases Existen drivers para casi todas las BD mas
usadas Existe un manejador JDBC – ODBC El manejo de cualquier BD es similar
Operaciones con JDBC1. Cargar el manejador JDBC
Class.forName(nombre-manejador)2. Se usa el manejador para abrir una conexión
con = DriverManager.getConnection()3. Ejecutar comandos SQL con la conexión
Statement stmt = createStatement(sql)ResultSet rs = stmt = executeQuery
4. Procesar los resultadoswhile(rs.next() {
String name = rs.getString(“nombre”)
Empaquetado de la aplicación
<target name="package-bookstore" depends="build" description="Packages the JAR file"> <echo message="Packaging the JAR...."/> <mkdir dir="dist" /> <delete file="dist/${example}.jar" /> <jar jarfile="dist/${example}.jar" > <fileset dir="${build}" /> </jar> </target>
Datasource Es el medio a través del cual la aplicación
accesa la base de datos Contrinen una serie de propiedades
Servidor de base de datos Nombre de la base de datos Protocolo de red
Es la factoría para conexiones mediatedatasource.getConnection()
Tipos de manejadores Tipo 1.- Puente JDBC - ODBC
Usado si no hay mas remedio Tipo 2.- API nativo parcialmente java
Es una envoltura sobre el API nativo del proveedor de base de datos
Tipo 3.- Totalmente java usa midleware Utiliza un protocolo de red Se comunica a un servidor de midleware
Tipo 4.- Totalmente java Utilizan directamente el protocolo del administrador de BD
Puente JDBC - ODBC Está limitado por el ODBC
No maneja multithreading Pobre rendimiento Requiere que la biblioteca JdbcOdbc.dll se instale
en el cliente Requiere la configuración de una fuente ODBC Se recomienda usarlo solamente en pruebas Permite el acceso a una gran variedad de fuentes
Registro del manejadortry {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch (ClassNotFoundException ex) {
// Reporte de la excepción}
static {PrintStream log = DriverManager.getLogStream();if (log != null)log.println("Driver cargado");MyJdbcDriver driver = new MyJdbcDriver();try {
DriverManager.registreDriver(driver);} catch (SQLException ex) {
if (log != null)log.println("No se pudo registrar");
}}
Obtener una conexión
Se tienen tres sobrecargas
Conection con;
con = DriverManager.getConnection(String url);
con = DriverManager.getConnection(String url, String userId, String password);
con = DriverManager.getConnection(String url,Properties prop)
•El DriverManager mantiene una lista con drivers registrados•DriverManager consulta cual de sus manejadores soporta el url
Formato del URL
<protocolo>:<subprotocolo>:<subnombre>
<protocolo> Siempre jdbc
<subprotocolo> Especifico del proveedor (identifica al manejador)
<subnombre> Identifica la base de datos Puede también contener parámetros
Ejemplo:
jdbc:mysql://localhost:3306/lyricnote
Conexión usando JNDI La clase del manejador y el URL se
almacenan en el servidor de nombres Solo se requiere el nombre de la fuente de
datos
Conexión con JNDI
InitialContext ic = new InitialContext();Context ctx = (Context)ic.lookup("java:comp/env");DataSource ds = (DataSource) ctx.lookup("jdbc/BookDB ");
Connection con = null;try {
con = ds.getConnection();…
} catch (Exception ex) {// Reporta error
}
La interfaz Statement Operaciones
Comandos de definición de datos (CREATE TABLE, .. Modificación de datos (UPDATE, DELETE, INSERT) Consultas (SELECT)
Interfaces especializadas PreparedStatement
Usa SQL compilado CallableStatement
Para invocar procedimientos catalogados
Interfaz Statement
Creación mediante la conexión
Statement stmt = con.createStatement();
Métodos:
ResultSet rs = stmt.executeQuery(<sql text>);
int count = stmt.executeUpdate(<sql text>);
boolean b = stmt.execute(<sql text>);b = true.- se generó ResultSetb = false hay una cuenta de resultados (update, ..)
ResultSet rs = stmt.getResultSet()
int[] ia = stmt.executeBatch(<sql text>);
Enterprise Java Beans
Que son? Son componentes escritos en java que
encapsulan las reglas del negocio Se apegan a la especificación Enterprise
Java Beans Se ejecutan en un contenedor EJB montado
en el servidor Web El contenedor proporciona administración de
transacciones y seguridad
Beneficios Simplifican el desarrollo de aplicaciones
empresariales distribuidas Con los servicios que proporciona el
contenedor el desarrollador se puede concentrar en las reglas del negocio
Los desarrolladores del cliente se pueden concentrar en la calidad de la interfaz del usuario
Los EJB son reutilizables y transportables
Tipos de java beans Sesión
Realizan tareas para un cliente Implementa un servicio web
Entity Representan una entidad del negocio y existen
en memoria persistente Messge – Driven
Actuan como escuchas del API Java Message Service
Procesan los mensajes de forma asíncrona
Session java beans Un bean sesión representa un solo cliente en
el servidor El cliente invoca algún método del bean Un bean de sesión no se comparte, no
maneja concurrencia Al terminar la ejecución se rompe la
asociación con el cliente No maneja persistencia
Tipos de session beans Sin estado
No manejan conversaciones con los clientes Las variables de instancia solo permanecen durante la
ejecución de la función El contenedor EJB puede asignar cualquier instancia
disponible a los clientes Son más escalables
Con estado El bean conversa con el cliente Conserva el estado durante la conversación Las variables de instancia representan el estado para una
sesión
Uso de Session Beans Solo un cliente utiliza una instancia del bean al
mismo tiempo Su estado no es persistente El Bean implementa un servicio web Se deben usar con estado
Se requiere una conversación en estado El bean requiere conservar información del cliente entre
llamados El administrador de beans supervisa el flujo de trabajo de
varios EJB
Entity Bean Representan objetos del negocio persistentes en
una base de datos Correspondencia
Bean - Tabla en la base de datos Instancia del bean un renglón de la tabla
Permiten el acceso compartido Tienen una llave primaria Participan en relaciones con otros Entity Beans Persistencia manejada por el bean
Contiene el código para acceder a la base de datos Persistencia manejada por el contenedor
El contenedor lee y almacena la información en la base de datos
Entity Bean Acceso compartido
Puede se usado por múltiples clientes simultáneamente Deben trabajar dentro de transacciones Se deben especificar los atributos de la transacción en el
descriptor de instalación No es necesario manejar la transacción dentro del bean
Llave primaria Cada bean tiene un identificador único Si el bean representa un cliente la llave puede ser el número de
cliente La llave primaria se usa para localizar el bean
Entity Bean Relaciones
La relaciones son similares a las de la las tablas en una base de datos
El bean administra sus persistencia Relaciones implementadas en el código del bean
El contenedor administra la persistencia El contenedor maneja las relaciones Se deben especificar en el esquema abstracto del
bean que es parte del descriptor de instalación
Esquema abstracto Es parte del descriptor de distribución Define los campos persistentes y relaciones El esquema abstracto tiene un nombre En el Enterprise Java beans Query Language
(EJB QL) se hace referencia al nombre del esquema abstrato.
Para los Entity Beans con persistencia manejada por el contenedor se debe definir una búsqueda EJB QL para las consultas
Campos persistentes Son almacenados en la base de datos Constituyen el estado del bean El contenedor sincroniza los campos
persistentes con la base de datos ClienteBean: nombre, domicilio, teléfono, etc Persistencia manejada por el contenedor
Son virtuales (no son variables de instancia) se manejan por métodos de acceso (getters y
setters)
Campos de realción Son como llaves foránas Identifican un bean relacionado Son virtuales No representan el estado del bean
Relaciones Cardinalidad
Uno a uno Uno a muchos Mochos a uno Muchos a muchos
Direccion Unidireccional Bidireccional
Message-Driven Bean Procesa mensajes de manera asíncrona Actua como en escucha Recibe mensajes JMS en vez de eventos El mensaje puede ser enviado por cualquier
componente J2EE No tiene estado No maneja conversaciones Todas las instancias son equivalentes Maneja concurrencia Se ejecutan al recibir un mensaje
Interfaces Se aplican solamente a:
Entity Beans Session Beans
Los clientes invocan los métodos solo a través de interfaces
Tipo de acceso de los clientes Remoto Local Web
Interfaz remota Define los métodos del negocio Se derivan de javax.ejb.EJBObject EJBObject se deriva de java.rmi.Remote EJBObject define las funciones:
getEJBHome() getHandle() getPrimaryKey() isIdentical() remove()
Clientes remotos Un cliente remoto puede
Correr en equipo o máquina virtual diferente Ser un componente web, un cliente de aplicación
u otro bean empresarial Para el cliente la ubicación es transparente Un Enterprise Bean con acceso remoto requiere
Interface remota Define los métodos del negocio (Depósito, pagoCheque, …
home interface Ciclo de vida del bean (create y remove) Métodos de búsqueda (Entity beans)
Interfaces remotas
Beans con acceso remoto Se definen dos interfaces
Interfaz remota (remote interface) Define las reglas del negocio (deposito, cheque)
Interfaz doméstica (home interface) Define los métodos para su ciclo de vida (create,
remove, …) Para Entity beans en la interfaz doméstica se definen:
Métodos de búsqueda Métodos domésticos (Home methods)
Beans con acceso remoto
Clientes locales Deben correr en la misma máquina virtual Puede ser un componente web u otro bean
empresarial La ubicación no es transparente para el cliente Puede ser un Entity Bean cuyas relaciones son
manejadas por en contenedor con otro Entity Bean Se requiere definir dos interfaces:
Interfaz doméstica Interfaz doméstica local
Interfaces locales
Los beans a que se hace referenciadebe tener interfaz local
Contenidode un Enterprise Bean Descriptor de distribución
Archivo XML Entreprise bean class
Implementa los métodos de las interfaces Interfaces
Remotas Interfaces remotas y home
Acceso local Interfaces local y local home
Clases de ayuda Excepción y utilería
Convención de nombres
Ciclo de vida de un EJB de sesión con estado
Cliente
Contenedor
Ciclo de vida de un EJB de sesión sin estado
Ciclo de vida de un Entity EJB
Contenedor
Cliente Cliente
Contenedor
JavaServer Faces
Tecnología JavaServer Faces Integrada por:
API para representar componentes de interfaz de usuario
Librería de etiquetas de usuario Proporciona capacidad para:
Manejo de eventos del cliente en el servidor Ligar componentes de UI con datos en el servidor Construir componentes de UI reutilizables Salvar y recuperar el estado de componentes UI
Ventajas de JavaServer Faces Separación clara entre presentación y
comportamiento Mapeo de solicitudes HTML a manejadores de
eventos específicos Mantenimiento del estado en los componentes de
UI Facilita el procesamiento de la información de los
componentes Simplifica la validación de los datos del usuario
Elementos de una aplicación Páginas JSP Componentes JavaBeans Escuchas de eventos Clase de soporte en el servidor Una biblioteca de etiquetas de usuario para presentar
componentes UI Una biblioteca de etiquetas de usuario para representar:
validadores, manejadores de eventos Componentes de UI con estado en el servidor Beans de respaldo con las propiedades y comportamiento de UI Validadores, convertidores, escuchas de eventos, manejadores Un archivo de configuración de recursos
Desarrollo de aplicaciones Creación de páginas con componentes de UI
y etiquetas Definición de la navegación entre páginas en
el archivo de configuración de la aplicación Desarrollo de beans de soporte Agregar las declaraciones de beans en el
archivo de configuración
Ejemplo<HTML> <HEAD> <title>Hello</title> </HEAD> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <body bgcolor="white"> <f:view> <h:form id="helloForm" > <h2>Hi. My name is Duke. I'm thinking of a number from <h:outputText value="#{UserNumberBean.minimum}"/> to <h:outputText value="#{UserNumberBean.maximum}"/>. Can you guess it?</h2> <h:graphicImage id="waveImg" url="/wave.med.gif" alt="Duke waving" /> <h:inputText id="userNo" value="#{UserNumberBean.userNumber}"> <f:validateLongRange minimum="#{UserNumberBean.minimum}"
maximum="#{UserNumberBean.maximum}" /> </h:inputText>
<h:commandButton id="submit" action="success" value="Submit" /> <p>
<h:message style="color: red; font-family: 'New Century Schoolbook', serif; font-style: oblique; text-decoration: overline" id="errors1" for="userNo"/>
</h:form> </f:view></HTML>
Especificación de navegación<navigation-rule> <description> The decision rule used by the NavigationHandler to determine which view must be displayed after the current view, greeting.jsp is processed. </description> <from-view-id>/greeting.jsp</from-view-id> <navigation-case> <description>
Indicates to the NavigationHandler that the response.jsp view must be displayed if the Action referenced by a UICommand component on the greeting.jsp view returns the outcome "success". </description> <from-outcome>success</from-outcome> <to-view-id>/response.jsp</to-view-id> </navigation-case> </navigation-rule>
Generación del resultado
<h:commandButton id="submit" action="success" value="Submit" />
<h:commandButton id="submit" action="#(useNumberBean.getOrderStatus)t" value="Submit" />
Beans de soporte Contienen propiedades y métodos asociados con UI Métodos para realizar funciones para los
componentes para: Validar información Manejo de eventos
Las propiedades del bean se ligan con los componentes de UI mediante el atributo "value" del componente.
Una instancia de un componente se liga a una propiedad del bean mediante el atributo "binding" del componente.
Beans - JSP
public class UserNumberBean { Integer userNumber = null; Integer randomInt = null;
<HTML> <HEAD> <title>Hello</title> </HEAD> <%@ taglib uri="http://java.sun. <%@ taglib uri="http://java.sun.com/ <body bgcolor="white">
JSP
Backing bean
Declaración de beans <managed-bean> <description> The backing bean that backs up the guessNumber Web application </description> <managed-bean-name>UserNumberBean</managed-bean-name> <managed-bean-class>guessNumber.UserNumberBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>minimum</property-name> <property-class>long</property-class> <value>0</value> </managed-property> <managed-property> <property-name>maximum</property-name> <property-class>long</property-class> <value>10</value> </managed-property> </managed-bean>
Componentes JavaServer Faces UI Son:
Configurables Reutilizables
Su arquitectura contiene Clases para especificar estado y comportamiento de los
componentes Un modelo de presentación para componentes Un modelo para el manejo de eventos Un modelo de conversión Un modelo de validación
Componentes de Interfaz de UsuarioUIColumn.- Columna de datos simplesUICommand.- Control que dispara acciones al activarseUIData.- Una liga de datos a una colección representada por una instancia
del DataModelUIForm.- Agrupa un conjunto de controles (similar a la etiqueta FORM)UIGraphic.- Presenta una imagenUIInput.- Campo de entrada del usuarioUIMessage.- Despliega un conjunto de mensajesUIOutput.- Despliega datos en la formaUIPanel.- Administra la distribución de los componentes que contieneUIParameter.- Representa parámetros de sustituciónUISelectBoolean.- Permite al usuario establecer un valor booleano al
seleccionar un componenteUISelectItem.- Representa un solo item en un conjuntoUISelectedItems.- Representa un conjunto de itemsUISelectOne.- Permite la selección de un item dentro de un conjuntoUIViewRoot.- Representa la raíz del árbol de compenentes
Interfaces de comportamiento ActionSource
El componente puede disparar eventos EditableValueHolder
Extiende ValueHolder Características adicionales para componentes editables
Validación Disparar eventos de cambio de valor
Naming-container Obliga a todos los componentes descendientes tengan un id
único StateHoloder
El componente tiene un estado válido entre solicitudes ValueHolder
El componente mantiene un valor local
Modelo de presentación Clase del componente
Define el comportamiento del componente Un presentador (renderer)
Define la presentación del componente Ventajas
Múltiples presentaciones En una página se pueden elegir diferentes presentaciones
Ejemplo: UISelectOne Conjunto de dadio buttons Combo box List box
Cada combinación clase – presentador tiene una etiqueta
Modelo de conversión
<h:inputText id="userNo" value="#{UserNumberBean.userNumber}">
Integer userNumber = null; public void setUserNumber(Integer un) { userNumber = un; }
public Integer getUserNumber() { return userNumber; }
JSP clase java de soporte
Modelo de manejo de eventos Objeto Evento
Identifica el componente que dispara el evento Almacena información relativa al evento
La aplicación que desea ser notificada Proporciona una implementación de Listener La registra en el componente que dispara el
evento Cuando ocurre el evento
Se invoca el método listener que prcesa el evento
Tipos de eventos Action event
Cuando el usuario activa un componente que implementa ActionSource (botones, hiperligas)
Cambio de valor El usuario cambia el valor de un componente que
implementa: UIInput, UISelectOne, UISelectMany, UISelectBoolean
data – model – event Cuando se selecciona una nueva fila de un
componente UIData
Modelo de validación La validación se realiza antes de actualizar el
modelo de datos Se cuenta con clases estándar para validaciones
comunes Se tienen las etiquetas para invocar estas
validaciones Dos formas de validaciones personalizadas
Implementar la interfaz Validator Registrar la implmentación Crear una etiqueta de usuario
Escribir un método en el bean de respaldo
Modelo de navegación Definición de reglas en el archivo de
configuración de recursos de la aplicación. Hacer referencia a la cadena resultante de
un componente de acción (botón, hiperlink) Proporcionar uno o más métodos de acción
cuyo resultado determina la navegación
Proceso de navegación Click en un botón o liga El componente asociado dispara un evento de acción El evento es manejado por una instancia de del ActionListener
estándar El ActionListener invoca el método de acción aludido por el
componente que disparó el evento El método de acción está en el bean de soporte
Regresa una cadena de resultado El ActionListener pasa el resultado y referencia al método de
acción al NavigationHandlet estándar El NavigationHandler selecciona la página comparando el
resultado o la referencia del método contra las reglas de navegación
Beans de soporte Define las propiedades de componentes UI Contienen métodos asociados a los
componentes Validación Manejo de eventos Proceso de navegación
Para ligar los valores de componentes de UI con las propiedades se usa EL de la forma
#{expresion}
Ejemplo
<h:inputText id="userNo"value="#{UserNumberBean.userNumber}"validator="#{UserNumberBean.validate}" />