Sunteți pe pagina 1din 29

Versin1.

Docente:CdricSimon

SolucionJava.com

Manual del alumno

<JSP>

Ing.CedricSimonTel:22680974Cel:88882387Email: c e d r i c @ s o l u c i o n j a v a . c o m Web:www.solucionjava.com

Curso de
Java Server Pages
Nivel Avanzado

CursodeJSP

Pagina2/29

ndice
ndice....................................................................................................................................................................................2
1 Introduccin al curso.........................................................................................................................................................4
1.1 Objetivo de este curso................................................................................................................................................4
1.2 Manual del alumno.....................................................................................................................................................4
1.3 Ejercicios prcticos....................................................................................................................................................4
1.4 Requisitos para atender a este curso........................................................................................................................4
1.5 Soporte despus del curso..........................................................................................................................................4
2 Acciones personalizadas....................................................................................................................................................5
2.1.1 Introduccin a la etiqueta de extensin.................................................................................................................5
2.1.2 Primera accin personalizada................................................................................................................................6
2.2 Acciones sin cuerpo....................................................................................................................................................7
2.3 Atributos de tipo diferente a String y otros parmetros del atributo...................................................................8
2.4 Acciones con cuerpo...................................................................................................................................................9
3 Utilizacin de COOKIES.................................................................................................................................................12
3.1 Qu son los COOKIES?.........................................................................................................................................12
3.2 Creacin de un COOKIE........................................................................................................................................12
3.3 Recuperacin de informacin de un COOKIE......................................................................................................12
3.4 Borrado de un COOKIE..........................................................................................................................................13
4 RequestDispacher............................................................................................................................................................14
4.1 Qu son los RequestDispacher?............................................................................................................................14
5 Autenticacin del usuario................................................................................................................................................15
5.1 Autenticacin proveda por el contenedor.............................................................................................................15
5.1.1 Mtodos de autenticacin....................................................................................................................................15
5.1.2 Control de acceso a los recursos web..................................................................................................................15
5.1.3 Recuperacin de la informacin del usuario.......................................................................................................17
5.2 Autenticacin manejada por la aplicacin.............................................................................................................17
6 Arquitectura Java Naming Directory Interface (JNDI).................................................................................................18
6.1.1 Ejemplo de JNDI.................................................................................................................................................19
7 Pool de conexiones...........................................................................................................................................................20
7.1 Qu es un pool de conexiones?..............................................................................................................................20
7.2 Creacin de un pool de conexiones.........................................................................................................................20
7.2.1 JBoss ConnectionPooling....................................................................................................................................20
7.2.2 TomcatConnectionPooling..................................................................................................................................21
8 Tomcat con Apache..........................................................................................................................................................22
8.1 El servidor Apache HTTP.......................................................................................................................................22
8.2 Porque usar el servidor Apache..............................................................................................................................22
8.3 Conectar Tomcat con Apache.................................................................................................................................22
8.4 Conectar Tomcat 7 con Apache 2.0........................................................................................................................22
8.4.1 Archivo httpd.conf:.............................................................................................................................................23
8.4.2 Archivo server.xml:.............................................................................................................................................23
8.4.3 Nuevo archivo mod_jk.conf................................................................................................................................23
8.4.4 Nuevo archivo workers.properties......................................................................................................................23
CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina3/29

8.5 Conectar Tomcat 5.5 o 6.0 con Apache 2.2............................................................................................................23


8.5.1 Archivo httpd.conf:.............................................................................................................................................24
8.5.2 Archivo server.xml:.............................................................................................................................................24
9 Cifrar con SSL y uso de HTTPS.....................................................................................................................................25
9.1 Porque cifrar ............................................................................................................................................................25
9.1.1 Archivo httpd.conf:.............................................................................................................................................25
9.1.2 Archivo ssl.conf:.................................................................................................................................................25
10 Marcos de trabajo y EJB...............................................................................................................................................26
10.1 Marcos de trabajo..................................................................................................................................................26
10.2 EJB...........................................................................................................................................................................26
10.3 Marco de trabajo de SolucinJava.com...............................................................................................................27
11 XDoclet...........................................................................................................................................................................28
12 Ejercicios........................................................................................................................................................................29

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina4/29

1 Introduccinalcurso
1.1 Objetivodeestecurso
EnestecursovamosaaprenderellenguajeJSPquenospermitircrearpginaswebdinmicas.

1.2 Manualdelalumno
Estemanualdelalumnoesunaayudaparaelalumno,paratengaunrecuerdodelcurso.Estemanual
contieneunresumendelasmateriasquesevanaestudiarduranteelcurso,peroelalumnodeberade
tomarnotaspersonalesparacompletasestemanual.

1.3 Ejerciciosprcticos
Paracaptarmejorlateora,seharnmuchosejerciciosconlosalumnos,paraprobarlateorayverificar
laintegracindelamateria.

Tambin,elalumnopodrcopiarsuscdigosenundisquetealfindelcursoparallevarse,confinde
seguirlaprcticaensuhogar.

1.4 Requisitosparaatenderaestecurso
UnainiciacinallenguajeJavayelJSPesrequeridaparaseguirestecurso.Lacreacinyelmanejode
objetosJavaascomoelJSPbsicoestnconsideradacmoasimiladoantesdeempezarestecurso.
Sielalumnotienedificultadesenunuotrocapitulo,eldebesentirselibredepedirexplicaciones
adicionalesalprofesor.
Perosiaparecequeelalumnonoposeelosrequisitosmnimosparaestecurso,porrespetoalosotros
alumnosqueyaposeenestamateria,elalumnopodrasertrasladoparaotrocursoenelfuturo,cuando
elcumplirconlosrequisitos.

1.5 Soportedespusdelcurso
Sitienespreguntassobrelamateriadelcursoentusejerciciosprcticos,puedesescribirtus
preguntasacedric@solucionjava.com.
Parainformacionessobreotroscursos,visitaelsitiowebwww.solucionjava.com.

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina5/29

2 Accionespersonalizadas
Lasaccionespersonalizadaspermitenencapsularlalgicayponerlaadisposicindeldiseadorde
pginaenunformatofamiliar.
Vamosaverejemplosquepermitenaccederalabasededatos,codificarURL,incluircontenido
personalizadoalasopcioneslocalesdelsistemadelclientes,etc...utilizandoetiquetaspersonalizadas.
LasaccionespersonalizadasparecenmuchoalosJavaBeansqueveremosmstarde,peroaladiferencia
deellos,laaccinpersonalizadatieneconocimientodelambienteenelcualestautilizada.
ComoelJavaBean,laaccinpersonalizadaestcontenidaenunaclaseJava.
2.1.1

Introduccinalaetiquetadeextensin

