Professional Documents
Culture Documents
12 mayo 08
Qu es la Arquitectura de Software?
La arquitectura de software es el conjunto de decisiones de diseo que, si son tomadas de forma equivocada, pueden provocar que su proyecto sea cancelado Eoin Woods
Alvaro Ortigosa
12 mayo 08
Qu es la Arquitectura de Software?
La arquitectura de un sistema de software define al sistema en trminos de componentes computacionales e interacciones entre esos componentes
Estructura y Topologa
Arquitectura de Software
Componentes:
clientes y servidores bases de datos filtros niveles en un sistema jerrquico llamadas a procedimientos compartimiento de variables protocolos cliente servidor protocolos de acceso a BB.DD. transmisin asncrona de eventos piped streams
Interacciones:
Alvaro Ortigosa
12 mayo 08
Arquitectura de Software
La AdS muestra la correspondencia entre los requisitos del sistema y los elementos del sistema construido (design rationale). La AdS refleja requisitos no funcionales
Capacidad Rendimiento Consistencia Compatibilidad de componentes
Diseo de Software
Ocurre en diferentes niveles Cada nivel tiene sus
Componentes: simples y complejos. Reglas de composicin: para construir componentes complejos. Reglas de comportamiento: proveen semntica para el sistema.
Alvaro Ortigosa
12 mayo 08
Estn relacionados
Arquitectura
Asociacin
de capacidades del sistema con componentes; los componentes son mdulos, que se pueden relacionar de distintas formas. Se utilizan operadores para guiar la composicin de subsistemas en sistemas.
Cdigo Ejecutable
Alvaro Ortigosa
12 mayo 08
Estilos arquitectnicos
Patrones de diseo de AdS
Cliente-Servidor Pipes and filters Blackboard Invocacin implcita (eventos) Modelo de tres capas (multicapas) Orientado a objetos (componentes) Orientado a Servicios Intrpretes Sistemas basados en reglas
Alvaro Ortigosa
12 mayo 08
Cliente-Servidor
Objetivo: proveer arquitectura escalable
Cada ordenador o proceso en la red es o bien cliente o bien servidor. Pasivo (esclavo). Espera peticiones. Cuando recibe una peticin, la procesa y enva respuesta. Puede conservar o no el estado de la comunicacin. Activo (maestro). Enva peticiones. Espera hasta que llega la respuesta.
Servidor:
Cliente:
Cliente-Servidor
Ejemplo: WWW
El cliente realiza una peticin utilizando el protocolo http. El servidor responde con un documento escrito en html.
Alvaro Ortigosa
12 mayo 08
Cliente-Servidor
Escalable?
Total servidores WWW (abril 2007 [Netcraft survey]): Total ordenadores conectados : ~ 1000 M ?
165,719,150
Cliente-Servidor: variacin
Alvaro Ortigosa
12 mayo 08
Cliente-Servidor: variacin
Arquitectura de 2 capas
Arquitectura de 3 capas
16
Alvaro Ortigosa
12 mayo 08
Arquitectura Three-tier
Capa de presentacin la capa superior es la IU. La funcin principal de la IU es traducir tareas y resultados a algo que el usuario pueda entender Capa lgica Coordina la aplicacin, procesa comandos, toma decisiones lgicas y evaluaciones y ejecuta clculos. Tambin mueve y procesa datos entre las otras dos capas. Capa de datos Aqu la informacin es almacenada y recuperada desde una base de datos o sistema de archivos. La informacin es luego devuelta a la capa lgica para ser procesada.
Arquitectura Three-tier
Caso especial del estilo multitier. Ventajas:
Componentes modulares. Cualquier componente puede ser reemplazado independientemente.
Alvaro Ortigosa
12 mayo 08
Client Tier
(Browser)
MySQL DBM
Alvaro Ortigosa
12 mayo 08
HTTP Server
MySQL RDBMS
HTML
PHP
HTML
PHP Interpreter
PHP
File system
22
Alvaro Ortigosa
12 mayo 08
Aplicaciones Distribuidas
Modelo Cliente-Servidor basado en la WWW
C, perl, phyton,..
Alvaro Ortigosa
12 mayo 08
Aplicaciones Distribuidas
Applets
26
Alvaro Ortigosa
12 mayo 08
.html
Cliente
Servidor
27
28
Alvaro Ortigosa
12 mayo 08
Navegador web
Se ejecuta cdigo (clculos, animaciones, etc.) Interfaz grfica plena (botones, mens, dibujar, eventos, etc.) Se evita sobrecargar la CPU del servidor Se evita el trfico de datos y resultados por la red
.html
.class applet
.html
.class applet
Cliente
Servidor
29
Applets
Se ejecutan desde un navegador de pginas web (i.e. un browser de html) No requieren definir main (applets vs. aplicaciones stand-alone)
El navegador crea objetos de las clases de applets y los gestiona llamando a los mtodos init, start, stop, destroy, paint Programar un applet = sobreescribir estos mtodos Una vez definido un applet A, se puede incluir en un documento html con <applet code="A.class" width=500 height=20> </applet> Directorio del fichero .class: document base, codebase y packages
30
Alvaro Ortigosa
12 mayo 08
Ejemplo
HelloWorld.java import java.applet.Applet; import java.awt.Graphics; public class HelloWorld extends Applet { public void paint (Graphics g) { g.drawString ("Hello world!", 50, 25); } }
32
Alvaro Ortigosa
12 mayo 08
Ejemplo.html <HTML> <HEAD> <TITLE> A Simple Program </TITLE> </HEAD> <BODY> Here is the output of my program: <APPLET CODE="HelloWorld.class" WIDTH=150 HEIGHT=25> </APPLET> </BODY> </HTML>
Se crea una instancia del controlador del applet (subclase de Applet). El applet se inicializa a s mismo. init() El applet comienza a ejecutar. start() start
Al ir a otra pgina o minimizar la ventana. El applet tiene la opcin de detenerse. stop() Al regresar a la pgina, el applet puede reiniciarse. start()
Algunos navegadores permiten recargar los applets: descargarlo y volverlo a cargar. Antes de descargarlo, se le da la oportunidad de detenerse y hacer una limpieza final.
Cuando el usuario deja el navegador, el applet tiene la chance de detenerse y hacer limpieza final. destroy()
34
Alvaro Ortigosa
12 mayo 08
Carga de un applet
La JVM del navegador carga el fichero .class indicado en <applet...>, accediendo a l a travs de la red si no es local El navegador crea una instancia de la subclase de applet definida en el fichero .class El navegador invoca el mtodo init() sobre el objeto creado El navegador invoca el mtodo start() sobre el objeto creado Si el applet utiliza una clase auxiliar: 1. 2. applet
35
El navegador comprueba si la clase ya est cargada en el cliente Si no lo est, la busca en el servidor de la pgina html
Ejemplo
import java.applet.Applet; import java.awt.Graphics; public class Simple extends Applet { StringBuffer buffer; void addItem (String newWord) { System.out.println (newWord); buffer.append (newWord); repaint (); } ...
36
Alvaro Ortigosa
12 mayo 08
Ejemplo
... public void init () { buffer = new StringBuffer (); addItem ("initializing... "); } public void start () { addItem ("starting... "); } public void stop () { addItem ("stopping... "); } public void destroy () { addItem ("preparing for unloading..."); } public void paint (Graphics g) { //Draw a Rectangle around the applet's display area. g.drawRect (0, 0, getSize () .width - 1, getSize () .height - 1); //Draw the current string inside the rectangle. g.drawString (buffer.toString (), 5, 15); } }
37
Alvaro Ortigosa
12 mayo 08
Container
Panel
Applet
Alvaro Ortigosa
12 mayo 08
MouseListener
Alvaro Ortigosa
12 mayo 08
Agregando componentes
Applet es una subclase de container...
Luego puede tener componentes! add (Component)
Adds
remove(Component)
Removes
setLayout (LayoutManager)
Sets
43
Hilos y applets
Un applet puede pertenecer a mltiples hilos. Muchos navegadores asignan un hilo para cada applet de una pgina html. Un applet puede lanzar varios hilos en start() Si un applet tiene una tarea que consume mucho tiempo, conviene realizarla en el mtodo run() de un hilo
44
Alvaro Ortigosa
12 mayo 08
getCodeBase() getDocumentBase()
java.net.URL
La interfaz java.applet.AppletContext
Alvaro Ortigosa
12 mayo 08
Seguridad
Restricciones para los applets remotos: the sandbox policy
No pueden leer ni escribir en el disco local (cliente). No pueden cargar clases java locales. No pueden definir mtodos nativos ni arrancar programas en el cliente. Slo pueden realizar conexiones al servidor del que proceden. No pueden leer ciertas propiedades del sistema. Las ventanas que abre un applet tienen diferente aspecto de las que abren las aplicaciones.
Diferencias de unos navegadores a otros Para superar las restricciones: comunicarse con un programa que se ejecute en el servidor y realice las funciones deseadas.
47
Aplicaciones Distribuidas
Servlets
Alvaro Ortigosa
12 mayo 08
Servlets
Similares a los CGI
Se ejecutan en el servidor Se acceden mediante un URL La sintaxis del URL depende del servidor de servlets Incluidos en Java J2EE: packages javax.servlet....
Crear un servlet
Definir una subclase de javax.servlet.http.HttpServlet Implementar alguno de los mtodos:
doGet (ServletRequest request, ServletResponse response) doPost (ServletRequest request, ServletResponse response) service (ServletRequest request, ServletResponse response)
50
Alvaro Ortigosa
12 mayo 08
Ejecutar un servlet
El cliente se conecta al servlet como URL
Directamente tecleado en el navegador En un enlace HTML desde un formulario HTML En un objeto URL de java Se carga la clase del servlet Se crea una instancia Se ejecuta uno de sus mtodos
El servlet termina El cliente lee la salida del servlet, tpicamente un string con cdigo HTML para una pgina web
51
La salida del servlet se utiliza para generar pginas web que son enviadas al cliente La salida del cliente hacia el servlet es menos frecuente; para enviar datos al servlet normalmente se utilizan parmetros Como parte del URL: http://www.mihost.es/ miservlet? param1=valor1¶m2=valor2&... Con un formulario HTML (form + input's)
52
Parmetros HTTP
Alvaro Ortigosa
12 mayo 08
53
54
Alvaro Ortigosa
12 mayo 08
55
56
Alvaro Ortigosa
12 mayo 08
public class Ejemplo extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String nombre = request.getParameter ("nombre"); String tipo = request.getParameter ("tipo"); String escondido = request.getParameter ("escondido"); PrintWriter out = response.getWriter (); out.println ( "<html><body>" + "Hola <b>" + nombre + "</b>, socio " + tipo + ".<br>" + "Este input: " + escondido + " era de tipo hidden." + "</body></html>" ); out.close (); } }
58
Alvaro Ortigosa
12 mayo 08
<%= expresin %> <% sentencia; %> Se pueden utilizar variables implcitas: request, response, y otras
Necesita un servidor web que soporte JSP: p.e. Tomcat Se accede igual que a una pgina html desde un navegador El servidor de JSP compila el documento JSP la primera vez que es accedido
Genera un servlet en un .java (en el servidor) Compila el servlet, lo carga, y lo ejecuta (en el servidor)
Ejemplo
ejemplo.jsp
<html><body> Hola <b> <%= request.getParameter ("nombre") %> </b>, socio <%= request.getParameter ("tipo") %>. <br> Este input: <%= request.getParameter ("escondido") %> era de tipo hidden. </body></html>
60
Alvaro Ortigosa
12 mayo 08
Sentencias de control
ejemplo.jsp
<html><body> Hola <b> <%= request.getParameter ("nombre") %> </b>, socio <%= request.getParameter ("tipo") %>. <br> Este input: <%= request.getParameter ("escondido") %> era de tipo hidden.<br> <% String tipo = request.getParameter ("tipo"); %> <% if (tipo.equals ("individual")) { %> Te toca pagar 5.000 ptas <% } else if (tipo.equals ("estudiante")) { %> Te toca pagar 2.000 ptas <% } else { %> Te toca pagar 50.000 ptas <% } %> </body></html>
61
62
Alvaro Ortigosa
12 mayo 08
Aplicaciones Distribuidas
eXtensible Markup Language (XML)
XML
www.w3.org/XML Estndar W3C, versin 1.0 en 1998 Lenguaje de meta-marcado Intercambio de datos, grficos vectoriales, serializacin de objetos, XSL, etc. Qumica, msica, propiedades inmobiliarias, matemticas, etc. Etiquetas, elementos y atributos con estructura de rbol Validacin: DTD para restringir sintaxis Parsers: SAX, DOM, JDOM
Alvaro Ortigosa
12 mayo 08
Estndares relacionados
XML procede de SGML
Standard Generalized Markup Language, IBM, 70s Complejidad de SGML (150 pginas para su especificacin)
HTML mezcla datos y formateo XML se puede ver como una generalizacin de HTML que explicita estructuras de datos
Sintaxis XML
Estructura de rbol Elementos y atributos Cualquier etiqueta es vlida (por ejemplo, en HTML se pueden usar unos 100 tags)
Alvaro Ortigosa
12 mayo 08
Ejemplo
Raz
<Person birth = "1912" death = "1954" > <name> <firstName> Alan </firstName>
Etiqueta
Atributo
Elemento
<lastName> Turing </lastName> </name> <profession> computer scientist </profession> <profession> mathematician </profession> <profession> cryptographer </profession>
</Person>
Para SVG (Scalable Vector Graphics) ms de 1000 lneas Para XHTML 1.0 ms de 1,500 lneas Para DocBook ms de 11.000 lneas
Alvaro Ortigosa
12 mayo 08
Ejemplo
<!ELEMENT person (name, profession*)> <!ATTLIST person birth CDATA #IMPLIED death CDATA #IMPLIED> <!ELEMENT name (first_name, last_name)> <!ELEMENT first_name (#PCDATA)> <!ELEMENT last_name (#PCDATA)> <!ELEMENT profession (#PCDATA)>
XML en Java
Parsing de XML
Document Object Model: org.w3c.dom Simple API for XML: org.xml.sax JAXP: libreras adicionales a la SDK con extensiones a DOM y SAX
Conversin XML JavaBean: java.beans Procesamiento de XSLT 1.0: javax.xml.transform JavaServer Pages (JSP): javax.servlet.jsp (+ servidor web), slo en J2EE
Alvaro Ortigosa
12 mayo 08
Tecnologa soportada por navegadores web JavaScript, VBScript, Java Applets, DHTML...
En servidor
http://hostname:port?param1=value1¶m2=value2&... - Un proceso por conexin - Sin estado - Unico proceso, un hilo por conexin - Estado: sesin, aplicacin
Estndares
C/C++, Fortran, PERL, TCL, Any Unix shell, Visual Basic, AppleScript
Java Servlets 2.3, mediados 1997 JavaServer Pages 1.2 (JSP), finales 1999
Alvaro Ortigosa
12 mayo 08
Fuente HTML
<html><head><title>Yahoo! Weather - Harare (Zimbabwe) Forecast </title></head><body><table width=100%> <tr bgcolor=CCCCFF><td><b>Harare Today</b></td></tr> <tr><td>at 1:00 pm CAT</td></tr> <tr><td> <table width=100%><tr align=center> <td rowspan=2 bgcolor=FFCC66>Currently: <br><b><font size=+2>21ºC</font></b></td> <td rowspan=2 bgcolor=EEEEEE><img src=thunderstorm.gif> <br>Thunderstorms</td> <td bgcolor=FF9966>Hi: <b>27</b></td></tr> <tr align=center><td bgcolor=FFFF99>Lo: <b>18</b></td> </tr></table> ...
Alvaro Ortigosa
12 mayo 08
... <p><center><img src=cscale.gif></center> <p><table width=100%> <tr><td><b>Appar Temp:</b></td><td>21°</td> <td><b>Dewpoint:</b></td><td>16°</td></tr> <tr><td><b>Barometer:</b></td><td>1017 mb; falling</td> <td><b>Wind:</b></td><td>SE/10 mph</td></tr> <tr><td><b>Humidity:</b></td><td>73%</td> <td><b>Visibility:</b></td><td>6 mi</td></tr> </table></td></tr> </table> </body></html>
public class WeatherServlet extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter (); out.println ( // HTML source here "<html><head><title>Yahoo! Weather - Harare (Zimbabwe) " + "Forecast</title></head><body><table width=100%>" + "<tr bgcolor=CCCCFF><td><b>Harare Today</b></td></tr>" + "<tr><td>at 1:00 pm CAT</td></tr><tr><td>" + "<table width=100%><tr align=center>" + "<td rowspan=2 bgcolor=FFCC66>Currently:" + "<br><b><font size=+2>21ºC</font></b></td>" + "<td rowspan=2 bgcolor=EEEEEE>" + "<img src=thunderstorm.gif><br>Thunderstorms</td>" + "<td bgcolor=FF9966>Hi: <b>27</b></td></tr>" + "<tr align=center><td bgcolor=FFFF99>Lo: <b>18</b></td>" + "</tr></table> ...
Alvaro Ortigosa
12 mayo 08
... + "<p><center><img src=cscale.gif></center>" + "<p><table width=100%>" + "<tr><td><b>Appar Temp:</b></td><td>21°</td>" + "<td><b>Dewpoint:</b></td><td>16°</td></tr>" + "<tr><td><b>Barometer:</b></td><td>1017 mb; falling</td>" + "<td><b>Wind:</b></td><td>SE/10 mph</td></tr>" + "<tr><td><b>Humidity:</b></td><td>73%</td>" + "<td><b>Visibility:</b></td><td>6 mi</td></tr>" + "</table></td></tr></table></body></table>" ); // End HTML source out.close (); } }
Datos en XML
<!-- weather.xml --> <weather> <city name = "Harare" country = "Zimbabwe"> <curtemp> 21 </curtemp> <maxtemp> 27 </maxtemp> <mintemp> 18 </mintemp> <appartemp> 21 </appartemp> <dewpoint> 16 </dewpoint> <barometer> 1017 </barometer> <wind> 10 </wind> <humidity> 73 </humidity> <visibility> 6 </visibility> <sky> Thunderstorms </sky> </city> ... </weather>
Alvaro Ortigosa
12 mayo 08
Parsing de XML
En el cliente (navegador) vs. en el servidor Procesadores: SAX, DOM, otros...
Xalan: XSLT Xerces: SAX + DOM JAXP: SAX + DOM + XSLT JDOM JOX
Parsing de XML
Aplicaciones XML
JSP
Java Beans
JOX
DOM
XML
JDBC
BD
80
Alvaro Ortigosa
12 mayo 08
... <xsl:template match="city"> <html><head><title>Yahoo! Weather <xsl:value-of select="name"/> (<xsl:value-of select="country"/>) Forecast</title></head><body> <table width="100%"> <tr bgcolor="CCCCFF"><td><b> <xsl:value-of select="name"/> Today</b></td></tr> <tr><td>at 1:00 pm CAT</td></tr> ...
Alvaro Ortigosa
12 mayo 08
... <tr><td><table width="100%"><tr align="center"> <td rowspan="2" bgcolor="FFCC66">Currently: <br/><b><font size="+2"> <xsl:value-of select="curtemp"/> </font></b></td> <td rowspan="2" bgcolor="EEEEEE"><img src="thunderstorm.gif"/> <br/><xsl:value-of select="sky"/></td> <td bgcolor="FF9966">Hi: <b><xsl:value-of select="maxtemp"/></b></td></tr> <tr align="center"> <td bgcolor="FFFF99">Lo: <b><xsl:value-of select="mintemp"/></b></td></tr> </table> <p/><center><img src="cscale.gif"/></center> ...
... <p/><table width="100%"> <tr><td><b>Appar Temp:</b></td><td> <xsl:value-of select="appartemp"/></td> <td><b>Dewpoint:</b></td><td> <xsl:value-of select="dewpoint"/></td></tr> <tr><td><b>Barometer:</b></td><td> <xsl:value-of select="barometer"/> mb; falling</td> <td><b>Wind:</b></td><td> <xsl:value-of select=wind"/> mph</td></tr> <tr><td><b>Humidity:</b></td><td> <xsl:value-of select="humidity"/>%</td> <td><b>Visibility:</b></td><td> <xsl:value-of select="visibility"/> mi</td></tr> </table></td></tr></table></body></html> </xsl:template> </xsl:stylesheet>
Alvaro Ortigosa
12 mayo 08
Slo tiene iteracin sobre listas de nodos (aunque permite recursin) Acceso a BD requiere cdigo Java Control de flujo va tipo por tipo de nodo, p.e. es difcil expresar:
condiciones generales para grupos de tipos de nodos condiciones sobre otros nodos circundantes
...
JDOM
Similar a DOM (documento como un rbol), sintaxis ms sencilla Fcil conversin a DOM y viceversa Clases principales: Document, Element, Attribute, Text, Comment, Namespace, ProcessingInstruction... Las clases no forman jerarqua como en DOM No es un estndar W3C www.jdom.org Document Element Attr En DOM: Node
Alvaro Ortigosa
12 mayo 08
Element
Element(String name) getAttribute(String name) Attribute getAttributeValue(String name) String getChild(String name) Element getChildText(String name) String getChildren(String name) List getText() String getParent() Element
Parsing y conversiones
SAXBuilder
DOMBuilder
DOMOutputter
XMLOutputter
Alvaro Ortigosa
12 mayo 08
... Element city = null; List cities = root.getChildren ("city"); for (Iterator iter = cities.iterator (); iter.hasNext ();) { city = (Element) iter.next (); if (city.getAttributeValue ("name") .equals (cityName)) break; } if (!city.getAttributeValue ("name") .equals (cityName)) { out.println ("<html><body> City does not exist </body></html>"); out.close (); return; } ...
Alvaro Ortigosa
12 mayo 08
... String country = city.getAttributeValue ("country"); String curtemp = city.getChildText ("curtemp"); String maxtemp = city.getChildText ("maxtemp"); String mintemp = city.getChildText ("mintemp"); String appartemp = city.getChildText ("appartemp"); String dewpoint = city.getChildText ("dewpoint"); String barometer = city.getChildText ("barometer"); String wind = city.getChildText ("wind"); String humidity = city.getChildText ("humidity"); String visibility = city.getChildText ("visibility"); String sky = city.getChildText ("sky"); ...
... out.println ( // HTML source here "<html><head><title>Yahoo! Weather - " + cityName + " (" + country + ") Forecast</title></head>" + "<body><table width=100%>" + "<tr bgcolor=CCCCFF><td><b>" + cityName + " Today</b></td></tr>" + "<tr><td>at 1:00 pm CAT</td></tr><tr><td>" + "<table width=100%><tr align=center>" + "<td rowspan=2 bgcolor=FFCC66>Currently:" + "<br><b><font size=+2>" + curtemp + "ºC</font></b></td>" + "<td rowspan=2 bgcolor=EEEEEE>" + "<img src=thunderstorm.gif><br>" + sky + "</td>" + "<td bgcolor=FF9966>Hi: <b>" + maxtemp + "</b></td></tr>" + "<tr align=center><td bgcolor=FFFF99>Lo: <b>" + mintemp + "</b>" + "</td></tr></table>" ...
Alvaro Ortigosa
12 mayo 08
... + "<p><center><img src=cscale.gif></center>" + "<p><table width=100%>" + "<tr><td><b>Appar Temp:</b></td><td> + appartemp + "°</td>" + "<td><b>Dewpoint:</b></td><td> + dewpoint + "°</td></tr>" + "<tr><td><b>Barometer:</b></td><td> + barometer + " mb; falling</td>" + "<td><b>Wind:</b></td><td>" + wind + " mph</td></tr>" + "<tr><td><b>Humidity:</b></td><td>" + humidity + "%</td>" + "<td><b>Visibility:</b></td><td> + visibility + " mi</td></tr>" + "</table></td></tr></table></body></html>" ); // End HTML source out.close (); } }
Alvaro Ortigosa
12 mayo 08
... Element city = null; NodeList cities = doc.getElementsByTagName ("city"); for (int i = 0; i < cities.getLength (); i++) { city = (Element) cities.item (i); if (city.getAttribute ("name") .equals (cityName)) break; } if (!city.getAttribute ("name") .equals (cityName)) { out.println ("<html><body>City does not exist</body></html>"); out.close (); return; } ...
... String country = city.getAttribute ("country"); String curtemp = city.getElementsByTagName ("curtemp") .item (0) .getNodeValue (); String maxtemp = city.getElementsByTagName ("maxtemp") .item (0) .getNodeValue (); String mintemp = city.getElementsByTagName ("mintemp") .item (0) .getNodeValue (); String appartemp = city.getElementsByTagName ("appartemp") .item (0) .getNodeValue (); String dewpoint = city.getElementsByTagName ("dewpoint") .item (0) .getNodeValue (); ...
Alvaro Ortigosa
12 mayo 08
... String barometer = city.getElementsByTagName ("barometer") .item (0) .getNodeValue (); String wind = city.getElementsByTagName ("wind") .item (0) .getNodeValue (); String humidity = city.getElementsByTagName ("humidity") .item (0) .getNodeValue (); String visibility = city.getElementsByTagName ("visibility") .item (0) .getNodeValue (); String sky = city.getElementsByTagName ("sky") .item (0) .getNodeValue (); ... // El resto del ejemplo igual que con JDOM...
Alvaro Ortigosa
12 mayo 08
... Element city = null; List cities = root.getChildren ("city"); for (Iterator iter = cities.iterator (); iter.hasNext ();) { city = (Element) iter.next (); if (city.getAttributeValue ("name") .equals (cityName)) break; } if (!city.getAttributeValue ("name") .equals (cityName)) { out.println ("<html><body>City does not exist</body></html>"); out.close (); return; } ...
... XSLTProcessor processor = XSLTProcessorFactory.getProcessor ( new XercesLiaison()); XSLTInputSource xmlSource = new XSLTInputSource ( new DOMOutputter() .output (city)); // doc XSLTInputSource xslSheet = new XSLTInputSource ("weather.xsl"); XSLTResultTarget xmlResult = new XSLTResultTarget (out); // processor.setStylesheetParam ("cityName", // "'" + cityName + "'"); processor.process (xmlSource, xslSheet, xmlResult); } catch (SAXException ex) { out.println ("<html><body>Internal error</body></html>"); ex.printStackTrace (); } catch (JDOMException ex) { out.println ("<html><body>Internal error</body></html>"); ex.printStackTrace (); } out.close (); } }
Alvaro Ortigosa
12 mayo 08
Ejemplo
<%@ page import="org.jdom.*" %> <%@ page import="java.util.*" %> <!-- Mas imports... --> <% String cityName = request.getParameter ("city"); Element root; try { SAXBuilder b = new SAXBuilder(); Document doc = b.build (new File ("weather.xml")); root = doc.getRootElement (); } catch (JDOMException ex) { ex.printStackTrace (); %> <html><body> Internal error </body></html> <% return; } ...
Alvaro Ortigosa
12 mayo 08
... Element city = null; List cities = root.getChildren ("city"); for (Iterator iter = cities.iterator (); iter.hasNext ();) { city = (Element) iter.next (); if (city.getAttributeValue ("name") .equals (cityName)) break; } if (!city.getAttributeValue ("name") .equals (cityName)) %> <html><body> City does not exist </body></html> <%
... else { String country = city.getAttributeValue ("country"); String curtemp = city.getChildText ("curtemp"); String maxtemp = city.getChildText ("maxtemp"); String mintemp = city.getChildText ("mintemp"); String appartemp = city.getChildText ("appartemp"); String dewpoint = city.getChildText ("dewpoint"); String barometer = city.getChildText ("barometer"); String wind = city.getChildText ("wind"); String humidity = city.getChildText ("humidity"); String visibility = city.getChildText ("visibility"); String sky = city.getChildText ("sky"); %> ...
Alvaro Ortigosa
12 mayo 08
... <html><head><title>Yahoo! Weather <%= cityName %> (<%= country %>) Forecast</title></head><body> <table width=100%> <tr bgcolor=CCCCFF><td><b> <%= cityName %> Today</b></td></tr> <tr><td>at 1:00 pm CAT</td></tr> <tr><td><table width=100%><tr align=center> <td rowspan=2 bgcolor=FFCC66>Currently: <br><b><font size=+2> <%= curtemp %> ºC</font></b></td> <td rowspan=2 bgcolor=EEEEEE><img src=/thunderstorm.gif> <br> <%= sky %> </td> <td bgcolor=FF9966>Hi: <b> <%= maxtemp %> </b></td></tr> <tr align=center><td bgcolor=FFFF99>Lo: <b> <%= mintemp %> </b></td> </tr></table> <p><center><img src=/cscale.gif></center> ...
... <p><center><img src=/cscale.gif></center> <p><table width=100%> <tr><td><b>Appar Temp:</b></td><td> <%= appartemp %>° </td> <td><b>Dewpoint:</b></td><td> <%= dewpoint %>° </td></tr> <tr><td><b>Barometer:</b></td><td> <%= barometer %> mb; falling</td> <td><b>Wind:</b></td><td> <%= wind %> mph</td></tr> <tr><td><b>Humidity:</b></td><td> <%= humidity %> %</td> <td><b>Visibility:</b></td><td> <%= visibility %> mi</td></tr> </table></td></tr></table></body></html> <% } %>
Alvaro Ortigosa
12 mayo 08
Sintaxis JSP
Directivas <%@ page import="java.util.*" %> <%@ include file="abc.html" %> <%@ taglib uri="org.apache.jakarta." prefix="" %> Acciones: beans (use, get, set), include, forward, otras... <jsp:forward
Scope
Page Request Session
Session ID se genera en el servidor Se intercambia con el cliente por medio de Cookies | SSL | URL rewrite (no todos los navegadores lo soportan)
Alvaro Ortigosa
12 mayo 08
Web Client
Devuelve x.getP
()
Ejecuta x.setP
("valor")
Alvaro Ortigosa
12 mayo 08
Ejemplo
// Definir clase de bean public class CityBean { String name, country, curtemp, maxtemp, mintemp, appartemp, dewpoint, barometer, wind, humidity, visibility, sky; public String getName () { return name; } public void setName (String str) { name = str; } public String getCountry () { return country; } public void setCountry (String str) { country = str; } public String getCurtemp () { return curtemp; } public void setCurtemp (String str) { curtemp = str; } ... // Etc. }
<!-- Usar el bean en JSP --> <%@ page import="org.jdom.*" %> ... // Obtener DOM Element 'city' para la ciudad pedida // (igual que en ejemplo anterior) ... // Declarar cityBean <jsp:useBean id="cityBean" class="CityBean" scope="session"/> <% // Meter los datos de city en cityBean (usando JOX) try { new JOXBeanBuilder (city) .readObject (cityBean); } catch (Exception ex) { ex.printStackTrace(); } %> ...
Alvaro Ortigosa
12 mayo 08
... // Usar las propiedades del bean <html><head><title>Yahoo! Weather <jsp:getProperty name="cityBean" property="name"/> (<jsp:getProperty name="cityBean" property="country"/>) Forecast</title></head><body> <table width=100%> <tr bgcolor=CCCCFF><td><b> <jsp:getProperty name="cityBean" property="name"/> Today</b></td></tr> <tr><td>at 1:00 pm CAT</td></tr> <tr><td><table width=100%><tr align=center> <td rowspan=2 bgcolor=FFCC66>Currently: <br><b><font size=+2> <jsp:getProperty name="cityBean" property="curtemp"/> ºC </font></b></td> <td rowspan=2 bgcolor=EEEEEE><img src=/thunderstorm.gif> ... // Etc.
Dates SQL
XSL Otras...
Alvaro Ortigosa
12 mayo 08
Alvaro Ortigosa
12 mayo 08
Nombre de la librera Nombre del tag Clase Java asociada (a definir despus) Atributos del tag
<tag> <name> hello </name> <tagclass> HelloTag </tagclass> <attribute> name </attribute> </tag> </taglib>
// 2. Definir subclase de TagSupport o BodyTagSupport public class HelloTag extends TagSupport { private String name = "World"; // Un mtodo set por cada atributo public void setName (String str) { name = str; } // Se sobreescriben mtodos de TagSupport, como doEndTag () public int doEndTag () { try { pageContext.getOut () .print ("Hello " + name); } catch (IOException ex) { ex.printStackTrace (); } return EVAL_PAGE; } }
Alvaro Ortigosa
12 mayo 08
<!-- 3. Usar tag en fichero jsp --> <%@ taglib uri="mylib.tld" prefix="test" %> <html> <body> <test:hello name="Pepe"/> </body> </html>
TagSupport methods
Alvaro Ortigosa
12 mayo 08
BodyTagSupport methods
setAtr2("valor2")
Driver Access
Driver Oracle
... ...
BD Access
BD Oracle
BD SQL Server
122
Alvaro Ortigosa
12 mayo 08
123
... stmt.executeUpdate ( // Crear tabla Cuentas "CREATE TABLE Cuentas " + "(numero INTEGER, saldo INTEGER, dniTitular VARCHAR(20))"); stmt.executeUpdate (// Crear tabla Clientes "CREATE TABLE Clientes " + "(nombre VARCHAR(40), dni VARCHAR(20))"); // Insertar varios registros en las tablas creadas stmt.executeUpdate ("INSERT INTO Cuentas (numero, saldo, dniTitular) " + "VALUES (123, 1000, '156898')"); stmt.executeUpdate ("INSERT INTO Cuentas (numero, saldo, dniTitular) " + "VALUES (456, 500, '230932')"); stmt.executeUpdate ("INSERT INTO Cuentas (numero, saldo, dniTitular) " + "VALUES (789, 3000, '156898')"); stmt.executeUpdate ("INSERT INTO Clientes (nombre, dni) " + "VALUES ('Juan', '156898')"); stmt.executeUpdate ("INSERT INTO Clientes (nombre, dni) " + "VALUES ('Luis', '230932')"); stmt.executeUpdate ("UPDATE Cuentas SET saldo = saldo * 1.2 " + "WHERE dniTitular = '156898' AND saldo < 2000"); stmt.executeUpdate ("DELETE FROM Cuentas WHERE saldo < 1000"); ...
Alvaro Ortigosa
12 mayo 08
... // Realizar una consulta sobre la base de datos ResultSet rs = stmt.executeQuery ( "SELECT Clientes.nombre, Clientes.dni, " + "Cuentas.numero, Cuentas.saldo " + "FROM Cuentas, Clientes " + "WHERE Cuentas.dniTitular = Clientes.dni " + "AND Cuentas.saldo > 2000"); while (rs.next ()) { String nombre = rs.getString ("nombre"); String dni = rs.getString ("dni"); int numero = rs.getInt ("numero"); int saldo = rs.getInt ("saldo"); System.out.println (nombre + " " + dni + " " + numero + " " + saldo); } } // Fin de main }
126
Alvaro Ortigosa