Java Servlets - Universidad Complutense de Madrid

Anuncio
Java Servlets
Luis Fernando Llana Dı́az
Departamento de Sistemas Informáticos y Programación
Universidad Complutense de Madrid
17 de abril de 2006
Luis Fernando Llana Dı́az
Java Servlets
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
input, output
En pascal input, output
program holaMundo ( input , output );
var
nombre : String ;
begin
readLn ( nombre );
writeLn ( ’ Hola ’ , nombre );
end .
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
input, output
HttpServletRequest, HttpServletResponse
import javax . servlet .*;
import javax . servlet . http .*;
import java . io .*;
public class HolaMundo extends HttpServlet {
public final void doGet ( final H t t p S e r v l e t R e q u e s t request ,
final H t t p S e r v l e t R e s p o n s e response )
throws ServletException , IOException {
S e r v l e t O u t p u t S t r e a m out = response . getOutputStream ();
String nombre = request . getParamter ( " nombre " );
response . setContentType ( " text / html " );
if ( nombre == null ) {
out . println ( " <p > Hola Mundo </ p > " );
} else {
out . println ( " <p > Hola " + nombre + " </p > " );
}
}
}
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Servidor de aplicaciones: Tomcat
Los severlet son controlados por servidor de aplicaciones.
Tomcat: http://jakarta.apache.org/tomcat/index.html
Cuando una petición llega
1 Si el objeto de la clase no ha sido creado
1
2
3
2
Carga la clase
Crea el objeto
Invoca el método init.
Llama al método service.
Si debe eliminar al servlet llama al método destroy.
Luis Fernando Llana Dı́az
Java Servlets
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Servlet contador I
public class Contador extends HttpServlet {
private int contador ;
/*
Métodos para guardar el contador antes de f i n a l i z a r y leerlo
al empezar . . . . . . . . . . . . . . . . . . . . . . . . .
*/
private synchronized int incrementa () {
contador ++;
return contador ;
}
public final void doGet ( final H t t p S e r v l e t R e q u e s t request ,
final H t t p S e r v l e t R e s p o n s e response )
throws ServletException , IOException {
int n = incrementa ();
S e r v l e t O u t p u t S t r e a m out = response . getOutputStream ();
String nombre = request . getParameter ( " nombre " );
response . setContentType ( " text / html " );
out . println ( " <p > Número de accesos : " + n + " </p > " );
}
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Servlet contador II
private ServletConfig config ;
private final static String strFichero = " fichero " ;
public final void init ( final ServletConfig c )
throws ServletException {
config = c ;
ServletContext ctx = config . g e t S e r v l e t C o n t e x t ();
String fichero = config . getInitParameter ( strFichero );
try {
BufferedReader f
= new BufferedReader (
new FileReader ( ctx . getRealPath ( fichero )));
contador = Integer . parseInt ( f . readLine ());
f . close ();
} catch ( F i l e N o t F o u n d E x c e p t i o n e ) {
contador = 0;
} catch ( IOException e ) {
contador = 0;
}
}
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Servlet contador III
public final void destroy () {
ServletContext ctx = config . g e t S e r v l e t C o n t e x t ();
String fichero = config . getInitParameter ( strFichero );
try {
FileWriter f = new FileWriter ( ctx . getRealPath ( fichero ));
f . write ( contador + " \ n " );
f . close ();
} catch ( IOException e ) {
throw new RuntimeException ( e . g e t L o c a l i z e d M e s s a g e ());
}
}
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
9
10
11
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Aplicación Hola I
TOMCAT_HOME / webapps / hola
1
| - - build . xml
2
| - - contador . txt
3
| - - html
4
|
| - - cabecera . html
5
|
‘-- pie . html
6
| - - prj . el
7
| - - src
8
|
| - - Contador . java
9
|
| - - Debug . java
10
|
| - - EnvoltorioHTML . java
11
|
| - - Fecha . java
12
|
| - - HolaMundo . java
13
|
| - - IncluyeFichero . java
14
|
| - - Login . java
15
|
‘-- Sesion . java
16
‘-- WEB - INF
17
| - - classes
18
|
| - - Contador . class
19
|
| - - Debug . class
20
|
| - - EnvoltorioHTML . class
21
|
| - - Fecha . class
22
|
| - - HolaMundo . class
23
|
| - - IncluyeFichero . class
24
|
| - - Login . class
25
|
‘-- Sesion . class
26
| - - lib
27
‘-- web . xml
28
Luis Fernando Llana Dı́az
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Java Servlets
Aplicación Hola II (fichero web.xml)
<? xml version = " 1.0 " encoding = " ISO -8859 -1 " ? >
<web - app >
< display - name > Servlets de prueba </ display - name >
< servlet >
< servlet - name > hola </ servlet - name >
< servlet - class > HolaMundo </ servlet - class >
</ servlet >
< servlet >
< servlet - name > contador </ servlet - name >
< servlet - class > Contador </ servlet - class >
< init - param >
< param - name > fichero </ param - name >
< param - value > contador . txt </ param - value >
</ init - param >
</ servlet >
< servlet - mapping >
< servlet - name > invoker </ servlet - name >
<url - pattern >/ http /* </ url - pattern >
</ servlet - mapping >
< servlet - mapping >
< servlet - name > invoker </ servlet - name >
<url - pattern >/ servlet /* </ url - pattern >
</ servlet - mapping >
</ web - app >
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Filtros I
Transformar la salida del servlet
Filtro 1
Filtro 2
Servlet
Aplicaciones:
autentificación,
cifrado,
transformaciones XML,
lo que se quiera....
Luis Fernando Llana Dı́az
Java Servlets
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Filtros II
public class EnvoltorioHTML implements Filter {
private static final String cabecera = " html / cabecera . html " ;
private static final String pie = " html / pie . html " ;
private static final String strTitulo = " titulo " ;
private FilterConfig conf ;
public void init ( FilterConfig filterConfig ) throws ServletException {
conf = filterConfig ;
}
public void destroy () {
conf = null ;
}
public void doFilter ( ServletRequest request ,
ServletResponse response ,
FilterChain filterChain )
throws IOException , ServletException {
String fichero = conf . g e t S e r v l e t C o n t e x t (). getRealPath ( cabecera );
String cabecera = IncluyeFichero . incluye ( fichero );
String titulo = conf . getInitParameter ( strTitulo );
S e r v l e t O u t p u t S t r e a m out = response . getOutputStream ();
cabecera = cabecera . replaceAll ( " < title > " ," < title > " + titulo );
out . println ( cabecera );
filterChain . doFilter ( request , response );
fichero = conf . g e t S e r v l e t C o n t e x t (). getRealPath ( pie );
out . println ( IncluyeFichero . incluye ( fichero ));
}
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Filtros III
html/cabecera.html
<! DOCTYPE HTML PUBLIC " -// W3C // DTD HTML 4.01// EN " >
< html >
< head >
< meta http - equiv = " Content - Type " content = " text / html ; ch arset = iso -8859 -15 " >
< title > </ title >
</ head >
< body >
1
2
3
4
5
6
7
html/pie.html
< hr >
< address >
<a href = " mailto : l u i s @ r a m o n v a z q u e z . net " >
Luis Fernando Llana Dı́az
</ a >
</ address >
</ body >
</ html >
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Filtros IV (fichero web.xml)
..... parametros globales de la aplicacion
< filter >
< filter - name > envoltorioHola </ filter - name >
< filter - class > EnvoltorioHTML </ filter - class >
< init - param >
< param - name > titulo </ param - name >
< param - value > Hola Mundo </ param - value >
</ init - param >
</ filter >
< filter >
< filter - name > e n v o l t o r i o C o n t a d o r </ filter - name >
< filter - class > EnvoltorioHTML </ filter - class >
< init - param >
< param - name > titulo </ param - name >
< param - value > Ejemplo de contador </ param - value >
</ init - param >
</ filter >
< filter - mapping >
< filter - name > envoltorioHola </ filter - name >
<url - pattern >/ http / hola </ url - pattern >
</ filter - mapping >
< filter - mapping >
< filter - name > e n v o l t o r i o C o n t a d o r </ filter - name >
<url - pattern >/ http / contador </ url - pattern >
</ filter - mapping >
definicion de servlets .....
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Sesiones I
HttpSession sesion = request . getSession ();
String nombre =( String ) sesion . getAttribute ( strNombre );
Integer numAccesos = ( Integer ) sesion . getAttribute ( strNumAccesos );
if ( numAccesos == null ) {
numAccesos = new Integer (0);
}
sesion . setAttribute ( strNumAccesos , new Integer ( numAccesos . intValue ()+1));
...............
...............
if ( borroSesion != null ) {
contenido . append ( sesionBorrada ( response ));
sesion . removeAttribute ( strNumAccesos );
sesion . removeAttribute ( strNombre );
}
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Sesiones II
Reescritura de URL
Cookies
Luis Fernando Llana Dı́az
Java Servlets
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Sesiones III
Se hace de forma automática, toda URL debe ser codificada.
Funciona tanto si tiene como si no tiene las cookies habilitadas.
private StringBuffer f o r m u l a r i o C o n t i n u a ( H t t p S e r v l e t R e s p o n s e response ) {
1
StringBuffer sb = new StringBuffer ();
2
sb . append ( " < form type =\" get \" action =\" " )
3
/* Se codifica la URL , para que sea i n d e p e n d i e n t e de las cookies */
4
sb . append ( response . encodeURL ( config . getServletName ()));
5
sb . append ( " \" >\ n " );
6
sb . append ( "
<p > < button name =\" continuar \" type =\" submit \" > Conti nuar </ button > </p
7 >\ n "
sb . append ( "
<p > < button name =\" " );
8
sb . append ( strBorraSesion );
9
sb . append ( " \" type =\" submit \" > Borrar sesión </ button > </p >\ n " );
10
sb . append ( " </ form >\ n " );
11
return sb ;
12
}
13
Luis Fernando Llana Dı́az
Java Servlets
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Invocando otros servlets IV
public class Fecha extends HttpServlet {
public static final String strServlet = " / http / fecha " ;
public static final String strID = " id " ;
public final void doGet ( final H t t p S e r v l e t R e q u e s t request ,
final H t t p S e r v l e t R e s p o n s e response )
throws ServletException , IOException {
S e r v l e t O u t p u t S t r e a m out = response . getOutputStream ();
response . setContentType ( " text / html " );
Date hoy = new Date ();
DateFormat df = DateFormat . getDateInstance ( DateFormat . FULL );
out . println ( " < div id =\" " + request . getAttribute ( strID )+ " \" > " );
out . println ( df . format ( hoy ));
out . println ( " </ div > " );
}
}
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Invocando otros servlets V
Incluir el resultado del servlet /http/fecha en cualquier parte
......
R e q u e s t D i s p a t c h e r rd = request . g e t R e q u e s t D i s p a t c h e r ( Fecha . strServlet );
request . setAttribute ( Fecha . strID , " fecha " );
rd . include ( request , response );
......
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
El servlet /http/sesion I
..... otros filtros
< filter >
< filter - name > envoltorioSesion </ filter - name >
< filter - class > EnvoltorioHTML </ filter - class >
< init - param >
< param - name > titulo </ param - name >
< param - value > Ejemplo de uso de sesiones </ param - value >
</ init - param >
</ filter >
< filter >
< filter - name > loginSesion </ filter - name >
< filter - class > Login </ filter - class >
< init - param >
< param - name > servlet </ param - name > < param - value > sesion </ param - value >
</ init - param >
</ filter >
... otros filtros
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
El servlet /http/sesion II
..... otras disposiciones de filtros
<! -- el orden es i m p o r t a n t e -- >
< filter - mapping >
< filter - name > envoltorioSesion </ filter - name >
<url - pattern >/ http / sesion </ url - pattern >
</ filter - mapping >
< filter - mapping >
< filter - name > loginSesion </ filter - name >
<url - pattern >/ http / sesion </ url - pattern >
</ filter - mapping >
... otras disposiciones de filtros
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
9
10
11
12
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
El servlet /http/sesion III
..... otros servlets
< servlet >
< servlet - name > sesion </ servlet - name >
< servlet - class > Sesion </ servlet - class >
</ servlet >
< servlet >
< servlet - name > fecha </ servlet - name >
< servlet - class > Fecha </ servlet - class >
</ servlet >
... otros servlets
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
9
10
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Login I
public class Login implements Filter {
.................................................
public final void doFilter ( final ServletRequest request ,
final ServletResponse response ,
final FilterChain filterChain )
throws IOException , ServletException {
HttpSession sesion = (( H t t p S e r v l e t R e q u e s t ) request ). getSession ();
String nombre =( String ) sesion . getAttribute ( Sesion . strNombre );
if ( nombre == null ) {
nombre = request . getParameter ( strNombre );
if ( nombre == null ) {
pideNombre (( H t t p S e r v l e t R e q u e s t ) request ,
( H t t p S e r v l e t R e s p o n s e ) response );
} else {
sesion . setAttribute ( Sesion . strNombre , nombre );
filterChain . doFilter ( request , response );
}
} else {
filterChain . doFilter ( request , response );
}
}
}
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Login II
public class Login implements Filter {
private static final String strServlet = " servlet " ;
private static final String strNombre = " nombre " ;
private FilterConfig config ;
public void init ( FilterConfig filterConfig ) throws ServletException {
config = filterConfig ;
}
public void destroy () { }
private void pideNombre ( final H t t p S e r v l e t R e q u e s t request ,
final H t t p S e r v l e t R e s p o n s e response )
throws IOException , ServletException {
S e r v l e t O u t p u t S t r e a m out = response . getOutputStream ();
String servlet = config . getInitParameter ( strServlet );
response . setContentType ( " text / html " );
out . println ( " < form type =\" get \" action =\" " +
response . encodeURL ( servlet )+ " \" >\ n " );
out . println ( " <p >\ n " );
out . println ( "
< label for =\" " + strNombre + " \" > Nombre : </ label > " );
out . println ( "
< input id =\" " + strNombre + " \" name =\" " + strNombre + " \" >\ n " );
out . println ( "
< button type =\" submit \" > Login </ button >\ n " );
out . println ( " </p >\ n " );
out . println ( " </ form > " );
}
public final void doFilter (...........)
}
Luis Fernando Llana Dı́az
Java Servlets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid
Descargar