Laaccinpersonalizada,queesenrealidadunaclasedemanejodeetiquetaparaunaaccin
personalizada,esbsicamenteunaclaseJavaconmtodopermitiendodemanejarsuspropiedades,
correspondiendoalosatributosdelaaccinpersonalizada.Laclasedemanejodeetiquetatieneque
implementarunoodosinterfacesdefinidosenlasespecificacionesdelJSP.
Todaslasclaseseinterfacesdeaccionespersonalizadasdebendeimplementarunmanejodeetiqueta
definidoenelpaquetejavax.servlet.jsp.tagext. Los dos interfaces primarios se llaman Tag y BodyTag. El
interfaz Tag define los mtodos que necesitamos para cualquier accin. El interfaz BodyTag extiende el
interfaz Tag y adjunta mtodos utilizadas para acceder al cuerpo de un elemento de accin.
Para facilitar el desarrollo de manejo de etiquetas, dos clases de soporte han sido definidas por el API:
TagSupport y BodyTagSupport. Estas clases proveen una implementacin por defecto para los mtodos del
interfaz correspondiente.

Unalibreradeetiquetasesunacoleccindeaccionespersonalizadas.Alladodelasclasesdemanejode
etiquetas,lalibreradeetiquetadebecontenerundescriptordelibreradeetiquetas(Tag Library
Descriptor,oTLD).EsteTLDesunarchivoXMLquetraducelosnombresdeaccionespersonalizadasalas
clasedemanejodeetiquetasquelecorresponde,ydescribelosatributossoportadosporcadaaccin
personalizada.Porfacilidad,sepuedenmeterlasclasesyel TLDenunarchivoJAR,parafacilitarsu
instalacin.

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

2.1.2

Pagina6/29

Primeraaccinpersonalizada

Vamosacrearnuestraprimeraaccinpersonalizada,conelentornoJBoss

IDE.

Primero,creamosunanuevaclasedemanejodeetiqueta.Poreso,hacemosunclicderechosobrela
carpetacurso,yelegimosNew...Other,ydebajodeJBossIDE...Webcontent,elJSPTagHandler.
Locreamosenelpaquetetag,conelnombreHolaTagyelcontenidosiguiente:
package tag;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.*;
public class HolaTag extends TagSupport {
private String nombre = "Mundo";
public void setNombre(String miNombre){
this.nombre=miNombre;
}
public int doStartTag(){
System.out.println("Hola1 "+this.nombre);
return SKIP_BODY;
}
public int doEndTag(){
try{
pageContext.getOut().println("Hola "+this.nombre);
System.out.println("Hola2 "+this.nombre);
}
catch (IOException e) {} // Ignoralo
return EVAL_PAGE;
}
}

Luego,debajodelacarpetaWEBINFcreamosunanuevacarpetatlds.Yadentro,creamosunnuevo
Tag Library Descriptor(debajoJBossIDE...Descriptor),quellamamosmiTagLib.tld.
EditamoselcontenidodemiTagLibylocambiamospor:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.2</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>miTest</short-name>
<description>Etiqueta de prueba</description>
<tag>
<name>hola</name>
<tag-class>tag.HolaTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>nombre</name>
</attribute>
</tag>
</taglib>

Porfin,creamostagSimple.jspparaqueutilizanuestraaccinpersonalizada:
<%@ taglib uri="/WEB-INF/tlds/miTagLib.tld" prefix="miTest" %>
<html>
<head>
<title>Prueba de Taglig</title>
</head>
<body bgcolor="#FFFFFF">
<h1><miTest:hola nombre="Cedric" /></h1>
</body>
</html>

Ymiramoselresultadoenhttp://localhost:8080/curso/tagSimple.jsp

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina7/29

2.2 Accionessincuerpo
Parallamaraunaaccinsincuerpo,seutilizaunaclasequeextiendelaclaseTagSupport,ylaetiqueta
siguiente:<prefijo:nombre_accion atributo1=valor1 atributo2=valor2 ... />
ElprefijoeselprefijodeclaradoenladirectivadepginaTaglib.
Elnombredelaaccincorrespondealnombredelaaccindeclaradoenlalibrera,yquerefiereauna
claseJava.
Losatributossonvaloresquesepuedenatribuiravariablesdelaclase,utilizandolosmtodos
setAtributo1 (valor1), setAtributo2 (valor2),etc...definidasenlaclase.
Lasecuenciadeejecucineslasiguiente:

<prefijo:nombre_accion
atributo1=valor1 ---------- setAtributo1(valor1)
atributo2=valor2 ---------- setAtributo2(valor2)
/>
---------- doStartTag() + doEndTag()

Sepuedetambindefiniras:
<prefijo:nombre_accion
atributo1=valor1
atributo2=valor2
>
Mi cuerpo de etiqueta
</prefijo:nombre_accion>

---------- setAtributo1(valor1)
---------- setAtributo2(valor2)
---------- doStartTag()
---------- doEndTag()

Enesteejemplo,comoestamosutilizandounaclaseextendiendo TagSupport,pordefectoelmtodo
doStarTag() regresaSKIP_BODY,quesignificaquenoutilizaelcuerpodelaetiqueta(aquMicuerpode
etiqueta).LasotrasvaloresparaelreturnsonEVAL_BODY_INCLUDE y EVAL_BODY_BUFFERED.
Afueradelosmtodosdeinicializacindeatributos(setAtributo1,...),dedoStarttag()ydoEndTag(),
existenporlomenosdosotrosmtodosimportante:public void setPageContext(PageContext pageContext)
y public void release().ElmtodosetPageContextpermitedeaccederalaconsultayrespuestadela
pgina,ascomoalasvariablesJSPdelapgina.
Ejemplo:

package tag;
import javax.servlet.jsp.tagext.TagSupport;
import javax.servlet.jsp.*;
import java.io.*;
public class TagSinCuerpo extends TagSupport {
private String context = "Mundo";
protected PageContext pageContext;
public void setPageContext(PageContext pageContext){
this.pageContext=pageContext;
context=(String) pageContext.getRequest().getParameter("test");
}
public int doEndTag(){
try{
pageContext.getOut().println("Parmetro = "+this.context);
System.out.println("Parmetro = "+this.context);
}
catch (IOException e) {} // Ignoralo
return EVAL_PAGE;}
}

AdjuntarenmiTagLib.tldantes</taglib>:
<tag>
</tag>

<name>sinCuerpo</name>
<tag-class> tag.TagSinCuerpo</tag-class>

tagSinCuerpo.jsp:
CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina8/29

<%@ taglib uri="/WEB-INF/tlds/miTagLib.tld" prefix="miTest" %>


<html>
<head>
<title>Prueba de Taglig</title>
</head>
<body bgcolor="#FFFFFF">
<h1><miTest:sinCuerpo /></h1>
</body>
</html>

Llamandoahttp://localhost:8080/curso/tagSinCuerpo.jsp?test=pruebaproduceenlaconsolaylapgina
JSP:Parmetro = prueba
Paraahorrarlamemoria,sedeberadeimplementarelmtodopublic void release(),paraquitartodas
lasreferenciasaobjetosquefueronpuestas:Poreso,selesasignaelvalornuloysellamaalmtodo
release()delobjetomayor(super).Estemtodoserllamadacuandoelmanejodeetiquetasnoserms
necesario(porejemplo,alrecargodelcontexto).
Ejemplo:

public void release(){


nombre=null;
context=null;
pageContext=null;
super.release();
System.out.println("Liberado");
}

2.3 AtributosdetipodiferenteaStringyotrosparmetros
delatributo
Ademsdelnombredelparmetro,sepuedetambindefinirsielparmetroesrequeridoono(por
defectonoloes),sipermiteunvaloraevaluarentiemporeal(=scriplet)ono(pordefectonoloes),yel
tipodedatosqueaccepta(pordefectoesjava.lang.String.
Ejemplodeunparmetrollamadoprecio,queesrequerido(nosepuedeusarlaaccinsindefinirlo),
permiteunvalordinmica,yesdetipoentero.
<attribute>
<name>precio</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Integer</type>
</attribute>

Ejemplo:
package tag;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.*;
public class TagSuma extends TagSupport {
private static final long serialVersionUID = 1L;
private Integer numero1 = 1;
private Integer numero2 = 2;
public void setNumero1(Integer numero1){
this.numero1=numero1;
}
public void setNumero2(Integer numero2){
this.numero2=numero2;
}
@Override
public int doEndTag(){
try{
int resultado=0;

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina9/29
resultado=numero1+numero2;
System.out.println(resultado);
pageContext.getOut().println("Resultado "+resultado);

}
catch (IOException e) {} // Ignoralo
return EVAL_PAGE;

}
public Integer getNumero1() {
return numero1;
}
public Integer getNumero2() {
return numero2;
}

ModificacinenelTLD:
<tag>

<name>suma</name>
<tag-class> tag.TagSuma</tag-class>
<attribute>
<name>numero1</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Integer</type>
</attribute>
<attribute>
<name>numero2</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Integer</type>
</attribute>

</tag>

tagSuma.jsp:
<%@ taglib uri="/WEB-INF/tlds/miTagLib.tld" prefix="miTest" %>
<html>
<head>
<title>Prueba de Taglig</title>
</head>
<body bgcolor="#FFFFFF">
<h1><miTest:suma numero1="1" numero2="5" /></h1>
</body>
</html>

2.4 Accionesconcuerpo
Parallamaraunaaccinconcuerpo,seutilizaunaclasequeextiendelaclaseBodyTagSupport,yla
etiquetasiguiente:<prefijo:nombre_accion atributo1=valor1 atributo2=valor2 ... >
Elusoyelfuncionamientoesparecidoaeldelasaccionessincuerpo,contresmtodosms:
setBodyContent(), doInitBody(), e doAfterBody().
Conelcuerpo,sedebeutilizarunaetiquetadeinicioyunadefin.
Lasecuenciadeejecucineslasiguiente:
<prefijo:nombre_accion
atributo1=valor1
atributo2=valor2
>
Mi cuerpo de etiqueta
</prefijo:nombre_accion>

----------
----------
----------
----------

setAtributo1(valor1)
setAtributo2(valor2)
doStartTag()
setBodyContent() + doInitBody()

---------- doAfterBody()
---------- doEndTag()

Enesteejemplo,comoestamosutilizandounaclaseextendiendo BodyTagSupport,pordefectoelmtodo
doStarTag()sobreescribeelmtododeTagSupportparaqueregresaEVAL_BODY_INCLUDE,loquesignificaque
CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina10/29

seutilizaelcuerpodelaetiqueta(aquMicuerpodeetiqueta).Lasotrasvaloresparaelreturnson
SKIP_BODY y EVAL_BODY_BUFFERED.
ElmtodosetBodyContent()guardasolamenteelcontenidodelcuerpoenunavariable.
Ejemplo:
protected BodyContent bodyContent;
...
public void setBodyContent(BodyContent body) {
this.bodyContent = body;}

ElmtododoInitBody()sedejanormalmentevaca.public

void doInitBody( ) throws JspException {}

ElmtododoAfterBody()eselqueutilizamosparamanejarelcontenidodelcuerpo,siesnecesario.
Sinosenecesitaunabucle,seutilizareturn SKIP_BODY,sinoreturn EVAL_BODY_AGAIN.Cuidadoqueel
cdigodebesiempretenerunaposibilidaddellegaralSKIP_BODY,sino,entraraenunabucleinfinita.
Ejemplo:
ClaseCifraHTML:
package tag;
import javax.servlet.jsp.tagext.BodyTagSupport;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class CifraHTML extends BodyTagSupport {
static final long serialVersionUID =2;
int count =0;
String output="";
public int doStartTag(){
count =0;
output="";
return EVAL_BODY_BUFFERED;
}
public int doAfterBody( ) throws JspException {
BodyContent bc = getBodyContent();
JspWriter out = getPreviousOut();
count++;
if (count>3) {
try {
output+="<p>Ronda "+count+"</p>";
out.write(output);
return SKIP_BODY;
}
catch (IOException e) {return SKIP_BODY;} // Ignore
} else {
if (count==1){
String miCuerpo=bc.getString();
miCuerpo=miCuerpo.replaceAll("&","&amp;");
miCuerpo=miCuerpo.replaceAll("<","&lt;");
miCuerpo=miCuerpo.replaceAll(">","&gt;");
miCuerpo=miCuerpo.replaceAll("\"","&#34;");
miCuerpo=miCuerpo.replaceAll("'","&#39;");
output+=miCuerpo+"<p>Ronda "+count+"</p>";
} else output+="<p>Ronda "+count+"</p>";
return EVAL_BODY_AGAIN ;
}
}
}
miTagLib.tld:
<tag>
<name>CifraHTML</name>
<tag-class> tag.CifraHTML</tag-class>
</tag>
tagCifraHTML.jsp
<%@ taglib uri="/WEB-INF/tlds/miTagLib.tld" prefix="miTest" %>
<html>

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina11/29

<head>
<title>Prueba de Taglig</title>
</head>
<body bgcolor="#FFFFFF">
<h1><miTest:CifraHTML>
Hola "mis queridos" <alumnos> & 'amigos'.
</miTest:CifraHTML></h1>
<hr>
</body>
</html>

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina12/29

3 UtilizacindeCOOKIES
3.1 QusonlosCOOKIES?
LosCOOKIESsonvariablequeseguardanenpequeosarchivosdetextoenlacomputadoradelcliente
yquepermitenguardarciertasinformacioneselcliente.Esopermiteporejemploguardarelnombredel
clientepararecuperarlolaprximavezqueelclienteseconecta.
Alcontrariodelavariabledesesinqueseborranalterminarlasesin,sepuededefinireltiempoqueel
COOKIEestavlido.Pordefecto,estvalidosolamenteporlasesincorriente(comolasvariablesde
sesin),perosepuedecambiarlavalordesutiempodevencimientoparapoderrecuperarlomstarde,
enlaprximaconexin.

3.2 CreacindeunCOOKIE
ElcdigodecreacindeunCOOKIEtienequeirdeprimero,anteslaetiqueta<HTML>ydecualquierotro
cdigoJSP(directivas,...).
DespusdehabercreadoelCOOKIE,hayquedeclararporlaspginasdecualcarpetaelCOOKIEest
disponible.Tambinsepuededeclararporcualdominioestdisponible.
PorfinhayqueenviarelCOOKIEalacomputadoradelcliente.
Unavezcreado,elCOOKIEpuedeserledoporlaspginasJSP.TodoslosCOOKIESdeunmismositio
webestnguardadosjuntosenunarchivotextoenelcliente.
LasintaxisdecreacindeunCOOKIEeslasiguiente:
<%
Cookie nombreDeMiCookie = new Cookie("nombreDeMiVariable","valorDeMiVariable");
nombreDeMiCookie.setPath("/cursoAvanzado");
nombreDeMiCookie.setMaxAge(3600); // una hora, o 3600 segundos
response.addCookie(nombreDeMiCookie);
%>

3.3 RecuperacindeinformacindeunCOOKIE
ParapoderleerunCOOKIE,estedebeexistir.Paraleerlo,seutilizaelmtodogetCookies()queregresa
unarreglodeobjetoCookie.Unavezrecuperada,sepuedesacarelnombredecadavariabledelCOOKIE
ysuvalorconlosmtodosgetName()ygetValue().HayquerecorrertodolosCOOKIESdelarreglopara
buscarelquenosinteresa.
PordefectoelarreglodeCOOKIESsiempretieneelCOOKIEllamadoJSESSIONIDconelvalordela
sesin.Asqueelarreglosiempretieneporlomenosunvalor.
Ejemplo:
<%
Cookie [] miCookie = request.getCookies();
String nombreUsuario="",
for (int x=0;x<miCookie.length;x++)
{
out.print(miCookie[x].getName()+" tiene el valor siguiente: "+ miCookie[x].getValue()+"<br>");
// Buscar Cookie nombreUsuario
if (miCookie[x].getName().equals("nombreUsuario") nombreUsuario= miCookie[x].getValue();
}
%>

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina13/29

3.4 BorradodeunCOOKIE
ParaborrarunCOOKIE,hayqueseguirlamismasintaxisqueparacrearlo,soloqueelvalordel
setMaxAgeiguala0,asqueelCOOKIEexpiardirectamente.
LasintaxisdeborradodeunCOOKIEeslasiguiente:

<%
Cookie nombreDeMiCookie = new Cookie("nombreDeMiVariable","");
nombreDeMiCookie.setPath("/cursoAvanzado");
nombreDeMiCookie.setMaxAge(0); // se vence ahora
response.addCookie(nombreDeMiCookie);
%>

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina14/29

4 RequestDispacher
4.1 QusonlosRequestDispacher?
ElobjectoRequestDispacherpermiteincluirdentrodeunservletelcontenidoquevienedeotrapginao
cdigo,oreenviarlaconsultaaotrapgina.
Estoesparecidoaltag<jsp:include/>oun<jsp:forward/>.
Ejemplo:

...
protected RequestDispatcher rd = null;
...
ServletContext context = this.getServletContext();
rd = context.getRequestDispatcher("/login.jsp");
rd.include(request, response);
rd = context.getRequestDispatcher("/test.txt");
rd.include(request, response);
...

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina15/29

5 Autenticacindelusuario
5.1 Autenticacinprovedaporelcontenedor
EncontenedorenelcualseejecutalapginaJSPproveeunmecanismodeautenticacinintegrado.Le
implementacinpuedevariardeuntipodeservidoraotro.Estemecanismodeautenticacinestabien
probadoyfiable,asqueesunmecanismodeprimeraeleccin.
5.1.1

Mtodosdeautenticacin

Existencuartotiposdeautenticacin:autenticacinHTTPbsica,'digest',autenticacinclienteHTTPS,
yautenticacinbasadoenunformulario.
5.1.1.1

AutenticacinHTTPbsica

Estetipodeautenticacinesmuysimple,peronomuyseguro,porqueutilizaelcifradoBase64,lacuales
conocidaysepuededescifrarsinmuchosesfuerzosporelqueinterceptalospaquetesdecomunicacin.
5.1.1.2

AutenticacinHTTP'digest'

Estemediodeautenticacinesunpocomscomplicado,peromsseguro.Elproblemaesquenotodos
losnavegadoressoportanestetipodeautenticacin.
5.1.1.3

AutenticacindeclienteHTTPS

Estemtododeautenticacineselmsseguro,porqueutilizacertificadodeclavepublica,yunaclave
especificaporcadacliente,vlidamientraselclientequedaconectado.
5.1.1.4

Autenticacinporformulario

Estemtodolepermitepersonalizarlapginadeentrada.Perocomolosdatosestnenviadosentexto
claro,sedeberademezclarconuncifradoSSL.
Porutilizarestemtodo,serequieredosparmetros:j_username y

j_password.

La accin debe ser

j_security_check.

Ejemplo:
<form method="POST" action="j_security_check">
<input type="text" name="j_username">
<input type="password" name="j_password">
</form>

5.1.2

Controldeaccesoalosrecursosweb

Paracontrolarelaccesoalosrecursos,senecesitaporlomenosdoscosas:tenerusuariosdefinidos,y
informacinregistradasobreelcontroldelaccesoalosrecursos.
5.1.2.1

Definicindeusuarios

Ladefinicindeusuariodependedelservidorutilizado.CiertoscomoIISpuedenutilizarlosusuariosdel
sistema,otrosaccedenaunservidorexternoLDAP.ParaTomcat,losusuariosestndefinidosenel
archivotomcat-users.xmlqueseencuentradebajodelacarpeta$TOMCAT_BASE/conf.Lalistadeusuarioses
paratodoslossitiosdelservidor.
Sepuedendefinirusuarios,yasignarlosadiferentesgrupos.
Ejemplo:
<tomcat-users>
<user name="paula" password="boss" roles="admin" />
<user name="hans" password="secret" roles="user" />
</tomcat-users>

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

5.1.2.2

Pagina16/29

Definicindederechosdeaccesos

Ladefinicindeusuariodependedelservidorutilizado.ParaTomcat,losusuariosestndefinidosenel
archivoweb.xmlqueseencuentradebajodelacarpetaWEBINFdelsitioweb.
Ejemplo:

<security-constraint>
<web-resource-collection>
<web-resource-name>admin</web-resource-name>
<url-pattern>/seguridad/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>Prueba curso JSP</realm-name>
<form-login-config>
<form-login-page>/securityCheck.jsp</form-login-page>
<form-error-page>/index.jsp</form-error-page>
</form-login-config>
</login-config>
<security-role>
<description>Administrador</description>
<role-name>admin</role-name>
</security-role>

Elelemento<security-constraint>contieneunelemento<web-resource-collection>quedefinelos
recursosaproteger,yunelemento<auth-constraint>quedefinequientienederechodeaccederal
recursoprotegido.
Adentrodelelemento<web-resource-collection>estdefinidoelpatrndeURLparalosrecursos
protegidos,especificadosenelelemento<url-pattern>.Aslacarpetacontodaslaspginasderegistro
/seguridad/*.
Elelemento<role-name>adentrodelelemento<auth-constraint>mencionaquesolamentelosusuarios
delgrupoadmin.tienenderechodeaccederaesterecursoprotegido.
Ustedpuedetambindefinireltipodeautenticacinautilizaryunnombreasociadoalaspartes
protegidasdelaaplicacin,conocidascomorealm,conelelemento<login-config>.Elelemento<authmethod>aceptalosvaloressiguientes:BASIC,DIGEST,FORM,yCLIENTCERT,quecorrespondenalos
mtodosvistasanteriormente.Cualquiertextopuedeserutilizadoparaelvalordelelemento <realmname>.Etextoestenseadocomopartedelmensajeenlaventanadedialogoqueseabreparapedirel
nombreyclavedelusuario.
Siutilizaslaautenticacinporformulario,hayquemencionarlosnombresdelformulariode
autenticacinydelapginadeerrorenelelemento<login-config>.
Ejemplo:

<login-config>
<auth-method>FORM</auth-method>
<realm-name>Prueba curso JSP</realm-name>
<form-login-config>
<form-login-page>/securityCheck.jsp</form-login-page>
<form-error-page>/securityCheck.jsp?estado=NOK</form-error-page>
</form-login-config>
</login-config>

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

5.1.3

Pagina17/29

Recuperacindelainformacindelusuario

Adentrodelosscriptlets,sepuedenrecuperarelnombredeusuarioyelgrupodelusuariocorriente
(autenticado)conelobjetorequestylosmtodosrequest.getRemoteUser( )y
request.isUserInRole("admin").

5.2 Autenticacinmanejadaporlaaplicacin
Silaautenticacinporelmecanismodelcontenedordebeserlaprimeraeleccin,estemecanismotiene
suslimitacionesalniveldedinamismo.Elmanejodeusuarioesavecesmuyestticoporqueguardado
enunarchivotexto(web.xml)enelservidor,ynoenunabasededatos.
Porestarazn,sepuedeutilizarunmecanismodeseguridadmanejadoporlaaplicacin,queser,por
ejemplo,ligadoaunabasededatosdeusuarios.
Laimplementacindeunmecanismodeautenticacindeusuarioycontrolderecursosnecesitalo
siguiente:
1. Registrodeusuario
2. Pginadeautenticacin
3. Mecanismodeautenticacin,llamadoporlapginadeautenticacin
4. Informacindelusuarioguardadaalniveldelasesin,comopruebadequeelusuarioest
autenticado
5. Verificacindelavalidezdelainformacindesesinencadapginaconaccesorestringido.
Almomentoqueseverificasunombredeusuarioysunombre,seleasignaunaovariasvariablesde
sesin.Enlapginasprotegidas,severificasilavariabledesesinexiste(noesnulo)paraesteusuario.
Siesnulo,esqueelusuarioprobodellagaralapginaconunURLdirecto,sinautenticarse.
Tambin,sielnombredelusuarioesunadelasvariablesdesesin,sepuederecuperardedesde
cualquierapginaJSPdespusdelaautenticacin.

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina18/29

6 ArquitecturaJavaNaming
DirectoryInterface(JNDI)
J2EEutilizaelAPIJNDIparaaccedergenricamenteaserviciosdenombradoydirectorioutilizandola
tecnologaJava.ElAPIJNDIresideentrelaaplicacinyelserviciodenombresyhacequeelserviciode
nombressubyacenteseatransparenteparaloscomponentesdelaaplicacin:

UnclientepuedebuscarreferenciasacomponentesEJBuotrosrecursosenunserviciodenombrescomo
elmencionadoarriba.Elcdigodelclientenosemodifica,sinimportarelserviciodenombresqueseest
utilizandooenqutecnologaestbasado,yestonocreaningunadiferencaenelmodoenquelos
clienteslocalizanlosobjetosremotosmedianteelAPIJNDI.

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina19/29

Paraqueunaaplicacinpuedainteractuarconunserviciodenombre,estedebeconocerlaspropiedades
delservicioJNDIalcualelquiereconectarse.EstaspropiedadessonentreotraseltipodeservicioJNDI
(facory),eldomicilioIPyelPuertodelservicio.

6.1.1
...

EjemplodeJNDI
Properties env = new Properties();
// Definir las propiededes y ubicacion de busqueda de Nombres JNDI.
env.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
env.setProperty("java.naming.provider.url", "localhost:1099");
env.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
try {
Context initial = new InitialContext(env);
Object objref = initial.lookup("ejb/EmployeeCMP");
EmployeeCMPHome home =
(EmployeeCMPHome)PortableRemoteObject.narrow(objref,
EmployeeCMPHome.class);

...

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina20/29

7 Pooldeconexiones
7.1 Quesunpooldeconexiones?
Unpooldeconexionesesunconjuntodeconexionesquequedqnabiertasyquesoncompartidassegn
lasnecesidades.
Elusodepooldeconexionespermitedemejorarlasperformanciasdelaaplicacinahorandoeltiempo
deconexinalabasededatosdecadaconexin.
Conlospoolsdeconexiones,sepuededefinircuantasconexionesdebenquedarabiertasdemanera
permanente(minimodeconexiones),ascomoelmximodeconexionespermitidas.
Elpooldeconexionesrepartelasencuestasalabasededatossegnlasconexionesdisponibles.Siel
mximodeconexionesestllegado,secrearaunafiladeencuestas,esperandoqueseliberauna
conexin.

7.2 Creacindeunpooldeconexiones
Lospoolsdeconexionessecreanenelarchivodeconfiguracindelservidor.Hayquereanudarel
servidor(servicio)paraquelasmodificcionesseanefectivas.
7.2.1

JBossConnectionPooling

EjemploconCursoDS.XML:
<?xml version="1.0" encoding="UTF-8"?>
<!-<!-<!-<!--

==================================================================== -->
New ConnectionManager setup for firebird dbs using jca-jdbc xa driver-->
Build jmx-api (build/build.sh all) and view for config documentation -->
==================================================================== -->

<connection-factories>
<!--FBManager can be used to create and drop databases.
Drop is especially useful during testing, since it
assures a clean start next time. -->
<mbean code="org.firebirdsql.management.FBManager" name="jboss.jca:service=FirebirdManager">
<attribute name="FileName">/Firebird/data/CURSO.FDB</attribute>
<attribute name="UserName">sysdba</attribute>
<attribute name="Password">masterkey</attribute>
<attribute name="CreateOnStart">false</attribute>
<attribute name="DropOnStop">false</attribute>
</mbean>
<tx-connection-factory>
<jndi-name>CursoDS</jndi-name>
<xa-transaction/>
<rar-name>firebirdsql.rar</rar-name>
<connection-definition>javax.sql.DataSource</connection-definition>
<config-property name="Database"
type="java.lang.String">localhost/3050:/Firebird/data/CURSO.FDB</config-property>
<user-name>sysdba</user-name>
<password>masterkey</password>
<!--additional properties. only use one way of setting tx isolation, please
<config-property name="TransactionIsolation"></config-property>
<config-property name="TransactionIsolationName">TRANSACTION_READ_COMMITTED</config-property>
<config-property name="BlobBufferLength"></config-property>
<config-property name="Encoding">UNICODE_FSS</config-property>

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina21/29

-->
<min-pool-size>0</min-pool-size>
<!-- sql to call when connection is created
<new-connection-sql>some arbitrary sql</new-connection-sql>
-->
<!-- sql to call on an existing pooled connection when it is obtained from pool
<check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
-->
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
<metadata>
<type-mapping>Firebird</type-mapping>
</metadata>
</tx-connection-factory>
</connection-factories>

7.2.2

TomcatConnectionPooling

Modificacionesenelarchivoserver.xml:
<Context path="/dbTest" docBase="dbTest"
debug="5" reloadable="true" crossContext="true">
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="dbTest." suffix=".txt" timestamp="true"/>
<Resource name="jdbc/dbTest" auth="Container" type="org.firebirdsql.pool.FBWrappingDataSource"/>
<ResourceParams name="jdbc/dbTest">
<parameter>
<name>factory</name>
<value>org.firebirdsql.pool.FBWrappingDataSource</value>
</parameter>
<parameter>
<name>userName</name>
<value>SYSDBA</value>
</parameter>
<parameter>
<name>password</name>
<value>masterkey</value>
</parameter>
<parameter>
<name>database</name>
<value>localhost/3050:c:/database/EMPLOYEE.GDB</value>
</parameter>
<parameter>
<name>maxConnections</name>
<value>10</value>
</parameter>
<parameter>
<name>minConnections</name>
<value>3</value>
</parameter>
</ResourceParams>
</Context>

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina22/29

8 TomcatconApache
8.1 ElservidorApacheHTTP
ElservidorApacheHTTPeselservidorwebelmasutilizadoenInternet.Funcionabajovarias
plataformas,entreotrosWindowsyLinux.
ElservidorApachetienevariosmdulosqueselepuedenagregar,loqueextiendeconsiderablemente
suscapacidades.
PordefectosolotratapaginasestticasenformatoHTML.Perograciasalusodemdulos,permite
tratartambinpaginasPHP,JSP,usarrepartidordecarga(loadbalancing),servircomoproxy,etc...
LasdosltimasversionesmayoresdelservidorApacheHTTPsonlasversiones2.0y2.2.

8.2 PorqueusarelservidorApache
ElservidorTomcattrabajapordefectoconelpuerto8080,loqueobligaaespecificarelpuertoenelURL,
yaquepordefectoHTTPusaelpuerto80.
Tomcatsepuedeconfigurarparautilizarelpuerto80envez,perobajoLinuxesonosobligaraacorrer
elservidorTomcatcomoROOTyaquelospuertosmenosde1024requierenenderechoderoot.
ComoTomcatejecutacdigoenelservidor,esmejornoexponerlodirectamenteaInternet,yaqueseria
unriesgoadicionalaniveldeseguridad.
Tambin,elusodeApache,ademasdesermasseguro,permitehospedarvariossitios,convarias
tecnologas(PHP,...)bajounmismoservidor.Nospermitetambinfiltrarlassolicitudesdepaginaspara
enviaraTomcatsololasconsultasJSP,ynolasimgenesootrostiposdearchivos(paginasHTML,
PDF,...),yaqueesoafectaraelrendimientodeTomcatquetendraqueprocesarpaginasparanada.

8.3 ConectarTomcatconApache
LaconexinenTomcatyApachesehacedediferentemanera,dependiendodelaversindeTomcatyde
laversindeApache.
EnpracticavamosaverlaconexindeTomcat7conApache2.2,perodartambinlainformacinde
comoconectarApache7conApache2.0,yaqueApache2.0puedeexistirtodavaenmuchosservidores
deproduccin.
Apachetrabajaconsitiosvirtuales(virtualhost),loquepermiteconfiguraryhospedarvariossitiosen
unmismoservidor.

8.4 ConectarTomcat7conApache2.0
ParaconectarTomcat7conApache2.0,seusaelmodulamod_jk.
Parainstalarelconector,hayqueponerlodisponibleenlacarpetademdulosdeApache,activarloenel
archivohttpd.confdeApache,crearlosarchivosmod_jk.confyworkers.properties,yactivarelconector
AJPenserver.xmldeTomcat.
CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina23/29

Paraladocumentacincompleta,verelsitiodeApacheHTTPD(http://httpd.apache.org)yTomcat
(http://tomcat.apache.org).
Aquabajounejemplodelosarchivosnuevosylaslineasamodificarenlosarchivosexistentes.
8.4.1

Archivohttpd.conf:

Adjuntarlaslineassiguientes:
LoadModule jk_module
/usr/lib/apache2-prefork/mod_jk # Linux, ver abajo
Include /tomcat/conf/jk/mod_jk.conf # ruta hacia nuevo archivo mod_jk.conf
# en openSuse, se modifica mejor el archivo /etc/sysconfig/apache2:
APACHE_MODULES="... jk"

8.4.2

Archivoserver.xml:

Adjuntarlaslineassiguientesoquitarelcomentariosiestnencomentario:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009"
enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

8.4.3

Nuevoarchivomod_jk.conf

<IfModule !mod_jk.c>
LoadModule jk_module "/usr/lib/apache2/mod_jk.so"
</IfModule>
JkWorkersFile "/tomcat/conf/jk/workers.properties" # ruta hacia nuevo archivo workers.properties
JkLogFile "/tomcat/logs/mod_jk.log"
JkLogLevel

info

<VirtualHost *:80>
ServerName localhost
ServerAdmin cedric@solucionjava.com
DocumentRoot /srv/www/htdocs # camino por defecto de los archivos del sitio web (no Tomcat)
JkMount /* miConnector # manda solicitud de archivos de en carpeta rais (/) y abajo a miConnector
(Tomcat)
JkUnMount /images/*.* miConnector # no manda solicitud de archvos de en carpeta /images a Tomcat
# JkUnMount solo esta disponible en ultimas versiones del conector.
</VirtualHost>

8.4.4

Nuevoarchivoworkers.properties

worker.list= miConnector
worker.miConnector.port=8009
worker.miConnector.host=localhost
worker.miConnector.type=ajp13

8.5 ConectarTomcat5.5o6.0conApache2.2
EnApache2.2,laconfiguracinesmasfcilqueenApache2.0,ymenosdependiendodelaversinde
Tomcat.
Seutilizanlosmdulosdemod_proxy,mod_proxy_ajp,yopcionalmenteelmodulodereparticionde
cargamod_proxy_balancer.
Solohayquemodificardosarchivosexistentes.Losejemplosabajopuedennecesitaradaptaciones,
dependiendodelasrutasadondeestninstaladoslosprogramas/archivos.

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

8.5.1

Pagina24/29

Archivohttpd.conf:

Adjuntarlaslineassiguientes:
LoadModule proxy_module
LoadModule proxy_ajp_module
LoadModule proxy_balancer_module

/usr/lib/apache2-prefork/mod_proxy.so
/usr/lib/apache2-prefork/mod_proxy_ajp.so
/usr/lib/apache2-prefork/mod_proxy_balancer.so

<VirtualHost *:80>
ServerName localhost # nombre del servidor. Debera coincidir con el nombre de servidor Tomcat
ServerAdmin cedric@solucionjava.com
DocumentRoot /srv/www/htdocs/relih_html # camino de archivos que no son se envian a Tomcat
ProxyPass /images ! # no manda solicitud hacia /images a Tomcat pero las trata en Apache
ProxyPass /scripts ! # no manda solicitud hacia /images a Tomcat pero las trata en Apache
ProxyPass /styles ! # no manda solicitud hacia /images a Tomcat pero las trata en Apache
ProxyPass / balancer://ajp-cluster/ stickysession=JSESSIONID nofailover=On # rais ==> Tomcat
ProxyPassReverse / balancer://ajp-cluster/
<Proxy balancer://ajp-cluster>
BalancerMember ajp://localhost:8009/relih/ route=tomcat1a # definition de un servidor Tomcat
# en caso de load balancing, se pueden definir aqu varios servidores
</Proxy>
</VirtualHost>

8.5.2

Archivoserver.xml:

Adjuntarlaslineassiguientesoquitarelcomentariosiestnencomentario:
<!--

Define an AJP 1.3 Connector on port 8009 -->


<Connector port="8009"
enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina25/29

9 CifrarconSSLyusodeHTTPS
9.1 Porquecifrar
Cuandosusitiocontienedatossensibles,ousarestriccindeacceso,cifrarlatransmisindisminuyeel
riesgodequealguieninterceptaypuedaentenderelcontenidodelatransmisin(usuarioyclave,
contenido,...)
Elcifradousaunpocomasderecursosalniveldelservidoryalniveldelcliente,ytambinaumentaun
pocoeltamaodelastransmisiones,peroenunnivelrazonable.
Parapodercifrar,senecesitaemitiruncertificado.LoscertificadosSSLpuedenserautofirmado(uso
internoosinnecesidaddegrandegarantadeseguridad)ofirmadoporunaautoridadcertificadora(de
20a1,000US$,dependiendodeltipodecertificadoylaautoridadcertificadora).
Lacreacindecertificadosautofirmadosdependedelsistemaoperativo.
PorejemploenSuse10.2,seusaunaconsolacomousuarioroot,ydelacarpeta
/usr/share/doc/packages/apache2 seejecuta ./mkcert.sh make --no-print-directory
/usr/sbin/ custom

/usr/bin/openssl

MasdetallessobreloscertificadosSSLparaSuse10.2en
http://www.novell.com/documentation/opensuse102/index.html?
page=/documentation/opensuse102/opensuse102_reference/data/sec_apache2_ssl.html
EsimportantequeelcampoCOMMONNAMEcorrespondeconelURLdelsitioweb.
Loscertificadosdebenestardisponibleenelservidor.
TomcatsepuedeconfigurarparatrabajarconSSLdirectamente,peroaquvamosaverlaconfiguracion
deApacheconSSL,yaqueApacheeselprincipalservidorwebypuedecomunicarconTomcat.
AlniveldeApache,hayqueinstalaryconfigurarelmoduloSSL,yiniciarApacheconlaopcin-D
9.1.1

SSL.

Archivohttpd.conf:

Adjuntarlaslineassiguientes:
LoadModule ssl_module /usr/lib/apache2-prefork/mod_ssl.so
<IfModule mod_ssl.c> Include ssl.conf # Depende de a donde guarda su archivo ssl.conf
</IfModule>

9.1.2

Archivossl.conf:

Revisarloymodificaralmenoslaslineassiguientes:

<VirtualHost *:443>
#Adjuntar modificaciones de virtual host normal (ver arriba, depende de la versin)
...
SSLEngine on
...
SSLCertificateFile /etc/apache2/ssl/server.crt # Depende de a donde guarda sus certificados
SSLCertificateKeyFile /etc/apache2/ssl/server.key # Depende de a donde guarda sus certificados
...
</VirtualHost>

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina26/29

10MarcosdetrabajoyEJB
10.1Marcosdetrabajo

Losmarcosdetrabajofuerondiseadosconlaideadeestandarizareldesarrollodeaplicaciones,para
aumentarlarapidezdeldesarrollo(paralosqueyaconocenelmarco)ydisminuirelmantenimiento.
Losmarcosdetrabajosonmuypopulares,perotienensusproycontra.
Pro:

Estndardedesarrollo
Traeobjetosycdigos'preparados',listosparausar,bienprobados
UsanelmodeloMVCconEJB
Escodenpartedelcdigo,loquepermiteprogramarsinnecesidaddeentenderloquevadetrs
Seintegranconlasherramientasdedesarrollo
Facilitaelreclutamientodeprogramadores(sielmarcoeslosuficientepopularenlarea)

Contra:
Necesidaddeaprendercomofuncionaelmarcodetrabajo,ademasdeconocerelJava.
Generamuchoarchivosdecdigosadicionales,quehayquemantener.
Agreganunaovariascapasmsalcdigo:configuracin,acciones,...Puededificultarla
depuracindelcdigo
Escondenpartedelcdigo.Siunoquierehaceralgonoprevistoenelmarcodetrabajo,lepuede
salirdifciloavecesimposible
TrabajanconEJBparaelmodelo,loqueobligaduplicarlabasededatosenEJB
UsanarchivosXMLparaconfiguracin>XMLnoesorientadoobjeto,yesunarchivo'fijo'
ObliganrespetarelmodeloMVC>generamscdigo
Nohayunestndar,existenmuchos:Struts2,Spring,Hibernate,ADF,JSF,...
ParaNicaragua,yaesdifcilhallarunprogramadorJava.Sermsdifciltodavahallarun
programadorqueconoceelmarcodetrabajoqueustedutiliza,yaquehayvarios'muypopulares'

10.2EJB

LosEnterpriseJavaBeanssonclasesJavaqueseencuentranenuncontenedorespecficodelservidorde
aplicaciones,yquepuedenserllamadosdesdeotrosmquinasvirtuales(demaneraremota).
Laventajaesqueunmismoobjetosepuedecompartirentrevariasaplicaciones,webodeescritorio.
Seusanentreotrosparaguardarlosdatosenmemoria(Java),coneldobleobjetivodedisminuirlacarga
delabasededatos,ydeindependizarelcdigoJavadelabasededatos(eldriverseencargaque
generarlosSQLnecesarios).
Existenmarcosdetrabajo,comoHibernate,quetambinpermitenuncache'desegundonivel',para
limitaralmximolasllamadasalabasededatos.
PeroelusodeEJBtambintienesuladomalo:
ObligaarecreartodoslosobjetosdelabasededatoscomoclaseJava
Agregaotracapadeprogramacin>dedepuracin
Impideelusodeciertascapacidadesdelabasededatos,comolostriggers.
Enciertoscasos,porraznderendimiento,hayqueescribiryhacerlallamadaSQL
'manualmente',yaqueposiblementeelSQLgeneradonoesptimo.
CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina27/29

10.3MarcodetrabajodeSolucinJava.com

SolucionJavahaliberadopartedelcdigoqueutilizparacrearlaaplicacinRelih(www.relih.com).
Vamosaverlasclasesdeestemarcoqueestnrelacionadasconestecurso:

ConnectDB(JavaBean)
Tools(JavaBean)
Calculo(JavaBean)
Report(TagLib)
Pager(JavaBean)

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina28/29

11XDoclet
LasnotacionXDocletsonanotacionesquepermitengenerarlosarchivosdeconfiguracin(web.xml,
taglib.xml,...)demaneraautomtica.
LaversindeEclipseGanymedeagregaautomticamentelosnuevosServletalarchivoweb.xml,ytrae
unaimplementacindeXDocletperoquenoessatisfactoriaamisojos.
Porque?
1. NogeneraloscomentariosXDocletalcrearelservlet.Solomodificaelweb.xmlalacreacin(no
encasodecambiodelservletaotropaquete,otronombre,...)
2. SialgunaclasetieneuncomentarioXDoclet,borraelarchivoweb.xmlyloremplazaconuna
generadoapartirdelsotagsXDocletencontrados>pierdetodoslosservletsitagXDoclet.
3. NopermitepersonalizarXDoclet(filtrodeclases,versines,archivosadicionalesaincluir,...)
4. SolosirveparaServlet.NosoportalosTaglibs.
5. Corre(pordefecto)cadavezquesemodificaunservlet>sitienescentenasdeservlet,sevuelve
muypesado
Entonces,queusar?
Personalmente,usoelXDocletdelJBossIDEparaEclipse.LafunciondeXDocletdeJBossIDE,permite
definirdemaneramuyprecisaloquedebeincluir,yfuncionatambinparaTaglibs,EJB,Hibernate,
JMX,...EstepluginfuncionaconlasversionesdeJBossToolshastalaversin2.1(noenlaversin3!).
ParaactivarelXDocletdeJBoss,hayqueeditarelarchivo.project,cambiandoen <buildCommand>:
<name>org.eclipse.jst.j2ee.ejb.annotations.xdoclet.xdocletbuilder</name>
<name>org.jboss.ide.eclipse.xdoclet.run.XDocletRunBuilder</name>

Ademashayquecopiarenlaraizdelproyectounarchivo.xdocletcomoelqueseencuentraenel
proyectoJSP_Avanzado.
Hayqueincluirtambienlaslibrerias
XdocletenlaconfiguraciondeEclipse.
CopiarlaslibreriasenlacarpetadeEclipse,
yluegomencionarestaubicacinen
Eclipse...Window...Preferences...XDoclet.
Paraeditar/correrlaXDoclet,hayqueestar
enlaperspectivaJavayenlavistaPackage
Explorer.
Lamalanoticia:
XDocletdeJBossestenabandonoyaque
noestmspresenteenlaversin3.0de
JBossTools.
ElmismositioXDocletnotienenuevas
versiones.
Amedioplazo,harqueirporlassoluciones
integradasenlasherramientasexistentes
(comoEclipse):(.
CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

CursodeJSP

Pagina29/29

12Ejercicios
1)Accionespersonalizadas:
a)Crearunaaccinpersonalizadaqueregresalafechayhoralocal.
b)Crearunaaccinpersonalizadaqueescribeeltextoenrojo,enmayscula,yencuadrado.
c)ModificareltagCifraHTMLparaquesolocifraelcdigoHTML,siniteracinniadjuntode
Ronda...
2)Cookies:
a)Utilizaruncookiepararecordarelnombredeusuario,yproponerelultimonombredeusuario
pordefecto.
b)Crearlaopcindeborrarelcookieyinvalidarlasesinalmismotiempo
3)Autenticacin:
a)CrearsitiosutilizandolosmtodosdeautenticacinBASIC,DIGEST,yFORM.
b)Crearunaautenticacinmanejadaporlaaplicacin

Ejerciciofinal(siquedatiempo):
Crearunaaplicacinwebque:
1) Traetodosucontenidodeunabasededatos:Textos,etiquetas,imgenes,...
2) Tienetrespartes:
i. unapublica:bienvenida,informacionesgenerales,paginaderegistro,listade
productosinprecio.
ii. unaconautenticacindelaaplicacin:listadeproductosconprecio.
iii. unaconautenticacindelcontenedor:manejodeusuariosdeaaplicacin
3) Tienepginadeerrorpersonalizadautilizadaporcadapgina.
4) Unavezautenticado,elnombredelusuariodebeaparecerenlaspantallas.
5) Manejodeunsistemadecompraenlnea:elusuariopuedellenarunalistadecompras,
verlascomprasanteriores,etc...

CopyrightCdricSimon,20052009

Versin1.7

Reproduccinprohibida

S-ar putea să vă placă și