0% encontró este documento útil (0 votos)
17 vistas127 páginas

Struts Java en Eclipse

ejemplo basico en STRUTS

Cargado por

Fernando Maguna
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
17 vistas127 páginas

Struts Java en Eclipse

ejemplo basico en STRUTS

Cargado por

Fernando Maguna
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

TUTORIAL

FRAMEWORKS
STRUTS

TUTORIALFRAMEWORKSTRUTS

[Link]

TUTORIALFRAMEWORKSTRUTS

INTRODUCCINASTRUTSCONECLIPSE..............................................................................................7
FORMULARIOLOGINSTRUTSECLIPSE................................................................................................14
[Link].....................................17
CDIGODELFICHERODEPROPIEDADESMESSAGERESOURCES_ES_ES....................................................................19
CDIGODELACLASEJAVAPARAELACTIONFORMLALLAMAMOSFORMULARIOFORM...........................................20
CDIGOJAVADELACLASEACTIONLALLAMAMOSACCIONLOGIN......................................................................22
FORMULARIOLOGINSTRUTS2PARTE...............................................................................................26
[Link]...................................................................................................26
[Link].............................................................................................27
[Link].........................................................................................28
ESTEFRAGMENTOYALOTENAMOSDELHOLAMUNDO........................................................................................28
FRAGMENTOCORRESPONDIENTEALMAPEODELOSACTION.................................................................................28
CREARUNAVENTANADEERROR404Y500ENSTRUTSCONECLIPSE.................................................30
[Link]....................................................................30
[Link]..............................................................................................................................30
[Link]..............................................................................................................................31
ERROR500EJEMPLO...................................................................................................................................31
FORMULARIODYNAACTIONFORMSTRUTSECLIPSE...........................................................................32
VENTANADEREGISTRODINMICO..................................................................................................................32
VENTANADEDATOSPERSONALESUNAVEZELREGISTROHASIDOENVIADO..............................................................32
[Link](PARACREARLOVIENEENPOSTDELOGINSTRUTSANTERIOR)......................33
[Link]................................................................34
VENTANACANCELADA2................................................................................................................................35
[Link].........................................................................................................................35
[Link]......................................................................................................................36
STRUTSFORMULARIODYNAVALIDATORFORMECLIPSE.....................................................................40
[Link].............................................................................................................41
[Link].............................................................................................43
IMAGENDELFORMULARIO.............................................................................................................................44
[Link]....................................................................45
[Link]..........................................................................46
CLASEACTIONENELPACKAGEDEACCIONES.....................................................................................................47
CDIGODEMESSAGERESOURCES_ES_ES.PROPERTIES........................................................................................47
STRUTSDISPATCHACTIONECLIPSE....................................................................................................49
[Link]...................................................................49
[Link]..........................................................................................49
[Link].....................................................50
CONFIGURACINDELACTIONENELSTRUTSCONFIG.XMLACTIONDINAMICOLIBRO2..............................................50
[Link]..................................................................56
[Link].......................................................................................................57
[Link]................................................................................................58
IBATISPROYECTOWEBECLIPSE.........................................................................................................59

[Link]

TUTORIALFRAMEWORKSTRUTS
[Link]...............................................................................................................................59
FICHERODECONFIGURACINDESQLMAP.......................................................................................................61
STRUTSTILESPROYECTOWEBECLIPSE..............................................................................................66
STRUTSTILESPROYECTOWEBECLIPSE2PARTE.................................................................................71
TUTORIALHTMLSTRUTSTAGS..........................................................................................................74
TUTORIALDELOOKUPDISPATCHACTIONSTRUTS...............................................................................75
[Link]....................................................................75

CONFIGURACIONDELBEANDYNAVALIDATORFORM...........................................................................................76
[Link].........................................................76
CONFIGURACINDELFICHERODEPROPIEDADESPROPERTIES................................................................................77
[Link]..........................................................................................77
[Link]..............................................................78
[Link].........................................................................83
DATASOURCESTRUTS...................................................................................................................................83
[Link]............................................................83
[Link]............................................................................84
[Link].................................................................................................................85
CDIGODELAPGINAREGISTROSATISFACTORIO...............................................................................................86
CDIGODELACLASEJAVAACCIONBASEDATOSDENTRODELPACKAGEDEACCIONES.................................................87
[Link].........................................................................90
[Link]..........................................................90

CONFIGURACINDELFICHERODEPROPIEDADES................................................................................................90
CLASECONEXIONDENTRODELPACKAGECONEXIONES........................................................................................92
[Link]..........................................................................................................93
[Link].................................................................................................................................93
[Link].............................................................................94
[Link].......................................................................................................................96
[Link]...................................................................................................................................97
MOSTRANDOLISTADODEDATOS....................................................................................................100
DESARROLLOWEBUPLOADFILESTRUTS..........................................................................................102
CDIGODELACLASESUBIRARCHIVO.............................................................................................................103
CDIGODELAPGINAJSPENCARGADADEMOSTRARELFORMULARIODESUBIDADEARCHIVO..................................104
ENELFICHERODEPROPIEDADES...................................................................................................................105
CLASEBEANPARAELFORMULARIO................................................................................................................105
DESARROLLOWEBMLTIPLESARCHIVOSDECONFIGURACINSTRUTS...........................................108
CDIGODELAPGINAENLACEPRIVADO.........................................................................................................108
[Link]........................................................................................................110
DESARROLLOWEBCOMODINESSTRUTS..........................................................................................111
[Link].........................................................................111
[Link]..............................................................................................................................112
PGINA1JSP............................................................................................................................................112
PGINA2JSP............................................................................................................................................113

[Link]

TUTORIALFRAMEWORKSTRUTS
CREACINDEUNPLUGINCONSTRUTSXMLDOM...........................................................................114
CLASEOBRERO..........................................................................................................................................117
[Link]......................................................................................118
INTEGRACINSTRUTSHIBERNATE..................................................................................................119
[Link],XML..........................................................................................125

[Link]

TUTORIALFRAMEWORKSTRUTS

[Link]

TUTORIALFRAMEWORKSTRUTS

INTRODUCCINASTRUTSCONECLIPSE

Vamosadescargarnoselproyectostrutsdelapginaweboficial
[Link]

escogemoslaversin1.3.10
Laubicamosennuestrosistemadearchivosindependientementedelsistema
operativoqueutilicemosydescomprimimoselficherozip

[Link]
[Link]
alproyectonitldsparalasetiquetasstruts.
larutaescarpetastrutsproyectoqueparalaversinquehemosdescargadoespath
vuestro\struts1.3.10\apps\[Link]

[Link]

TUTORIALFRAMEWORKSTRUTS

Lonicoquetenemosquehaceresabrirnuestroeclipseeimportardichoproyectoen
blancoydarleunnombrenuevoparapoderempezar.
File,[Link]
version1.3.10

ledamosanextynosapareceotronuevocuadrodedilogodondeledamosnombre
[Link]

[Link]

TUTORIALFRAMEWORKSTRUTS

pulsamossobreelbotnfinishyenlapestaaexploradordelproyectovemosla
estructuradedirectoriosdelnuevoproyectoenblancoholamundo
Aligualqueenlosproyectosdejeeparaejecutarelproyectovamosarunasrunon
serverescogemostomcatysalelapantalladebienvenidadelproyectostruts

Vamosamodificarelproyectoparaquesalgaunmensajeencastellano,paraello
vamosaconservarlasjspquetieneelproyectopordefectoycrearemosunnuevo
ficherodepropiedadesllamado
MesssageResources_es_ES.propertiesenelquevamosaincluirunaclavesparaque

[Link]

TUTORIALFRAMEWORKSTRUTS

salgaporpantallaunmensajedebienvenida.

Enelnuevoficherodeproperties
1 [Link]=Holamundo

Struts

2 [Link]=Bienvenida!
3 [Link]=HolamundoStruts

[Link]

10

TUTORIALFRAMEWORKSTRUTS

[Link]
1 <!========================================MessageResourcesDefinitions>
2
3 <messageresourcesparameter="MessageResources_es_ES"/>
4 <messageresourcesparameter="MessageResources"/>

Vamosaentenderunpocoestoqueacabamosdehaceryasentenderel
[Link]
[Link]
estecontenido
1 <%@tagliburi="[Link]
2 <%@tagliburi="[Link]
3 <%@tagliburi="[Link]
4
5 <html:html>
6 <head>
7 <title><bean:messagekey="[Link]"/></title>
8 <html:base/>
9 </head>
10 <bodybgcolor="white">
11
12 <logic:notPresentname="[Link]"scope="application">
13 <fontcolor="red">
14 ERROR:Applicationresourcesnotloadedcheckservletcontainer

[Link]

11

TUTORIALFRAMEWORKSTRUTS

15 logsforerrormessages.
16 </font>
17 </logic:notPresent>
18
19 <h3><bean:messagekey="[Link]"/></h3>
20 <p><bean:messagekey="[Link]"/></p>
21
22 </body>
23 </html:html>

Vamosacentrarnossolamenteenporquesaleelmensajeencastellano,deciramodo
decomentarioquestrutstienesuspropiostagshtmlvanprecedidiosdehtm:se
puedenvervarioscasoscomoydespusotrasetiquetas.
vemosquelaetiquetabean:[Link]
paraelcasodelttulo,[Link]
haceestaetiquetaesobtenerelvalordelficherodeconfiguracinreciencreado
elformatodeesteficherodedepropiedadesesclave=valor
Sinosfijamosennavegadoryvemoslaurldelproyectoarrancadoenlocal,
[Link],nosestaindicandoquestrutsest
realizandolaaccinWelcome.
1 <!===========================================GlobalForwardDefinitions>
2
3 <globalforwards>
4 <!Defaultforwardto"Welcome"action>
5 <![Link]>
6 <forward
7 name="welcome"
8 path="/[Link]"/>
9 </globalforwards>

Quesemapeaenlasecciondeacctionmetiante
1<!===========================================ActionMappingDefinitions>

[Link]

12

TUTORIALFRAMEWORKSTRUTS

2
3 <actionmappings>
4 <!Default"Welcome"action>
5 <![Link]>
6 <action
7 path="/Welcome"
8 forward="/pages/[Link]"/>

[Link]
nombredepathigualquelaaccionperosindopath=/Welcomeysereenvalala
pginajspquevieneconelproyectostruts/pages/[Link]
pblicoWebContent

[Link]

13

TUTORIALFRAMEWORKSTRUTS

FORMULARIOLOGINSTRUTSECLIPSE

ParahacerestetutorialvamosapartirdelproyectowebHolamundorealizado
anteriormenteHolamundo
EnesteejemplosevenconeclipselautilizacindelosActionylosActionFormas
comolaconfiguracindelstrutsconfing,utilizacinycargadeimgenesyutilizacin
dearchivoscssenproyectosstruts.
Nohayconexinparabasededatossedejaparaotrospostynoseutilizael
DynaActionFormquelosveremosenotrospost.
Sepresentaelinterfazgrficodelaapliacinparaunmejorentendimiento,tenemos
unformularioderegistroquetomaelnombreelapellidoyotrosdoscamposclavey
confirmacindeclave,todosestoscamposdebenserrellenadosporelusuarioyse
[Link]
cancelarelregistroyvoveralapaginaderegistrodesdeladecancelacin.
Ventanaderegistro

[Link]
forma(cambiamoselnombredellapgina)

[Link]

14

TUTORIALFRAMEWORKSTRUTS

[Link]
registro
Unadelascaractersticasdestrutsesquetienesupropiostagsparahtml,vienen
siempreconlapalabrahtml:ydespueselnombredelaetiquetaencuestion.
Paralacategoradej2eedeestesitiowebyahicieronejemplosdeintegracindecss
conj2ee,[Link]
gentequevienedeotroslenguajesodehacerjspestaranacostumbradosacolocarel
[Link]
paraquelascssolasimgeneslaspodamosincluirenunproyectostrutsesnecesario
incluirenelheaddelapginajspdestrutslaetiqueta.
Sinosfijamosenlasjspvemosqueaparecenentodasellas,loquehaceestaetiqueta
esestablecerelpuntodereferenciadelapginaconrespectoalrestoalrestode
recursosdelproyecto.
Ejemplo,[Link]../css/[Link]
entoncessequetengoque
[Link]
tengolareferenciabasenopuedoencontrarlosrecursoscssnideimagen.

[Link]

15

TUTORIALFRAMEWORKSTRUTS

Ademsenlacabeceradelajspdebemosdeincluirel<%@taglib
uri="[Link]
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
2 <%@tagliburi="[Link]
3 <%@tagliburi="[Link]
4
5 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
6 "[Link]
7 <html:html>
8 <head>
9
10 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
11
12 <title><bean:messagekey="[Link]"/></title>
13 <html:base/>
14
15 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
16 </head>
17 <body>
18 <divid="contenedor">
19 <h2><bean:messagekey="[Link]"/></h2>
20 <divid="errores">
21 <html:errors/>
22 </div>
23
24 <divid="imagen">
25 <html:imgsrcKey="[Link]"titleKey="[Link]"/>
26 </div>
27
28 <divid="contenido">
29 <html:formaction="loginAction"focus="nombre"styleId="formulario"method="post">
30
31 <divclass="campo">
32 <bean:messagekey="[Link]"/>
33 <html:textproperty="nombre"/>
34 </div>
35
36 <divclass="campo">
37 <bean:messagekey="[Link]"/>
38 <html:textproperty="apellidos"/>
39 </div>
40
41 <divclass="campo">
42 <bean:messagekey="[Link]"/>
43 <html:passwordproperty="clave"maxlength="8"size="8"/>
44 </div>
45
46 <divclass="campo">
47 <bean:messagekey="[Link]"/>
48 <html:passwordproperty="claveConfirmacion"maxlength="8"size="8"/>
49 </div>
50
51
52 <html:submitstyleClass="boton"value="enviar"/>
53 <html:cancelstyleClass="boton"value="cancelar"/>

[Link]

16

TUTORIALFRAMEWORKSTRUTS

54
55 </html:form>
56 </div>
57
58 <divid="pie">
59 <p>[Link]</p>
60 </div>
61
62 </div>
63
64 </body>
</html:html>

Secreandoscarpetasnuevasalproyectollamadasimagenesycss(cadaunolas
puedellamarcomoquieramientrasmantengalacorrespondenciaconotraspartesdel
proyecto)
Imagendecreacin,carpetaimagenes

[Link]
DELEJEMPLO
1 #contenedor{
2 width:600px;
3 marginleft:auto;

[Link]

17

TUTORIALFRAMEWORKSTRUTS

4 marginright:auto;
5 }
6
7 .campo{
8 margintop:10px;
9 }
10
11 #imagen{
12 float:right;
13 }
14
15
16 .boton{
17 margin:10px5px;
18 backgroundcolor:#554444;
19 color:#fff;
20 width:100px;
21 }
22
23 #formulario{
24
25 margintop:60px;
26 fontsize:16px;
27 }
28 #errores{
29 backgroundcolor:#e6dfd5;
30 color:#424c56;
31 }
32
33 #erroresulli{
34
35 liststyleimage:url("../imagenes/[Link]");
36
37 }
38
39 #erroresul{
40 bordercolor:#f00;
41
42 }
43
44 h2{
45 textalign:center;
46 }
47
48 #pie{
49 clear:both;
50 height:30px;
51 backgroundcolor:#424c56;
52 }
53
54 #piep{textalign:right;
55 fontsize:14px;
56 backgroundcolor:#e6dfd5;
57 }

[Link]

18

TUTORIALFRAMEWORKSTRUTS

CDIGODELFICHERODEPROPIEDADESMESSAGERESOURCES_ES_ES
1 #clavesparalogin
2 [Link]=Registrousuario
3 [Link]=nombre
4 [Link]=apellidos
5 [Link]=confirmacindepassword
6 [Link]=password
7 [Link]=iconousuario
8 [Link]=../imagenes/[Link];
9
10 #clavesdeerror
11 [Link]=faltaelcamponombre
12 [Link]=faltaelcampoapellidos
13 [Link]=faltaelcampoclave
14 [Link]=faltaelcampoclaveconfirmacion
15 error.login2=repitelaclave
16
17 #clavesparasatisfactoria
18 [Link]=Resgistrocorrecto
19 [Link]=../imagenes/[Link]
20 [Link]=imagencorrecto
21 [Link]=Tehasregistradocorrectamente
22
23 #clavesparacancelada

24 [Link]=Registrocancelado
25 [Link]=Notehasregistradoenelsistema
26 [Link]=imagencancelado
27 [Link]=../imagenes/[Link]
28 [Link]=Cancelacin
29
30 #clavesparawelcome
Struts

31 [Link]=Holamundo
32 [Link]=Bienvenida!
33 [Link]=HolamundoStruts

CreamoslanuevaclaseFormularioFromdentrodelpackageformularios

[Link]

19

TUTORIALFRAMEWORKSTRUTS

CDIGODELACLASEJAVAPARAELACTIONFORMLALLAMAMOS
FORMULARIOFORM
1 packageformularios;
2
3 [Link];
4
5 [Link];
6 [Link];
7 [Link];
8 [Link];
9
10
11
12 publicclassFormularioFormextendsActionForm{
13
14 staticfinallongserialVersionUID=1L;
15
16 privateStringnombre;
17 privateStringapellidos;
18 privateStringclave;
19 privateStringclaveConfirmacion;
20
21 //mtodosgettersysettersdelformulario
22
23 publicStringgetNombre(){
returnnombre;
24
25 }

[Link]

20

TUTORIALFRAMEWORKSTRUTS

26 publicvoidsetNombre(Stringnombre) {
27
[Link]=nombre;
28 }
29 publicStringgetApellidos(){
30
returnapellidos;
31 }
32 publicvoidsetApellidos(Stringapellidos){
33
[Link]=apellidos;
34 }
35 publicStringgetClave(){
returnclave;
36
37 }
38 publicvoidsetClave(Stringclave){
[Link]=clave;
39
40 }
41 publicStringgetClaveConfirmacion(){
returnclaveConfirmacion;
42
43 }
44 publicvoidsetClaveConfirmacion(StringclaveConfirmacion){
[Link]=claveConfirmacion;
45
46 }
47
48 //mtodoquepermitelavalidacindeloscamposdelformulario
49 publicActionErrorsvalidate(ActionMappingmapping,HttpServletRequestrequest)
50 {
//creamosunnuevoobjetoActionErrors
51
ActionErrorserrores=newActionErrors();
52
53
if(nombre==null||[Link]()==0)
54
{

55
56

[Link]("nombre",newActionMessage("[Link]"));
57
}
58
59
if(apellidos==null||[Link]()==0)
60
{
61

[Link]("apellidos",newActionMessage("[Link]"));
62
}
63
64
if(clave==null||[Link]()==0)
65
{
66

[Link]("clave",newActionMessage("[Link]"));
67
}
68
69
if(claveConfirmacion==null||[Link]()==0)
70
{
71
72

[Link]("claveConfirmacion",new
73 ActionMessage("[Link]"));
74
}
75
76
if(![Link](claveConfirmacion))
77
{
78

[Link]("confirmacion",newActionMessage("error.login2"));
79
}
80
81

[Link]

21

TUTORIALFRAMEWORKSTRUTS

82
return errores;
83 }
84
85 //mtodopararesetearloscamposdelformulario
86 publicvoidreset()
87 {
88
[Link]=null;
89
[Link]=null;
90
[Link]=null;
[Link]=null;
91
92 }
93
94
}

CremosunanuevaclaseActiondentrodelpackageAcciones

CDIGOJAVADELACLASEACTIONLALLAMAMOSACCIONLOGIN
1
2
3
4
5
6
7
8

packageacciones;

[Link];
[Link];
[Link];
[Link];
[Link];
[Link];

[Link]

22

TUTORIALFRAMEWORKSTRUTS

9
10
11 importformularios.*;
12
13 //claseaction
14 publicclassAccionLoginextendsAction{
15
16
privateStringresultado;
17
18 //creacindelmtodoexecute
publicActionForwardexecute(ActionMappingmapping,ActionFormform
19
20 ,HttpServletRequestrequest,HttpServletResponseresponse)throwsException
{
21
22
23

//sielusuariopulsaelbotndecancelado
24

if([Link](request))
25

{
26

//comotenemosenelmtodoexecuteelobjetoActionMapging
27
28 podemosmandaraunreenviodelstrutsconfig

[Link]("cancelada");
29

}
30

else
31

{
32

//creamosunobjetoformularioForm
33

FormularioFormformularioform=(FormularioForm)form;
34
35

[Link]("satisfactoria");
36
37

}
38

}
}

SiintentamosejecutarunaclaseActionsinsucorrespondienteActionFormnosdael
siguienteerroralejecutarelproyeto(salemuchomsporpantallaperosonlasdos
lneasclaves)
1 [Link]:Formbeannotspecifiedonmappingforaction: "loginAction"
2
3 [Link]:ExceptioninJSP:/pages/[Link]

Ventanadeerrorescamposvacos

[Link]

23

TUTORIALFRAMEWORKSTRUTS

Errordeclave(nosoniguales)

[Link]

24

TUTORIALFRAMEWORKSTRUTS

Enlasegundapartedeesteejemploformulariologinstruts2parteeclipse
[Link]
[Link].
[Link]
[Link]
[Link]

[Link]

25

TUTORIALFRAMEWORKSTRUTS

FORMULARIOLOGINSTRUTS2PARTE

Ventanadecancelacin

Enlacealaprimerapartedeltutorialloginstruts
[Link]
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8"
2 pageEncoding="UTF8"%>
3 <%@tagliburi="[Link]
4 <%@tagliburi="[Link]
5 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
6 "[Link]
7 <html:html>
8 <head>
9 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
10
11
12 <title><bean:messagekey="[Link]"/></title>
13 <html:base/>
14
15 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
16 </head>
17 <body>
18
19 <divid="contenedor">
20 <h2><bean:messagekey="[Link]"/></h2>
21 <divid="imagen">
22 <html:imgsrcKey="[Link]"titleKey="[Link]"/>
23 </div>

[Link]

26

TUTORIALFRAMEWORKSTRUTS

24 <divid="mensaje">
25 <bean:messagekey="[Link]"/>
26 <divclass="campo">
27 <html:linkpage="/pages/[Link]">Volveralformulariologin
28 </html:link>
29 </div>
30 </div>
31 <divid="pie">
32 <p>[Link]</p>
33 </div>
34
35 </div>
36
37 </body>
</html:html>

VentanaCorrectocuandoelusuariotienetodosloscamposcorrectos

[Link]
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
2 <%@tagliburi="[Link]
3 <%@tagliburi="[Link]
4 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
5 "[Link]
6 <html:html>
7 <head>
8 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
9 <title><bean:messagekey="[Link]"/></title>
10 <html:base/>
11 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
12 </head>
13 <body>
14 <divid="contenedor">
15 <h2><bean:messagekey="[Link]"/></h2>
16 <divid="imagen">

[Link]

27

TUTORIALFRAMEWORKSTRUTS

17 <html:imgsrcKey="[Link]" titleKey="[Link]"/>
18 </div>
19 <divid="mensaje">
20 <bean:messagekey="[Link]"/>
21
22 <divclass="campo">
23 <bean:writename="loginFormulario"property="nombre"/>
24 </div>
25 </div>
26 <divid="pie">
27 <p>[Link]</p>
28 </div>
29 </div>
30
31 </body>
</html:html>

[Link]
1
2 <!================================================FormBeanDefinitions>
3
4 <formbeans>
5
6 <formbean
7 name="loginFormulario"
8 type="[Link]"/>
9 </formbeans>

ESTEFRAGMENTOYALOTENAMOSDELHOLAMUNDO
1 <!=========================================== GlobalForwardDefinitions>
2
3 <globalforwards>
4 <!Defaultforwardto"Welcome"action>
5 <![Link]>
6 <forward
7 name="welcome"
8 path="/[Link]"/>
9 </globalforwards>

FRAGMENTOCORRESPONDIENTEALMAPEODELOSACTION
1 <!=========================================== ActionMappingDefinitions>
2
3 <actionmappings>
4 <!Default"Welcome"action>
5 <![Link]>
6 <![Link]>
7 <action
8 path="/Welcome"
9 forward="/pages/[Link]"/>
10
11 <!creamoslaaccionlogin>
12 <action
13
14 path="/loginAction"

[Link]

28

TUTORIALFRAMEWORKSTRUTS

15 type="[Link]"
16 scope="session"
17 name="loginFormulario"
18 validate="true"
19 input="/pages/[Link]"
20 >
21 <setpropertyproperty="cancellable"value="true"/>
22 <exceptionkey="[Link]"type="[Link]"
23 path="/[Link]"/>
24 <forwardname="cancelada"path="/pages/[Link]"/>
25 <forwardname="satisfactoria"path="/pages/[Link]"/>
</action>

[Link]

29

TUTORIALFRAMEWORKSTRUTS

CREARUNAVENTANADEERROR404Y500ENSTRUTSCONECLIPSE

Cuandoseproduceunerror404,muchasvecescuandonavegamosporinternetnos
[Link]
queestemosutilizandoobiendelagestindedichoerrorporpartedelsitowebal
quequeremosacceder.
Enstrutstambinpodemosgestionardichoserrores,paraellonosvamosalficherode
[Link]
1 <!declaramoslapginadeerror>
2
3 <errorpage>
4 <errorcode>404</errorcode>
5 <location>/pages/[Link]</location>
6 </errorpage>
<errorpage>
1
<errorcode>500</errorcode>
2

3
<location>/pages/[Link]</location>
4
</errorpage>

Lassituacionesenlasqueseproduceesteerrorseriancuandonosbrindanunenlacea
unsitioyelrecursoalqueapuntaelenlacenoexisteobiencuandoescribimos
directamenteunadireccindeunapginasobreunsitiowebylohacemosmal.
[Link]
1 #error404
2 [Link]=Recursonodisponible
3 [Link]=../imagenes/[Link]
4 [Link]=nodisponible
5 [Link]=pginanoencontrada
6
7 #error500
8 [Link]=Errorenlap&acute;gina
9 [Link]=../imagenes/[Link]
10 [Link]=nodisponible
11 [Link]=Losentimos,sehaproducidounerrorinterno

[Link]
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
2 <%@tagliburi="[Link]
3 <%@tagliburi="[Link]
4
5 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
6 "[Link]
7 <html:html>
8 <head>
9
10 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
11 <title><bean:messagekey="[Link]"/></title>

[Link]

30

TUTORIALFRAMEWORKSTRUTS

12 <html:base/>
13 </head>
14 <body>
15
16 <divstyle="float:left;marginleft:200px">
17 <h1><bean:messagekey="[Link]"/></h1>
18
19 </div>
20 <html:imgsrcKey="[Link]"titleKey="[Link]"/>
21 </body>
</html:html>

[Link]

Exactamenteigual
<%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
1
<%@tagliburi="[Link]
2
<%@tagliburi="[Link]
3

4
<!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
5
"[Link]
6
<html:html>
7
<head>
8
<metahttpequiv="ContentType"content="text/html;charset=UTF8">
9
<title><bean:messagekey="[Link]"/></title>
10
<html:base/>
11
</head>
12
<body>
13

14
<divstyle="float:left;marginleft:200px">
15
<h1><bean:messagekey="[Link]"/></h1>
16

17

18
</div>
19
<html:imgsrcKey="[Link]"titleKey="[Link]"/>
20

21
</body>
22
</html:html>

ERROR500EJEMPLO

[Link]

31

TUTORIALFRAMEWORKSTRUTS

FORMULARIODYNAACTIONFORMSTRUTSECLIPSE

Paraestetutorialpartimosdelproyectoholamundocreadoinicialmenteenanteriores
posts,estaimagensecorrespondealaventanadeloginparaelformulariodinmico
VENTANADEREGISTRODINMICO

VENTANADEDATOSPERSONALESUNAVEZELREGISTROHASIDOENVIADO

[Link]

32

TUTORIALFRAMEWORKSTRUTS

LoprimerodetodoqueesDynaActionFormomejorparaquesirve?,buenoestaclase
permiteastrutstrabajarconloscamposdeunformulariosintenerquehaceruna
claseFormBeancomoenelejemplodeloginstrutsanteriormentevisto.
Pasosquehayqueseguiroqueesloquenecesitamos,1formulariojsp,2una
[Link]
1Elformularioescomosiempreunapginawebconlasetiquetasstruts
[Link]
2.1LaconfiguracindelBeandinmico
aquiseindicalaspropiedadesquevaatenerestenuevobean
2.2LaconfiguacindellaclaseActionresponsabledetratarelformulario
SeestablecelarelacinconelbeandynaActionFormylaclasequetrataloscamposdel
formulariioylosreenviosalaspginasjspsegunsehayanintroducidolosdatosbieno
no.
[Link](PARACREARLOVIENEENPOSTDE
LOGINSTRUTSANTERIOR)
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
2 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
3 "[Link]
4 <%@tagliburi="[Link]
5 <%@tagliburi="[Link]
6 <html:html>
7 <head>
8 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
9 <title><bean:messagekey="[Link]"/></title>
10 <html:base/>
11 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
12 </head>
13 <body>
14 <divid="contenedor">
15 <h2><bean:messagekey="[Link]"/></h2>
16
17 <divid="errores">
18 <html:errors/>
19 </div>
20 <divid="imagen">
21 <html:imgsrcKey="[Link]"titleKey="[Link]"/>
22 </div>
23
24 <divid="contenido">
25 <html:formaction="dinamicoAction"focus="nombre"styleId="formulario"method="post">
26 <divclass="campo">
27 <bean:messagekey="[Link]"/>
28 <html:textproperty="nombre"/>
29 </div>
30 <divclass="campo">
31 <bean:messagekey="[Link]"/>
32 <html:textproperty="domicilio"/>
33 </div>
34

[Link]

33

TUTORIALFRAMEWORKSTRUTS

35 <divclass="campo">
36 <bean:messagekey="[Link]"/>
37 <html:passwordproperty="edad"maxlength="3"size="3"/>
38 </div>
39 <html:submitstyleClass="boton"value="enviar"/>
40 <html:cancelstyleClass="boton"value="cancelar"/>
41 </html:form>
42 </div>
43 <divid="pie">
44 <p>[Link]</p>
45 </div>
46 </div>
47
48 </body>
</html:html>

[Link]

Siloscamposestnvacossemapealahacacanceladaysiestncompletoshaciala
1 packageacciones;
2
3 [Link];
4 [Link];
5 [Link];
6 [Link];
7 [Link];
8 [Link];
9 [Link];
10 [Link];
11 [Link];
12
13 publicclassAccionDinamicaextendsAction{
14
15
publicActionForwardexecute(ActionMappingmapping,ActionFormform
16
17 ,HttpServletRequestrequest,HttpServletResponseresponse)throwsException
{
18

//creamosunobjetodynamicactionform
19

DynaActionFormformularioDinamico=(DynaActionForm)form;
20
21

ActionForwardreenvio=null;
22
23
24

ActionErrorsmensajes=newActionErrors();
25
26

if(((String)[Link]("nombre")).equals(""))
27

{
28

[Link]("nombre",new
29
30 ActionMessage("[Link]"));
31

}
32
33

if(((String)[Link]("domicilio")).equals(""))
34

{
35

[Link]

34

TUTORIALFRAMEWORKSTRUTS

36

[Link]("domicio",new
37 ActionMessage("[Link]"));
38

}
39
40

//preguntamossihayerroresparahacerelreenvioalapagina
41
42

if([Link]())

{
43

reenvio=[Link]("datospersonales");
44

}
45

else
46

{
47

reenvio=[Link]("cancelada");
48
49

}
50
51

[Link]([Link]());
52
53

returnreenvio;

54
55
56

VENTANACANCELADA2

[Link]

Pginaquemuestraelmensajedequelaaccinhasidocancelada
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>

[Link]

35

TUTORIALFRAMEWORKSTRUTS

2 <%@tagliburi="[Link] prefix="bean" %>


3 <%@tagliburi="[Link]
4 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
5 "[Link]
6 <html:html>
7 <head>
8 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
9
10 <title><bean:messagekey="[Link]"/></title>
11 <html:base/>
12
13 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
14 </head>
15 <body>
16
17 <divid="contenedor">
18
19 <h2><bean:messagekey="[Link]"/></h2>
20 <divid="imagen">
21 <html:imgsrcKey="[Link]"titleKey="[Link]"/>
22 </div>
23 <divid="mensaje">
24 <bean:messagekey="[Link]"/>
25 <divclass="campo">
26 <html:linkpage="/pages/[Link]">Volveralformulariologin
27 </html:link>
28 </div>
29 </div>
30 <divid="pie">
31 <p>[Link]</p>
32 </div>
33
34 </div>
35
36 </body>
</html:html>

[Link]

Estapginarecuperalosdatosintroducidosporelusuariomediantelaetiqueta
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
2 <%@tagliburi="[Link]
3 <%@tagliburi="[Link]
4 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
5 "[Link]
6 <html:html>
7 <head>
8 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
9 <title><bean:messagekey="[Link]"/></title>
10 <html:base/>
11 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
12 </head>
13 <body>
14 <divid="contenedor">

[Link]

36

TUTORIALFRAMEWORKSTRUTS

15 <h2>Bienvenido<bean:writename="dinamicoFormulario" property="nombre"/></h2>
16 <divid="imagen">
17 <html:imgsrcKey="[Link]"titleKey="[Link]"/>
18 </div>
19 <divid="mensaje">
20 <bean:messagekey="[Link]"/>
21
22 <divclass="campo">
23 <bean:writename="dinamicoFormulario"property="nombre"/>
24 </div>
25 <divclass="campo">
26 <bean:writename="dinamicoFormulario"property="domicilio"/>
27 </div>
28 <divclass="campo">
29 <bean:writename="dinamicoFormulario"property="edad"/>
30 </div>
31 </div>
32
33 <divid="pie">
34 [Link]
35 </div>
36 </div>
37
38 </body>
</html:html>

[Link]
Enladefinicindelformbeanvemoscomoadiferenciadelejemplodellogincuando
tenamosunformbeanyhacamosunareferenciamedianteelatributotypeauna
clasedenuestroproyectoahoralohacemosaunaclasedestruts
[Link]
beanmediantesutipoysiqueremosunvalorinicialseponeelatributoinitialconun
valor
Enelejemplosedanlosvaloraloscamposnombre=usuarioPepedomicilio=
domicilioPepeysedejasintocarlaedadperocomoestabainicializadaa18salepor
[Link]
tieneelvalor18
1 <!================================================FormBeanDefinitions>
2 <formbean
3 name="dinamicoFormulario"
4 type="[Link]">
5 <formpropertyname="nombre"type="[Link]"/>
6 <formpropertyname="domicilio"type="[Link]"/>
7 <formpropertyname="edad"type="[Link]"initial="18"/>
8 </formbean>

Declaracindelreenvoglobal

[Link]

37

TUTORIALFRAMEWORKSTRUTS

[Link]
[Link],[Link]
[Link],
1 <!===========================================GlobalForwardDefinitions>
2
3 <globalforwards>
4 <!Defaultforwardto"Welcome"action>
5 <![Link]>
6 <forward
7 name="welcome"
8 path="/[Link]"/>
9 </globalforwards>

EnlasdefinicionesdelasaccionesenActionMapping,laaccinwelcomerecogidopor
[Link]
primerapginaquesalepordefecto.
Cuandoelusuariorellenaloscamposypulsasobrelosbotonesdelformulariose
[Link]
elatributopathysemapeaenelproyectoporlaclasejava
[Link].
Sesueleponerunpackagesiempreparalasclasesaccionesyotroparalasclasesbean
peroesgustodelconsumidorhacerloono
CuandolaclaseAccionDinmicaprocesaloscamposdelformulariomandamediante
unobjetodelaclaseactionMappingencontrarlareferenciadeunobjetomapeadoen
[Link]
datospersonales,jspporqueenlaclaseAccionDinmimatenamos
reenvio=[Link](datospersonales);ymedianteel
name=[Link].
[Link]()
[Link]
Unadiferenciadeesteejemploconeldelformulariodelogin,apartedequenos
evitamosunaclaseformbeanesquenonossalenloserroresenelformulariode
recogidadedatos,podramosresolverloconobjetosdelaclaseAcctionMessagespero
existeotravariantedelDynaActionFormquesipermitedeunaformasencillala
validacindeloscamposllamadaDynaActionFormValidatoryloveremosenotro
posts.
1
2
3
4
5
6
7

<!===========================================ActionMappingDefinitions>

<actionmappings>
<!Default"Welcome"action>
<![Link]>
<![Link]>
<action

[Link]

38

TUTORIALFRAMEWORKSTRUTS

8 path="/Welcome"
9 forward="/pages/[Link]"/>
10
11 <action
12 path="/dinamicoAction"
13 type="[Link]"
14 scope="request"
15 name="dinamicoFormulario"
16 input="/pages/[Link]">
17 <setpropertyproperty="cancellable"value="true"/>
18
19 <forwardname="cancelada"path="/pages/[Link]"/>
20 <forwardname="datospersonales"path="/pages/[Link]"/>
21
22 </action>

[Link]
clave=valor
1
2 #clavesparadinamico
3 [Link]=Tehasregistradocorrectamente
4 [Link]=../imagenes/[Link]
5 [Link]=imageniconoregistro
6 [Link]=../imagenes/[Link]
7 [Link]=iconousuario
8 [Link]=Registrodin&aacute;mico

[Link]

39

TUTORIALFRAMEWORKSTRUTS

STRUTSFORMULARIODYNAVALIDATORFORMECLIPSE

Enelanteriorpostparalacategoradestrutshabamosvistolosformulariosdinmicos
destruts,comorepasodecamosqueeliminabanlacreacindedelaclasedetipo
[Link].
LoqueocurriaconlaclaseDynaActionFormeraqueaunquetenamoselcdigoparala
validacindeloscamposenlaclasenofuncionabaperoquesepodanimprimirlos
mensajesydevolverlosmedianteelobjetorequestdepeticin.
Lavalidacintambinseraposiblemediantejavascriptcomootroslenguajespero
strutsdisponedeunaclasequefacilitatodoesto,estaclasesellama
DynaValidatorFormypermitelavalidacindeloscamposdeunformulariodinmico.
[Link]
correspondientesdecadaejemploconlocualperdamosenelproyectolaposibilidad
deinteractuarconlosanterioresejemplos,paraquenoocurraesosepuedecrearuna
pginaslodeenlaces,alosdiferentesejerciciosamododemen.
1 <globalforwards>
2 <!Defaultforwardto"Welcome"action>
3 <![Link]>
4 <forward
5 name="welcome"
6 path="/[Link]"/>
7 </globalforwards>
8
9
10 <!===========================================ActionMappingDefinitions>
11
12 <actionmappings>
13 <!Default"Welcome"action>
14 <![Link]>
15 <![Link]>
16 <action
17 path="/Welcome"
18 forward="/pages/[Link]"/>

[Link]
enlacarpetapages

[Link]

40

TUTORIALFRAMEWORKSTRUTS

[Link]

.enlace{height:40px;}

[Link]
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
2 <%@tagliburi="[Link]
3 <%@tagliburi="[Link]
4 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
5 "[Link]
6 <html:html>
7 <head>
8 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
9 <title>Ejercicios</title>
10 <html:base/>
11 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
12 </head>
13 <body>
14
15 <divid="contenedor">
16
17 <h2><bean:messagekey="ejercicios"/></h2>
18
19 <divclass="enlace">
20 <html:linkpage="/pages/[Link]">1)formulariologinActionFom</html:link>
21 </div>
22
23 <divclass="enlace">
24 <html:linkpage="/pages/[Link]">2)formulariodin&aacute;mico</html:link>
25 </div>
26
27 <divclass="enlace">

[Link]

41

TUTORIALFRAMEWORKSTRUTS

28 <html:linkpage="/pages/[Link]"> 3) formulariodin&aacute;mico
29 validaci&oacute;n</html:link>
30 </div>
31
32 <divid="pie">
33 <p>[Link]</p>
34 </div>
35
36 </div>
</body>
</html:html>

[Link]
delbeanenelatributonameyenelatributotypelaclasealaquepertenece,despus
tenemoslosmismoscamposqueenelformulariodynaactionform,nombre,domicilio
yedadinicializadoa18
1 <formbeanname="dinamicoValidacion" type="[Link]">
2
3 <formpropertyname="nombre"type="[Link]"/>
4 <formpropertyname="domicilio"type="[Link]"/>
5 <formpropertyname="edad"type="[Link]"initial="18"/>
6 </formbean>

[Link]
[Link]
1 <pluginclassName="[Link]">
2 <setpropertyproperty="pathnames"value="/org/apache/struts/validator/[Link],
3 /WEBINF/[Link]"/>
4 </plugin>

Strutsutilizadosficherosxmldeconfiguracinunoquevamosaintroducirdatos
[Link]
[Link](enterorealetc)
[Link]
ficherosestanenlacarpetawebinfdelproyecto.
[Link]:
1 <formset>
2
3 <formname="dinamicoValidacion">
4 <field
5 property="nombre"
6 depends="required">
7 <argkey="[Link]"/>
8 </field>
9
10 <field
11 property="domicilio"
12 depends="required">

[Link]

42

TUTORIALFRAMEWORKSTRUTS

13 <argkey="[Link]"/>
14 </field>
15
16 </form>
17 </formset>

Comoyavenaesteficheroconbloquesdeclaradosnosfijamosquetienelasiguiente
[Link]
queserelmismodelnombrequeeldeclaradoenlaseccinformbeanparael
[Link]
nombreydomiciliosepidequeseanrellenadosparaelloponemos
depends=[Link]
establecido.
[Link]
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
2 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
3 "[Link]
4 <%@tagliburi="[Link]
5 <%@tagliburi="[Link]
6 <html:html>
7 <head>
8 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
9 <title><bean:messagekey="[Link]"/></title>
10 <html:base/>
11 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
12 </head>
13 <body>
14 <divid="contenedor">
15 <h2><bean:messagekey="[Link]"/></h2>
16
17 <divid="errores">
18 <html:errors/>
19 </div>
20 <divid="imagen">
21 <html:imgsrcKey="[Link]"
22 titleKey="[Link]"/>
23 </div>
24
25 <divid="contenido">
26 <html:formaction="dinamicoValidacion"focus="nombre"styleId="formulario"method="post">
27 <divclass="campo">
28 <bean:messagekey="[Link]"/>
29 <html:textproperty="nombre"/>
30 </div>
31 <divclass="campo">
32 <bean:messagekey="[Link]"/>
33 <html:textproperty="domicilio"/>
34 </div>
35
36 <divclass="campo">
37 <bean:messagekey="[Link]"/>
38 <html:passwordproperty="edad"maxlength="3"size="3"/>
39 </div>

[Link]

43

TUTORIALFRAMEWORKSTRUTS

40 <html:submitstyleClass="boton"value="enviar"/>
41 <html:cancelstyleClass="boton"value="cancelar"/>
42 </html:form>
43 </div>
44 <divid="pie">
45 <p>[Link]</p>
46 </div>
47 </div>
48
</body>
</html:html>

IMAGENDELFORMULARIO

Sepuedevercomoalenviarelformularioyavalidalapresenciadeloscamposeneste
casoseenvivacoynosmuestraelavisodelosdoscampos
Cdigodelformulariodecancelacineselmismocdigoqueenelformulario
DynaActionFormyaquenoesnecesariotocarloperosevuelveaincluiraquparaeste
[Link]
1
2
3
4
5
6
7

<%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
<%@tagliburi="[Link]
<%@tagliburi="[Link]
<!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
"[Link]
<html:html>
<head>

[Link]

44

TUTORIALFRAMEWORKSTRUTS

8 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
9
10
11 <title><bean:messagekey="[Link]"/></title>
12 <html:base/>
13
14 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
15 </head>
16 <body>
17
18 <divid="contenedor">
19
20 <h2><bean:messagekey="[Link]"/></h2>
21 <divid="imagen">
22 <html:imgsrcKey="[Link]"titleKey="[Link]"/>
23 </div>
24 <divid="mensaje">
25 <bean:messagekey="[Link]"/>
26 <divclass="campo">
27 <html:linkpage="/pages/[Link]">Volveralmen&uacute;deejercicios
28 </html:link>
29 </div>
30 </div>
31 <divid="pie">
32 <p>[Link]</p>
33 </div>
34
35 </div>
36
37 </body>
</html:html>

[Link]
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
2 <%@tagliburi="[Link]
3 <%@tagliburi="[Link]
4 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
5 "[Link]
6 <html:html>
7 <head>
8 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
9 <title><bean:messagekey="[Link]"/></title>
10 <html:base/>
11 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
12 </head>
13 <body>
14 <divid="contenedor">
15 <h2>Bienvenido<bean:writename="dinamicoValidacion"property="nombre"/></h2>
16
17 <divid="imagen">
18 <html:imgsrcKey="[Link]"titleKey="[Link]"/>
19 </div>
20 <divid="mensaje">
21 <bean:messagekey="[Link]"/>
22
23 <divclass="campo">

[Link]

45

TUTORIALFRAMEWORKSTRUTS

24 <bean:writename="dinamicoValidacion" property="nombre"/>
25 </div>
26 <divclass="campo">
27 <bean:writename="dinamicoValidacion"property="domicilio"/>
28 </div>
29 <divclass="campo">
30 <bean:writename="dinamicoValidacion"property="edad"/>
31 </div>
32 </div>
33 <divid="pie">
34 <p>[Link]</p>
35 </div>
36
37 </div>
38 </body>
</html:html>

Elformulariosehaenviadocorrectamenteysemuestranlosdatos
pasandonombre:manolodomicilio:casademanoloedad59

[Link]
1
2
3
4
5
6
7
8

<action
path="/dinamicoValidacion"
type="[Link]"
scope="request"
name="dinamicoValidacion"
validate="true"
input="/pages/[Link]"
>

[Link]

46

TUTORIALFRAMEWORKSTRUTS

9
10 <setpropertyproperty="cancellable"value="true"/>
11
12 <forwardname="cancelada"path="/pages/[Link]"/>
13 <forwardname="datospersonales"path="/pages/[Link]"/>
14
15 </action>

CLASEACTIONENELPACKAGEDEACCIONES
packageacciones;
1

2
[Link];
3
[Link];
4
[Link];
5
[Link];
6
[Link];
7
[Link];
8
[Link];
9
[Link];
10

11

12
publicclassAccionDinamicaValidacionextendsAction{
13

14

15

publicActionForwardexecute(ActionMappingmapping,ActionFormform,
16
HttpServletRequestrequest,HttpServletResponseresponse)throwsException
17

{
18

19

DynaValidatorFormformularioValidacion=(DynaValidatorForm)form;
20

21

ActionForwardreenvio=null;
22

23

if(isCancelled(request)){
24

//[Link]("Sehapulsadoelbotoncancel");
25

[Link]("cancelada");
26

}
27

28

29

reenvio=[Link]("datospersonales");
30

31

returnreenvio;
32

33

}
34
}

CDIGODEMESSAGERESOURCES_ES_ES.PROPERTIES
1
2
3
4
5
6
7
8
9

#titulopginaejercicios
ejercicios=Ejercicios

#clavesparalapginadeformulario
[Link]=formulariodin&aacute;micoValidaci&oacute;n
[Link]=../imagenes/[Link]
[Link]=iconovalidaci&oaccuten
[Link]=Tehasregistradocorrectamente

[Link]

47

TUTORIALFRAMEWORKSTRUTS

10 [Link]= ../imagenes/[Link]
11 [Link]=iconousuario
12
13
14 [Link]=elnombre
15 [Link]=eldomicilio
16
17 [Link]={0}esrequerido.

Vemoscomoenelficherodepropiedadespares,clavevalorpropertiesviene
[Link]{0}sesustituyeporelvalorcampodomiciliosegunelfichero
[Link].

[Link]

48

TUTORIALFRAMEWORKSTRUTS

STRUTSDISPATCHACTIONECLIPSE

DispatchAction,laclaseDispatchActionpermitemltiplesoperacionesenunasola
clase,laideaesnotenerquehacerparacadaaccinunaclaseactiondistintaque
proceseunapeticinconcreta.
Sitenemosenunformularioporejemploconaccesoaunabasededatosdelibros,
puedequetengamosdiversosbotonesenesavista,parapoderaccederallistadoo
bienaccederaotromendondepodemoseditardeterminadoscamposdelregistroo
[Link]
cadaunadeesasaccionesdelavistafueseaunaclasedistintaquelaprocesase.
ParalautilizacindelaclaseDispatchAction,necesitamoscrearunaclasequeampliey
aadaunmtodoparacadafuncinquesenecesite.
Habamosvistoloslinksenstrutsconelatributopagesapuntandohaciaunapginajsp
enlapginadeejerciciosincluimosunnuevoenlacehaciaelformulariopara
dispatchactionperoenestecasoutilizamoselatributoactiondelaetiqueta
hml:[Link]
pginajsp.
[Link]
1 <action
2 path="/dispatchAccion"
3 forward="/pages/[Link]"/>

[Link]
1
2 <divclass="enlace">
3 <html:linkaction="/dinamicolibro">4)formulariodispatchAction</html:link>
4 </div>

[Link]

[Link]

49

TUTORIALFRAMEWORKSTRUTS

[Link]
1
2 <!================================FormBeanDefinitions>
3
4
5 <formbeanname="dinamicolibro"type="[Link]">
6
7 <formpropertyname="titulo"type="[Link]"/>
8 <formpropertyname="autor"type="[Link]"/>
9 <formpropertyname="cambio"type="[Link]"/>
10
11 </formbean>

Elbeandinmicotienedospropiedadestituloyautorquesecompruebanqueexistan
Configuracindelactionparaelficheroderecogidadedatosdellibroelaction
dinamicolibro
elnombredelaaccionvienedeterminadaporelatributopathdinamicolibrolaclase
deaccionvienedeterminadaporelatributotypeelatributoscopedeterminael
mbitoenestecasodepeticinelatributonamehacereferenciaalnombredelbean
alqueestaasociadalaaccinelatributovalidateatrueindicaquesevaaestablecer
unavalidacindeloscamposdelformulariodinmicoelatributoinputindicacualesel
formulariodeentradaparadesarrollarlaaccinyencasodevalidacincualeslajsp
[Link]
1 <action
2 path="/dispatchAccion"
3 forward="/pages/[Link]"/>
4
5 <action
6 path="/dinamicolibro"
7 type="[Link]"
8 scope="request"
9 name="dinamicolibro"
10 validate="true"
11 input="/pages/[Link]"
12 parameter="method">
13
14 <setpropertyproperty="cancellable"value="true"/>
15
16 <forwardname="cancelada"path="/pages/[Link]"/>
17 <forwardname="editarlibros"path="/pages/[Link]"/>
18 </action>

[Link]
DINAMICOLIBRO2
1
2
3
4
5

<action

path="/dinamicolibro2"
type="[Link]"
scope="request"

[Link]

50

TUTORIALFRAMEWORKSTRUTS

6 name="dinamicolibro"
7 validate="false"
8 parameter="method">
9
10 <setpropertyproperty="cancellable"value="true"/>
11 <forwardname="cancelada"path="/pages/[Link]"/>
12 <forwardname="datoslibro"path="/pages/[Link]"/>
13 </action>

Comoestamoshaciendounformulariodinmicoyloqueremosvalidar,tenemosque
[Link]
1 <formset>
2 <formname="dinamicolibro">
3 <field
4 property="titulo"
5 depends="required">
6
7 <argkey="[Link]"/>
8 </field>
9
10 <field
11 property="autor"
12 depends="required">
13 <argkey="[Link]"/>
14 </field>
15 </form>
16
17 </formset>

elnombredelformularioenformname=dinamicolibroeselmismoqueelnamede
[Link]
[Link],alaintroduccindedatosdellibro

[Link]

51

TUTORIALFRAMEWORKSTRUTS

[Link]

Imagenresultadodelenvodelosdatos

[Link]

52

TUTORIALFRAMEWORKSTRUTS

Introducimostitulo2enelcampodetitulo

resultadofinal

[Link]

53

TUTORIALFRAMEWORKSTRUTS

[Link];
CdigodelficheroactiondelaclasedispatchActionimportamosimport
[Link],esalneadecdigosolamenteconel
proyectodestrutsparalaversin1.3.10queesconlaqueseestanhaciendotodoslos
[Link]
problema,tenemosqueimportardeldirectoriodondedescomprimimoselproyecto
struts,[Link]
eclipse.
lib/[Link],
1 packageacciones;
2
3 [Link];
4 [Link];
5 [Link];
6 [Link];
7 [Link];
8 [Link];
9 [Link];
10
11
12
13 publicclassAccionDispatchextendsDispatchAction{
14
15
privateActionForwardenvio;
16
privateDynaValidatorFormformulario;
17
privateStringtitulo;
18
privateStringautor;
19
20
21
//creamoslosmtodosquerespondenalasacciones
22
publicActionForwardcrear(ActionMappingmapping,ActionFormform,
23

[Link]

54

TUTORIALFRAMEWORKSTRUTS

24 HttpServletRequestrequest,HttpServletResponseresponse) throws Exception


25
{
26
27

//sihemoscanceladolaejecucinmandamosaljspdecancelacin
28

if(isCancelled(request))
29

{
30

envio=[Link]("cancelada");
31

}
32

else
33

{
34

//recuperamoslosdatosdelformulariobeandinmicoValidator

formulario=(DynaValidatorForm)form;
35
36

titulo=[Link]("titulo");
37

autor=[Link]("autor");
38
39

[Link](titulo);
40
41

envio=[Link]("editarlibros");
42

}
43
44

returnenvio;
45
46
}
47
48
publicActionForwardEditarTitulo(ActionMappingmapping,ActionFormform,
49
50 HttpServletRequestresquest,HttpServletResponseresponse)throwsException
{
51
52

//recuperamoslosdatosdelformulariobeandinmicoValidator
53
formulario=(DynaValidatorForm)form;
54
55
Stringcadena="Sehacambiado"+[Link]+"por"+[Link]("titulo");
56
57
[Link]("cambio",cadena);
58
59
//recargamoselformularioconelvalorguardado
60
[Link]("autor",[Link]);
61
62
63

envio=[Link]("datoslibro");
64
65

returnenvio;
66
}
67
68
publicActionForwardEditarAutor(ActionMappingmapping,ActionFormform,
69
70 HttpServletRequestrequest,HttpServletResponseresponse)throwsException
71
{
72

//recuperamoslosdatosdelformulariobeandinmicoValidator
73
74

//recuperamoslosdatosdelformulariobeandinmicoValidator
formulario=(DynaValidatorForm)form;
75
76
Stringcadena="Sehacambiado"+[Link]+"por"+[Link]("autor");
77
78
79

[Link]

55

TUTORIALFRAMEWORKSTRUTS

80
81
82
83
84
85
86
87
88
89
90
91
}

[Link]("cambio",cadena);
//recargamoselformularioconel
[Link]("titulo",[Link]);

envio=[Link]("datoslibro");

returnenvio;
}

[Link]
1
2 <%@pagelanguage="java"contentType="text/html;charset=UTF8"pageEncoding="UTF8"%>
3 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
4 "[Link]
5 <%@tagliburi="[Link]
6 <%@tagliburi="[Link]
7 <html:html>
8 <head>
9 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
10 <title><bean:messagekey="[Link]"/></title>
11 <html:base/>
12 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
13 </head>
14 <body>
15 <divid="contenedor">
16 <h2><bean:messagekey="[Link]"/></h2>
17
18 <divid="errores">
19 <html:errors/>
20 </div>
21 <divid="imagen">
22 <html:imgsrcKey="[Link]"titleKey="[Link]"/>
23 </div>
24
25 <divid="contenido">
26 <html:formaction="dinamicolibro"focus="nombre"styleId="formulario"method="post">
27 <divclass="campo">
28 <bean:messagekey="[Link]"/>
29 <html:textproperty="titulo"/>
30 </div>
31
32 <divclass="campo">
33 <bean:messagekey="[Link]"/>
34 <html:textproperty="autor"/>
35 </div>
36
37 <html:hiddenproperty="method"value="crear"/>
38
39 <html:submitstyleClass="boton"value="enviar"/>
40 <html:cancelstyleClass="boton"value="cancelar"/>
41 <html:resetstyleClass="boton"value="borrar"/>

[Link]

56

TUTORIALFRAMEWORKSTRUTS

42 </html:form>
43 </div>
44 <divid="pie">
45 <p>[Link]</p>
46 </div>
47 </div>
48
49 </body>
</html:html>

[Link]
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
2 <%@tagliburi="[Link]
3 <%@tagliburi="[Link]
4 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
5 "[Link]
6 <html:html>
7 <head>
8 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
9 <title><bean:messagekey="[Link]"/></title>
10 <html:base/>
11 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
12 </head>
13 <body>
14 <divid="contenedor">
15 <h2><bean:messagekey="[Link]"/></h2>
16
17 <divid="imagen">
18 <html:imgsrcKey="[Link]"titleKey="[Link]"/>
19 </div>
20
21 <divid="mensaje">
22 <bean:messagekey="[Link]"/>
23
24 <html:formaction="dinamicolibro2"styleClass="formulario"method="post">
25 <divclass="campo">
26 <bean:messagekey="[Link]"/>
27 <br/>
28 <bean:writename="dinamicolibro"property="titulo"/>
29 </div>
30 <html:textproperty="titulo"/>
31
32 <html:hiddenproperty="method"value="EditarTitulo"/>
33 <html:submitstyleClass="boton"value="editar"/>
34
35 </html:form>
36
37 <html:formaction="dinamicolibro2"styleClass="formulario"method="post">
38 <divclass="campo"class="flotaizquierda">
39
40 <bean:messagekey="[Link]"/>
41 <br/>
42 <bean:writename="dinamicolibro"property="autor"/>
43 </div>
44
45 <html:textproperty="autor"/>

[Link]

57

TUTORIALFRAMEWORKSTRUTS

46
47 <html:hiddenproperty="method"value="EditarAutor"/>
48
49 <html:submitstyleClass="boton"value="editar"/>
50
51 </html:form>
52 </div>
53
54 <divid="pie">
55 <p>[Link]</p>
56 </div>
57
58 </div>
59 </body>
</html:html>

[Link]
<%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
1
<%@tagliburi="[Link]
2
<%@tagliburi="[Link]
3
<!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
4
"[Link]
5
<html:html>
6
<head>
7
<metahttpequiv="ContentType"content="text/html;charset=UTF8">
8
<title><bean:messagekey="[Link]"/></title>
9
<html:base/>
10
<linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
11
</head>
12
<body>
13
<divid="contenedor">
14
<h2><bean:messagekey="[Link]"/></h2>
15

16
<divid="imagen">
17
<html:imgsrcKey="[Link]"titleKey="[Link]"/>
18
</div>
19
<divid="mensaje">
20
<bean:messagekey="[Link]"/>
21

22
<divclass="campo">
23
<bean:writename="dinamicolibro"property="titulo"/>
24
</div>
25
<divclass="campo">
26
<bean:writename="dinamicolibro"property="autor"/>
27
</div>
28
<divclass="campo">
29
<bean:writename="dinamicolibro"property="cambio"/>
30
</div>
31
</div>
32
<divid="pie">
33
<p>[Link]</p>
34
</div>
35

36
</div>
37
</body>
38
</html:html>

[Link]

58

TUTORIALFRAMEWORKSTRUTS

IBATISPROYECTOWEBECLIPSE

Loprimero,comobiendicelawikipediaibatisesunmarcodetrabajodesarrolladopor
apachequeseocupadelacapadepersistencia,situndoseentrelacapadenegocioy
[Link].
Ibatiscumpleunafuncinsimilaraladehibernate,algunosdesarrolladoresconsideran
aibatisunaalternativaporsusencillezypornopresentarunlenguajeespecficopara
consultas.
Enlapginawebdelproyectoibatisenlaceproyectoibatis

Recordarqueesteejemploestarealizadoenlinuxubuntuperoqueestotalmente
compatibleconwindows.
Descargarlaversin2.3.0olaversin2.3.4conlasquesehaprobadoelejemplo,una
vezdescargadoydesempaquetadoelproyectodentrodelacarpetalibtenemosun
[Link]
directoriolibdenuestroproyectowebdinmicodeeclipse.
Partimosdelasituacindelejemplojdbceclipse,noshabamosdescargadomysql,yel
jardriverparajdbccreandolabasededatoslibros_jdbc,conunatablallamadalibros.
Eneseejemplocreabamosunservletquepormtodogetmostrabaunformulario
paraenviardespuslosdatospormtodopost,insertarlosdatosymostrarunlistado
deloalmacenadoenlatabla.
EnlacealejemploanteriorConexinabasesdedatosj2eejdbceclipse
[Link]
1
2
3
4
5
6

packageconexion;

publicclassLibro{

privateintid_libro;

privateStringtitulo_libro;

[Link]

59

TUTORIALFRAMEWORKSTRUTS

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 }

privateStringautor_libro;
privateStringtematica_libro;
publicintgetId_libro(){

returnid_libro;
}
publicvoidsetId_libro(intid_libro){

this.id_libro=id_libro;
}
publicStringgetTitulo_libro(){

returntitulo_libro;
}
publicvoidsetTitulo_libro(Stringtitulo_libro){

this.titulo_libro=titulo_libro;
}
publicStringgetAutor_libro(){

returnautor_libro;
}
publicvoidsetAutor_libro(Stringautor_libro){

this.autor_libro=autor_libro;
}
publicStringgetTematica_libro(){

returntematica_libro;
}
publicvoidsetTematica_libro(Stringtematica_libro){

this.tematica_libro=tematica_libro;
}

Ficherosdeconfiguracinparaibatissontresylospondremosenunpackage
ibatisMap

[Link]
[Link]
Enelpropioproyectodeapacheibatistienentutorialesindicandolafuncionalidadde
cadaunodelosficherosnecesariosparaibatis

[Link]

60

TUTORIALFRAMEWORKSTRUTS

[Link],estefichero
contieneelconjuntodeconsultasquevanaserutilizadasparaelbeanasociadoala
tablalibros
<?xmlversion="1.0" encoding="UTF8"?>
1
<!DOCTYPEsqlMap
2
PUBLIC"//[Link]//DTDSQLMap2.0//EN"
3
"[Link]
4
<sqlMapnamespace="Libro">
5
<selectid="getLibro"parameterClass="int"resultClass="[Link]">
6
SELECT
7
idasid_libro,
8
tituloastitulo_libro,
9
autorasautor_libro,
10
tematicaastematica_libro
11
FROMlibros
12
WHEREid=#value#
13

14
</select>
15

16
<insertid="introducirLibro"parameterClass="[Link]">
17
INSERTINTOlibros(id,titulo,autor,tematica)VALUES
18
(#id_libro#,#titulo_libro#,#autor_libro#,#tematica_libro#)
19
</insert>
20

21
<selectid="getLibros"resultClass="[Link]">
22
SELECT
23
idasid_libro,
24
tituloastitulo_libro,
25
autorasautor_libro,
26
tematicaastematica_libro
27
FROMlibros
28
</select>
29

30
</sqlMap>

ficherodepropiedadesparaelejemplo,sustituyealoquesehaciaenelanterior
ejemplojdbcalcargareldriver
1 driver=[Link]
2 url=jdbc:mysql://localhost:3306/libros_jdbc
3 username=root
4 password=root

FICHERODECONFIGURACINDESQLMAP
1
2
3
4
5
6
7
8
9

<?xmlversion="1.0" encoding="UTF8"?>
<!DOCTYPEsqlMapConfig
PUBLIC"//[Link]//DTDSQLMapConfig2.0//EN"
"[Link]
<sqlMapConfig>

<propertiesresource="ibatisMap/[Link]"/>
<settings
cacheModelsEnabled="true"

[Link]

61

TUTORIALFRAMEWORKSTRUTS

10 enhancementEnabled="true"
11 lazyLoadingEnabled="true"
12 maxRequests="32"
13 maxSessions="10"
14 maxTransactions="5"
15 useStatementNamespaces="false"
16 />
17
18
19 <transactionManagertype="JDBC">
20
21 <dataSourcetype="SIMPLE">
22 <propertyname="[Link]"value="${driver}"/>
23 <propertyname="[Link]"value="${url}"/>
24 <propertyname="[Link]"value="${username}"/>
25 <propertyname="[Link]"value="${password}"/>
26 </dataSource>
27 </transactionManager>
28
29 <sqlMapresource="ibatisMap/[Link]"/>
30 </sqlMapConfig>

Imagendelosjarsutilizados

[Link]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

packageconexion;

[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];

/**
*ServletimplementationclassforServlet:BaseDatosIbatis
*
*/
[Link]
[Link]{
staticfinallongserialVersionUID=1L;

[Link]

62

TUTORIALFRAMEWORKSTRUTS

23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

privateSqlMapClientsqlMap=null;
/*(nonJavadoc)

*@[Link]#HttpServlet()

*/

publicBaseDatosIbatis(){

super();

publicvoidinit()throwsServletException

[Link]();

try

Stringrecursos="ibatisMap/[Link]";

Readerleer=[Link](recursos);

sqlMap=[Link](leer);

catch(Exceptione)

[Link]("errormapeo:"+[Link]());

/*(nonJavadoc)

*@[Link]#doGet(HttpServletRequestrequest,
HttpServletResponseresponse)

*/

protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{

//TODOAutogeneratedmethodstub

//mostramosellistadoconelmtodoget

[Link]("text/html");

//preparamoselobjetodesalida

PrintWritersalida=[Link]();

//creamoslasalida

[Link]("<!DOCTYPEhtmlPUBLIC'//W3C//DTDHTML4.01
Transitional//EN''[Link]

[Link]("<html>\n");

[Link]("<head>\n");

[Link]("<linkrel='stylesheet'type='text/css'href='css/[Link]'/>\n");

[Link]("</head>\n");

[Link]("<body>\n");

[Link]("<divid='contenedor'>\n");

[Link]("<h2>Librosjdbc</h2>");

[Link]("<divid='imagen'>");

[Link]

63

TUTORIALFRAMEWORKSTRUTS

79

[Link]("<imgsrc='imagenes/[Link]'title='carpeta'/>");
80

[Link]("</div>");
81

[Link]("<formaction='BaseDatosIbatis'method='post'>\n<br/>");
82

[Link]("<label>Titulo</label>\n<br/>");
83

[Link]("<inputtype='text'name='titulo'/>\n<br/>");
84

[Link]("<label>Autor</label>\n<br/>");

85

[Link]("<inputtype='text'name='autor'/>\n<br/>");

[Link]("<label>Tematica</label>\n<br/>");
86

[Link]("<inputtype='text'name='tematica'/>\n<br/>");
87

[Link]("<inputclass='boton'type='submit'value='enviar'/>\n<br/>");
88

[Link]("</form>\n<br/>");
89

[Link]("<divid='pie'>");
90

[Link]("<p>[Link]</p>");
91

[Link]("</div>");
92
93

[Link]("</div>\n");
94

[Link]("</body>\n<br/>");
95

[Link]("</html>");
96
97
98
}

99
100
/*(nonJavadoc)
101
*@[Link]#doPost(HttpServletRequestrequest,
102
103 HttpServletResponseresponse)
*/
104
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
105
106 throwsServletException,IOException{

//TODOAutogeneratedmethodstub
107

Stringtitulo=[Link]("titulo");
108

Stringautor=[Link]("autor");
109

Stringtematica=[Link]("tematica");
110
111
112
113

[Link]("text/html");
114
115

PrintWritersalida=[Link]();
116
117

//creamoselobjetolibro
118

Librolibro=newLibro();
119
120

libro.setAutor_libro(autor);
121

libro.setTematica_libro(tematica);
122

libro.setTitulo_libro(titulo);
123

libro.setId_libro(0);
124
125
126
//insertamosenlabasededatoselobjetolibro
127

try
128

{
129

//insertamoslosdatosrecibidosde
130

[Link]("introducirLibro",libro);
131
132

//recuperamoslosdatosdelabasededatos
133

List<Libro>resultado=[Link]("getLibros");
134

[Link]

64

TUTORIALFRAMEWORKSTRUTS

135
136

//mostramoselresultado
137

[Link]("<!DOCTYPEhtmlPUBLIC'//W3C//DTDHTML4.01
138 Transitional//EN''[Link]
139

[Link]("<html>\n");
140

[Link]("<head><title>Mostramoslosdatos</title></head>\n");
141

[Link]("<linkrel='stylesheet'type='text/css'
142 href='css/[Link]'/>\n");

143

[Link]("<body>");
144

[Link]("<divid='contenedor'>\n");
145

[Link]("<h2>Librosjdbc</h2>");

[Link]("<tableid='tabla'>");
146

[Link]("<tr>");
147

148
[Link]("<th>titulo</th><th>autor</th><th>tematica</th>");
149

[Link]("</tr>");
150

Iterator<Libro>iterador=[Link]();
151

while([Link]())
152

{
153

LibroauxLibro=(Libro)[Link]();
154
155

[Link]("<tr>");

156

[Link]("<td
157
158 class='impar'>"+auxLibro.getTitulo_libro()+"</td>");

[Link]("<td
159
160 class='par'>"+auxLibro.getAutor_libro()+"</td>");

[Link]("<td
161
162 class='impar'>"+auxLibro.getTematica_libro()+"</td>");

[Link]("</tr>");
163
164
165
166
167

}
168
169

[Link]("</table>");
170

[Link]("<divid='pie'>");
171

[Link]("<p>[Link]</p>");
172

[Link]("</div>");
173

[Link]("</div>\n");
174

[Link]("</body>");
175

[Link]("</html>");
176

catch(SQLExceptione)

{
[Link]("errordeconsulta"+[Link]());

[Link]

65

TUTORIALFRAMEWORKSTRUTS

STRUTSTILESPROYECTOWEBECLIPSE

Lostilessonplantillasqueutilizastrutsparalaorganizacindelaestructuravisualde
[Link]
frameworkalgoqueyaexistaenj2ee,queeranlasplantillasconjsp.
Comoyasehizoenunejemplodej2eeutilizabamosladirectiva<%@include
file="xxxx"%>paraincluircontenidoestticoyparalainclusindinmicautizabamos
<%@includepage="xxx"%>.estoltimocomorecordatorioj2ee.
Unavezcreadalaplantillalapodemosreutilizarparacualquierpginaquetengadicho
formatoyasnotenerqueescribirtodocdigocadavezquesehaceunanueva
pgina.

Aligualqueenlosanteriorespost,aadimosunnuevoejercicioalalista,enestecaso
[Link],aadimoselsiguienteenlacepara
laaccinplantillas.
1
2 <divclass="enlace">
3 <html:linkaction="/plantillas">5)strutstiles</html:link>
4 </div>

[Link]

66

TUTORIALFRAMEWORKSTRUTS

Recordarestamosconlaversin1.3.10yestaversintenemosunficherode
[Link],
Vemoscomoellinkdelapginadelosejerciciosvalaaccinplantillas,enlaseccin
[Link]
1 <action
2 path="/plantillas"
3 forward="plantillatiles"/>

Dentrodelproyectocreamosunacarpetatiles,dondecreamoslaspginasjspquevan
aintervenirenelproyecto

[Link]
1
2 <%@pagelanguage="java"contentType="text/html;charset=UTF8"pageEncoding="UTF8"%>
3 <%@tagliburi="[Link]
4 <%@tagliburi="[Link]
5 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
6 "[Link]
7 <html:html>
8 <head>
9 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
10 <title><tiles:getAsStringname="titulo"/></title>
11
12 <html:base/>
13 <linktype="text/css"rel="stylesheet"href="../css/[Link]"/>
14 </head>
15 <body>
16 <divid="contenedor">
17 <divid="cabecera">
18 <tiles:insertattribute="cabecera"/>
19 </div>
20 <divid="contendido">
21 <divid="menu">
22 <tiles:getname="menu"/>
23 </div>
24 <divid="contenido">
25 <tiles:getname="cuerpo"/>

[Link]

67

TUTORIALFRAMEWORKSTRUTS

26 </div>
27 </div>
28 <divid="pie">
29 <tiles:getname="pie"/>
30 </div>
31 </div>
32 </body>
</html:html>

Imagendelaplantilla

Losdiferentestiles,fragmentosdepginasjspcomoseutilizanetiquetasdestrutses
necesariointegrarlalibreriahtmlentodasellas,recordarqueestanubicadastalcomo
laimagen
[Link]
1 <%@tagliburi="[Link] prefix="html" %>
2 <divid="imagencabecera">
3 <html:imgsrcKey="[Link]"altKey="[Link]"/>
4 </div>

[Link]

[Link]

68

TUTORIALFRAMEWORKSTRUTS

1 <%@tagliburi="[Link] prefix="html" %>


2 <ulid="menu_lateral">
3 <li><html:linkaction="/objetos">Objetos</html:link></li>
4 <li><html:linkaction="/personajes">Personajes</html:link></li>
5 </ul>
6 <html:imgsrcKey="[Link]"altKey="[Link]"/>

[Link]
1 <%@tagliburi="[Link] prefix="html" %>
2 <p>
3 Ejemplodedesarrolloconstrutstiles,tenemosunaplantillabaseydiferentesdefinicionesde
4 p&aacute;[Link]
5 </p>
6 <html:imgsrcKey="[Link]"altKey="[Link]"/>

[Link]
<%@tagliburi="[Link] prefix="html" %>
1 <pid="pizquierda">
2 <html:linkaction="/Welcome">Ejercicios</html:link>|<html:linkaction="/plantillas">Plantilla
3 </html:link>|<html:linkaction="/objetos">Objetos</html:link>|<html:linkaction="/personajes">
4 Personajes</html:link>
5 </p>
6
<pid="pderecha">@[Link]</p>

Creamosdosnuevaspginasjspparalasvistaspersonajesyobjetos
[Link]
1 <%@tagliburi="[Link] prefix="html" %>
2 <divid="imagenes">
3 <p>Personajes</p>
4 <html:imgsrcKey="imagen.personaje1"altKey="[Link]"/>
5 <html:imgsrcKey="imagen.personaje2"altKey="[Link]"/>
6 </div>

[Link]
1 <%@tagliburi="[Link] prefix="html" %>
2 <divid="imagenes">
3 <p>Objetos</p>
4 <html:imgsrcKey="imagen.objeto1"altKey="[Link]"/>
5 <html:imgsrcKey="imagen.objeto2"altKey="[Link]"/>
6 </div>

ficherodepropiedades
1 #tiles
2 [Link]=../imagenes/[Link]
3 [Link]=imagencabecera

[Link]

69

TUTORIALFRAMEWORKSTRUTS

4 [Link]=../imagenes/[Link]
5 [Link]=l&aacute;pices
6 [Link]=../imagenes/[Link]
7 [Link]=libros
8 imagen.objeto1=../imagenes/[Link]
9 [Link]=[Link]
10 imagen.objeto2=../imagenes/[Link]
11 [Link]=[Link]
12 imagen.personaje1=../imagenes/[Link]
13 [Link]=[Link]
14 imagen.personaje2=../imagenes/[Link]
15 [Link]=[Link]

[Link]
1
2 <action
3 path="/plantillas"
4 forward="plantillatiles"/>
5
6 <action
7
8 path="/objetos"
9 forward="plantillaobjetos"/>
10
11 <action
12 path="/personajes"
13 forward="plantillapersonajes"/>

Tenemosdosposibilidadesestablecerlasdefinicionesmediantejspobienmediante
[Link]
infdelproyectostruts
Enelsiguientepostparalasegundapartedeesteejercicioseverelficherode
configuracinantescitadoylaexplicacinmsdetalladaascomolasdiferentes
capturasdelasvistasobjetosypersonajes.

[Link]

70

TUTORIALFRAMEWORKSTRUTS

STRUTSTILESPROYECTOWEBECLIPSE2PARTE

Comosepuedeobservarlasdosimgenessiguenteniendounaspectosimilaraldela
[Link]
[Link],eseeselobjetivodelostilesproporcionarunesquema
visualcomnaunconjuntodepginas.
[Link],solamentehay
quedescomentarla
1 <pluginclassName="[Link]">
2 <setpropertyproperty="definitionsconfig"value="/WEBINF/[Link]"/>
3 <setpropertyproperty="definitionsdebug"value="2"/>
4 <setpropertyproperty="moduleAware"value="true"/>
5
6 </plugin>

comosepuedeobservarenestaseccinsehacereferenciaalarchivoxmlubicadoen
webinf/[Link],setratadelficheroxmlquetieneladecleracindelas
definicionesdelasvistas.
1 <?xmlversion="1.0" encoding="UTF8"?>
2
3 <!DOCTYPEtilesdefinitionsPUBLIC
4 "//ApacheSoftwareFoundation//DTDTilesConfiguration1.1//EN"
5 "[Link]
6
7
8 <tilesdefinitions>
9
10 <definitionname="${YOUR_DEFINITION_HERE}">
11 </definition>
12
13 <definitionname="plantillatiles"path="/tiles/[Link]">
14 <putname="titulo"value="plantillastruts"type="string"/>
15 <putname="cabecera"value="[Link]"type="page"/>
16 <putname="menu"value="[Link]"type="page"/>
17 <putname="cuerpo"value="[Link]"type="page"/>
18 <putname="pie"value="[Link]"/>
19 </definition>
20 <definitionname="plantillaobjetos"extends="plantillatiles">
21 <putname="titulo"value="plantillaparaobjetos"type="string"/>
22 <putname="cuerpo"value="[Link]"type="page"/>
23 </definition>
24 <definitionname="plantillapersonajes"extends="plantillatiles">
25 <putname="titulo"value="plantillaparapersonajes"type="string"/>
26 <putname="cuerpo"value="[Link]"type="page"/>
27 </definition>
28 </tilesdefinitions>

[Link]

71

TUTORIALFRAMEWORKSTRUTS

[Link],
secorrespondeconladefinicindelname=plantillatiles,estenombreesaprovechado
[Link].
[Link]
delapginadeejerciciosendichapginahayunenlaceaunactionqueesrecogido
[Link]
1 <action
2 path="/plantillas"
3 forward="plantillatiles"/>

[Link]
[Link]
tiles/[Link]
tilesalmismonivel.
Unerrortpicoquepuedeocurrir,[Link]
directamenteenesecasonosdamltipleserrores,varioserroresactionservletyun
errordecontextoindicandoqueestvaco.
[Link],indicandoenel
namelacabecera,men,cuerpoypielapginajspquelecorrespondeacadacual
[Link]
devalor,hemosutilizadodospagesystring,esteultimoparaindicarelttulodela
pgina.
Comosepuedeapreciarenelejemplotantodesdelaprimerapartecomolasegunda
existentresvistas,laprimeraqueestaenelanteriorpostycorrespondeconla
plantillainicialylavistadeobjetosypersonajes.
Siqueremosutilizarpartedellayoutdelasplantillasperohaciendouncambiopara
tenerunavistanuevaejemploobjetosnotenemosmsquehacerunaherenciapor
[Link]=plantillaobjetoque
heredaextendsdeplantillatiles,todomenoselcuerpoyelttulo.
[Link]
sobreescribiendocomoenPOOunapartedelaplantilla,enestecasoelcuerpo.
[Link],elcontroladorproporcionadoporel
[Link]
extendidadelcontroladordeStruts.
Siloquitamosodescomentamosnossaleunerrordeservletexception
1 <!=============================================ControllerConfiguration>
2
3 <controllerprocessorClass="[Link]"/>

[Link]

72

TUTORIALFRAMEWORKSTRUTS

Imagenlavistadeobjetos

Imagendelavistadepersonajes

[Link]

73

TUTORIALFRAMEWORKSTRUTS

TUTORIALHTMLSTRUTSTAGS

Enejemplosanteriores,sehabautilizadounasetiquetasquepodanresultar
diferentessivenimosdeotroslenguajesdeprogramacinweb.
Strutsutilizaunasetiquetashtmlmuysimilaresalasdehtmlperoconalgunas
[Link],detalformaqueparaindicarelinicio
yelfindeldocumentoseponey
Parasuutilizacinenunapginajspdebemosincluirlasiguientesintaxisparaelcaso
de1.3.10
<%@tagliburi="[Link]

elvalordelatributoprefixseponehtmlparanoequivocarseperopodrasecualquier
otronombre
html

equivaleahtml

button

equivalenteainputtype=button

cancel

equivaleainputtype=subtmit

checkbox equivaleainputtype=checkbox
hidden

equivaleainputtype=hidden

img

equivaleaimg

javascript equivaleajavascript
link

equivaleaa

base

basedelapgina

messages muestralosmensajesdelidioma
multibox typecheckboxperopermiteunarraydestringdelospropertyiguales
option

equivaleaoption

password equivaleapassword
radio

equivalearadio

reset

equivaleareset

select

equivaleaselect

submit

equivaleatypesubmit

text

equivaleatypetext

textarea equivaleatextarea
frame

equivaleaframe

form

equivaleahtml

file

equivaletypefile

Enladescargadelproyectostrutsexisteunacarptetadocsconhtmlcontodala
informacionreferentealostagshtmlcomobeanlogictilesetc..

[Link]

74

TUTORIALFRAMEWORKSTRUTS

TUTORIALDELOOKUPDISPATCHACTIONSTRUTS

LookupDispatchactionesotraclasedestrutsquecomplementalosejercicios
anterioressobreformulariosstruts.
HabamosvistolaclaseDispatchactionenstruts,queaportabalaposibilidadde
realizardistintasaccionesenunasolaclase,aadiendounanuevapotencialidadalas
clasesaction,lascualessolamentetenanelmtodoservicegenricopararespondera
laspeticionesdelosusuarios.
LookupDispatchactiontienetambinensuconfiguracinunparmetroparameter,
[Link]
desdeunmismoformulariopoderllamaradistintosmtodos.

[Link]
1 <divclass="enlace">
2 <html:linkaction="/dinamicoLookup">6)lookupdispatchAction</html:link>
3 </div>

[Link]

75

TUTORIALFRAMEWORKSTRUTS

CONFIGURACIONDELBEANDYNAVALIDATORFORM
1
2 !================================================FormBeanDefinitions>
3
4 <formbeanname="dinamicolibro"type="[Link]">
5 <formpropertyname="titulo"type="[Link]"/>
6 <formpropertyname="autor"type="[Link]"/>
7 <formpropertyname="cambio"type="[Link]"/>
8 </formbean>

[Link]
1 <!===========================================ActionMappingDefinitions>
2
3 <action
4 path="/dinamicoLookup"
5 forward="/pages/[Link]"/>
6
7 <action
8 path="/lookupDispatchAction"
9 type="[Link]"
10 scope="request"
11 validate="true"
12 name="dinamicolibro"
13 input="/pages/[Link]"
14 parameter="method">
15 <setpropertyproperty="cancellable"value="true"/>
16
17 <forwardname="cancelada"path="/pages/[Link]"/>
18 <forwardname="editarlibros"path="/pages/[Link]"/>
19 </action>
20
21 <action
22 path="/LookupDispatchAction2"
23 type="[Link]"
24 scope="request"
25 validate="false"
26 name="dinamicolibro"
27 parameter="method">
28
29 <setpropertyproperty="cancellable"value="true"/>
30
31 <forwardname="cancelada"path="/pages/[Link]"/>
32 <forwardname="datoslibro"path="/pages/[Link]"/>
33 </action>

[Link]
dentrodeltag
<formvalidation>

ComorepasodesdeDynaValidatorForm,secreabanunosformulariosbeandinmicos,
quepermitanvalidarloscamposdeunformulariosinteneerquecrearlaclase

[Link]

76

TUTORIALFRAMEWORKSTRUTS

[Link]
seanobligatorios.
1 <formset>
2 <formname="dinamicolibro">
3 <field
4 property="titulo"
5 depends="required">
6 <argkey="[Link]"/>
7 </field>
8
9 <field
10 property="autor"
11 depends="required">
12 <argkey="[Link]"/>
13 </field>
14 </form>
15
16 </formset>

CONFIGURACINDELFICHERODEPROPIEDADESPROPERTIES
1 #lookupdispathAction
2 [Link]=cancelar
3 [Link]=crear
4 [Link]=EditarTitulo
5 [Link]=EditarAutor
6 [Link]=LookupDispatchAction
7 [Link]=titulo
8 [Link]=autor

[Link]
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
2 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
3 "[Link]
4 <%@tagliburi="[Link]
5 <%@tagliburi="[Link]
6 <html:html>
7 <head>
8 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
9 <title><bean:messagekey="[Link]"/></title>
10 <html:base/>
11 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
12 </head>
13 <body>
14 <divid="contenedor">
15 <h2><bean:messagekey="[Link]"/></h2>
16
17 <divid="errores">
18 <html:errors/>
19 </div>
20 <divid="imagen">
21 <html:imgsrcKey="[Link]"titleKey="[Link]"/>
22 </div>
23

[Link]

77

TUTORIALFRAMEWORKSTRUTS

24 <divid="contenido">
25 <html:formaction="lookupDispatchAction"focus="nombre"styleId="formulario"method="post">
26 <divclass="campo">
27 <bean:messagekey="[Link]"/>
28 <html:textproperty="titulo"/>
29 </div>
30
31 <divclass="campo">
32 <bean:messagekey="[Link]"/>
33 <html:textproperty="autor"/>
34 </div>
35
36
37 <html:submitstyleClass="boton"property="method"><bean:message
38 key="[Link]"/></html:submit>
39 <html:cancelstyleClass="boton"><bean:messagekey="[Link]"/>
40 </html:cancel>
41 <html:resetstyleClass="boton"value="borrar"/>
42 </html:form>
43 </div>
44 <divid="pie">
45 <p>[Link]</p>
46 </div>
47 </div>

</body>
</html:html>

[Link]
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

packageacciones;

[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];

publicclassAccionLookupDispatchActionextendsLookupDispatchAction{

privateActionForwardenvio;

privateDynaValidatorFormformulario;

privateStringtitulo;

privateStringautor;

protectedMapgetKeyMethodMap()

Mapmap=newHashMap();

[Link]("[Link]","EditarTitulo");

[Link]("[Link]","EditarAutor");

[Link]("[Link]","crear");

[Link]

78

TUTORIALFRAMEWORKSTRUTS

28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

returnmap;

protectedActionForwardcancelled(ActionMappingmapping,ActionForm
form,HttpServletRequestrequest,HttpServletResponseresponse)throwsException

if(isCancelled(request)){

envio=[Link]("cancelada");

returnenvio;

//creamoslosmtodosquerespondenalasacciones

publicActionForwardcrear(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)throwsException

//recuperamoslosdatosdelformulariobeandinmicoValidator

formulario=(DynaValidatorForm)form;

titulo=[Link]("titulo");

autor=[Link]("autor");

[Link](titulo);

envio=[Link]("editarlibros");

returnenvio;

publicActionForwardEditarTitulo(ActionMappingmapping,ActionFormform,
HttpServletRequestresquest,HttpServletResponseresponse)throwsException

//recuperamoslosdatosdelformulariobeandinmicoValidator

formulario=(DynaValidatorForm)form;

Stringcadena="Sehacambiado"+[Link]+"por"+[Link]("titulo");

[Link]("cambio",cadena);

//recargamoselformularioconelvalorguardado

[Link]("autor",[Link]);

envio=[Link]("datoslibro");

returnenvio;

publicActionForwardEditarAutor(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)throwsException

[Link]

79

TUTORIALFRAMEWORKSTRUTS

84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103

//recuperamoslosdatosdelformulariobeandinmicoValidator

//recuperamoslosdatosdelformulariobeandinmicoValidator
formulario=(DynaValidatorForm)form;
Stringcadena="Sehacambiado"+[Link]+"por"+[Link]("autor");

[Link]("cambio",cadena);
//recargamoselformularioconel
[Link]("titulo",[Link]);

envio=[Link]("datoslibro");

returnenvio;
}

LookupDispatchAction,permitealigualquecondispatchactiontenervariasacciones
(mtodos)enlamismaclasedetalformaquetenemosdosformulariosquellamanala
[Link].
SeutilizaunHashMapparaestablecerunconjuntodecontraseasparalosdistintos
mtodosausar,esascontraseassonlasulilizadasenlosbotonesdelaspginasjsp.
EsnecesariocrearelmtodoprotectedMapgetKeyMethodMapparalacreacindel
conjuntodeclavesmtodo.
Sisequiereincluirelbotndecancelacinconelusodeestaclase,laconfiguracinen
[Link],porloquehayquehacercambiosen
laclasejavaeincluirelmtodocancelledparasobreescribirloyresponderalbotnde
cancelacin.
Imagenresultadodelenvodelosdatos

[Link]

80

TUTORIALFRAMEWORKSTRUTS

Introducimostitulo2enelcampodetitulo

resultadofinal

[Link]

81

TUTORIALFRAMEWORKSTRUTS

[Link]

82

TUTORIALFRAMEWORKSTRUTS

[Link]

EnlacealproyectostrutsDatasource
Eldatasource,seutilizaparaestablecerunpooldeconexionesqueimplementanla
[Link]
basesdedatosutilizadasenlasaplicacionesdestruts,ysolamentedesdelasclasesde
negociollamaraestaconfiguracinparapoderutilizarlas.
Estetipodeconfiguracinesvlidoparalasversionesdestruts1.1hastalaversin
[Link]
versin1.3.10,estrealizadoconla1.2.9.
DATASOURCESTRUTS

Ladeclaracindeldatasourcevadalantedelosbeansparaladtdstrutsconfig_1_2.dtd
1 <!DOCTYPEstrutsconfigPUBLIC
2 "//ApacheSoftwareFoundation//DTDStrutsConfiguration1.2//EN"
3 "[Link]
4
5 <strutsconfig>
6
7 <!============================================DataSourceConfiguration>
8 <datasources>

[Link]
1 <datasources>
2
3 <datasourcetype="[Link]">
4
5 <setpropertyproperty="driverClassName"value="[Link]"/>
6
7
8 <setpropertyproperty="url"value="jdbc:mysql://localhost:3306/libros_jdbc"/>
9
10 <setpropertyproperty="username"value="root"/>

[Link]

83

TUTORIALFRAMEWORKSTRUTS

11
12 <setpropertyproperty="password"value="root"/>
13
14 <setpropertyproperty="maxActive"value="10"/>
15
16 <setpropertyproperty="defaultReadOnly"value="false"/>
17
18 <setpropertyproperty="defaultAutoCommit"value="true"/>
19
20 <setpropertyproperty="validationQuery"value="SELECTCOUNT(*)FROMlibros"/>
21
22 </datasource>
23
24 </datasources>

[Link]

Creamoslosactionsparaelejemplo,simplementeredireccionamoslaaccin
[Link]
redireccionaalapgina
1 <!===========================================ActionMappingDefinitions>
2
3 <actionmappings>
4 <!Default"Welcome"action>
5 <![Link]>
6 <action
7 path="/Welcome"
8 forward="/[Link]"/>
9
10 <action
11
12 path="/conexion"

[Link]

84

TUTORIALFRAMEWORKSTRUTS

13 type="[Link]"
14 scope="request">
15 <forwardname="satisfactoria"path="/pages/[Link]"/>
16 <forwardname="fallida"path="/pages/[Link]"/>
17
18 </action>

[Link]
<%@pagelanguage="java"contentType="text/html;charset=ISO88591"pageEncoding="ISO8859
1 1"%>
2 <%@tagliburi="/tags/strutshtml"prefix="html"%>
3 <%@tagliburi="/tags/strutsbean"prefix="bean"%>
4 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
"[Link]
5
<html>
6
<head>
7
<metahttpequiv="ContentType"content="text/html;charset=ISO88591">
8
<title>ConexionFallida</title>
9
<html:base/>
10
<linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
11
</head>
12
<body>
13
<divid="contenedor">
14
<divid="contenido">
15
<p>conexionfallida</p>
16
</div>
17
<divid="pie">
18
<p>[Link]</p>
19
</div>
20
</div>
21
</body>
22
</html>

[Link]

85

TUTORIALFRAMEWORKSTRUTS

CDIGODELAPGINAREGISTROSATISFACTORIO
<%@pagelanguage="java"contentType="text/html;charset=ISO88591"pageEncoding="ISO8859
1 1"%>
2 <%@tagliburi="/tags/strutshtml"prefix="html"%>
3 <%@tagliburi="/tags/strutsbean"prefix="bean"%>
4 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
"[Link]
5
<html:html>
6
<head>
7
<metahttpequiv="ContentType"content="text/html;charset=ISO88591">
8
<title>Consultaalabasededatos</title>
9
<html:base/>
10
<linkrel="stylesheet"href="../css/[Link]"type="text/css"/>
11
</head>
12
<body>
13
<divid="contenedor">
14
<divid="contenido">
15
<p>Establecemosconexion</p>
16
</div>
17
<divid="pie">
18
<p>[Link]</p>
19
</div>
20
</div>
21
</body>
22
</html:html>

resultadodelaejecucinporpantalla

[Link]

86

TUTORIALFRAMEWORKSTRUTS

CDIGODELACLASEJAVAACCIONBASEDATOSDENTRODELPACKAGEDE
ACCIONES
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
28
29

packageaccion;

[Link];
[Link];
[Link];
[Link];

[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];

publicclassaccionBaseDatosextendsAction{

privateDataSourcedatasource;

privateConnectionconexion;

privateStringdevolucion;

privateStatementsentenciaSql;

privateResultSetresultado;

publicActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)

try

[Link]

datasource=getDataSource(request);

87

TUTORIALFRAMEWORKSTRUTS

30

conexion=[Link]();

sentenciaSql=[Link]();

resultado=[Link]("Select*Fromlibros");

36

while([Link]())

37

38

39

41

if(conexion!=null)

42

43

48

[Link]();

49

51

catch(SQLExceptione)

52

54

devolucion="fallida";

55

[Link](devolucion);

31
32
33
34
35

[Link]([Link]("autor"));

40

devolucion="satisfactoria";

44
45
46
47

50

53

56
57
58
59
60

[Link]

88

TUTORIALFRAMEWORKSTRUTS

61

62
63 }

resultadoenconsoladelaejecucion,losautoresdelabasededatosdelibros_jdbc
paralatablalibros
1 INFO:Tilesdefinitionfactoryfoundforrequestprocessor''.
2 autor1
3 autor2
4 autor3
5 autor4
6 autor5
7 autor6
8 autor7
9 autor7
10 autor8
11 autor9
12 autor10

[Link]

89

TUTORIALFRAMEWORKSTRUTS

[Link]

integracindelenlaceenlapginawebdeejercicios
1 <divclass="enlace">
2 <html:linkaction="/datasource">7)datasource</html:link>
3 </div>

[Link]
1 <action
2 path="/datasource"
3 forward="/pages/[Link]"
4 />

[Link],eslaconfiguracindelbean
dinmicoconlaspropiedadesdelatabladelabasededatoslibroscampotitulo,
temticayautorvistosenjdbcj2ee
1 <formbeanname="beandatasource"type="[Link]">
2 <formpropertyname="titulo"type="[Link]"/>
3 <formpropertyname="tematica"type="[Link]"/>
4 <formpropertyname="autor"type="[Link]"/>
5 </formbean>

CONFIGURACINDELFICHERODEPROPIEDADES
1 #datasource
2 [Link]=enviar
3 [Link]=cancelar
4 [Link]=formulariodatasource
5 [Link]=titulo
6 [Link]=tematica
7 [Link]=autor
8 [Link]=listadodelibros
9 [Link]=listadodedatos

Siintentamoscreareldatasourcealigualquehacamosconlaversin1.2nosdaerror,
enelarchivodeconfiguracindestruts

[Link]

90

TUTORIALFRAMEWORKSTRUTS

Ladtddestruts1.3soportaunconjuntodeetiquetasenelordenqueseindicaenla
siguienteimagen.

Eltagnovienesoportadoparaestadtd
Explicacionesdelproyectostrutsenelwikidatasource
Removedtheandelements
creamosunpackagenuevoparaalbergaralbeanlibro,packagevo,sellamaasporel
patrnvalueobject
1 packagevo;
2
3 publicclassLibro{
4
5
privateStringtitulo;
6
privateStringautor;
7
privateStringtematica;
8
9
publicStringgetTitulo(){

returntitulo;
10
}
11
publicvoidsetTitulo(Stringtitulo){
12

[Link]=titulo;
13
}
14
publicStringgetAutor(){
15

returnautor;
16
}
17
publicvoidsetAutor(Stringautor){
18

[Link]=autor;
19
}
20
publicStringgetTematica(){
21

returntematica;
22
}
23
publicvoidsetTematica(Stringtematica){
24

[Link]=tematica;
25
}
26
27
28 }

[Link]

91

TUTORIALFRAMEWORKSTRUTS

CLASECONEXIONDENTRODELPACKAGECONEXIONES
packageconexiones;
1

2
[Link];
3
[Link];
4

5
[Link];
6
[Link];
7
[Link];
8

10
publicclassConexion{
11

12

privateConnectionconexion=null;
13

14

publicConexion()
15

{
16

17

18

}
19

20

publicConnectionestablecerConexion()
21

{
22

23

try
24

{
25

26

InitialContextcontexto=newInitialContext();
27

DataSourceds=(DataSource)
28
[Link]("java:comp/env/jdbc/datasource");
29

[Link]=[Link]();

30

31

32

}
33

catch(NamingExceptione)
34

{
35

[Link]([Link]());
36

}
37

38

catch(SQLExceptione)
39

{
40

[Link]([Link]());
41

}
42

43

[Link];
44

45

}
46

47
}

[Link]

92

TUTORIALFRAMEWORKSTRUTS

[Link]
1 <resourceref>
2 <description>DBConnection</description>
3 <resrefname>jdbc/datasource</resrefname>
4 <restype>[Link]</restype>
5 <resauth>Container</resauth>
6 <ressharingscope>shareable</ressharingscope>
7 </resourceref>

[Link]
1 <?xmlversion="1.0" encoding="UTF8"?>
2 <Contextpath="/DBTest"docBase="DBTest"
3 debug="5"reloadable="true"crossContext="true">
4
5 <!maxActive:[Link]
6 configureyourmysqldmax_connectionslargeenoughtohandle
7 allofyourdbconnections.Setto1fornolimit.
8 >
9
10 <!maxIdle:MaximumnumberofidledBconnectionstoretaininpool.
11 [Link]
12 andtheminEvictableIdleTimeMillisconfigurationparameter.
13 >
14
15 <!maxWait:MaximumtimetowaitforadBconnectiontobecomeavailable
16 inms,[Link]
17 thistimeoutisexceeded.Setto1towaitindefinitely.
18 >
19
20 <!usernameandpassword:MySQLdBusernameandpasswordfordBconnections>
21
22 <!driverClassName:[Link]
23 [Link]/Jthough.
24 ClassnamefortheofficialMySQLConnector/[Link].
25 >
26
27 <!url:TheJDBCconnectionurlforconnectingtoyourMySQLdB.
28 >
29
30 <Resourcename="jdbc/datasource"auth="Container"type="[Link]"
31 maxActive="100"maxIdle="30"maxWait="10000"
32 username="root"password="root"driverClassName="[Link]"
33 url="jdbc:mysql://localhost:3306/libros_jdbc"/>
34
35 </Context>

[Link]

93

TUTORIALFRAMEWORKSTRUTS

[Link]
1
2
3
4
5
6
7
8
9
10
11
12
13

<action
path="/formulariodatasource"
type="[Link]"
scope="request"
validate="true"
name="beandatasource"
input="/pages/[Link]">

<setpropertyproperty="cancellable"value="true"/>

<forwardname="cancelada"path="/pages/[Link]"></forward>
<forwardname="mostrardatos"path="/pages/[Link]"></forward>
</action>

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41

packageacciones;

[Link];
[Link];

[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];

publicclassConexionDatasourceextendsAction{

privateConnectionconexionr=null;
privateActionForwardenvio=null;

privateConexionconexion=null;

privateStatementsentenciaSql;

privateResultSetresultado=null;

privateLibrolibro;

privateArrayList<Libro>listalibros;

privateHttpSessionsession=null;

publicActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)throwsException

DynaValidatorFormformulario=(DynaValidatorForm)form;

conexion=newConexion();

[Link]("Text/html");

[Link]

94

TUTORIALFRAMEWORKSTRUTS

42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98

PrintWritersalida=[Link]();

if([Link](request))

envio=[Link]("cancelada");

else

try

conexionr=[Link]();

sentenciaSql=[Link]();

//ejecutamoslasentenciadeseleccindeloscamposmenoselid

[Link]([Link]("titulo"));

[Link]([Link]("autor"));

[Link]([Link]("tematica"));

[Link]("INSERTINTOlibrosVALUES
("+0+",'"+[Link]("titulo")+"','"+[Link]("autor")+"','"+[Link]("tematica")+"')
;");

//recuperamoslosdatosdelabasededatos

resultado=[Link]("SELECT*fromlibros;");

if(resultado!=null)

//creamoselarraydelibros

listalibros=newArrayList<Libro>();

while([Link]())

libro=newLibro();

[Link]([Link]("titulo"));

[Link]([Link]("autor"));

[Link]([Link]("tematica"));

[Link](libro);

//cerramoslaconexion

[Link]();

//establecemoselparmetroporpeticion

session=[Link](true);

[Link]("listadolibros",listalibros);

envio=[Link]("mostrardatos");

[Link]

95

TUTORIALFRAMEWORKSTRUTS

99
100
101
102
103
104
105
106
107
108
109
110
111
112

catch(
{

returnenvio;

SQLExceptione)
[Link]("ExcepcionSql:"+[Link]());

[Link]
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
2 <%@tagliburi="[Link]
3 <%@tagliburi="[Link]
4 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
5 "[Link]
6 <html:html>
7 <head>
8 <html:base/>
9 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
10 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
11 <title><bean:messagekey="[Link]"/></title>
12 </head>
13 <body>
14 <divid="contenedor">
15 <h2><bean:messagekey="[Link]"/></h2>
16
17 <divid="errores">
18 <html:errors/>
19 </div>
20 <divid="imagen">
21 <html:imgsrcKey="[Link]"titleKey="[Link]"/>
22 </div>
23
24 <divid="contenido">
25 <html:formaction="formulariodatasource"focus="nombre"styleId="formulario"method="post">
26 <divclass="campo">
27 <bean:messagekey="[Link]"/>
28 <html:textproperty="titulo"/>
29 </div>
30 <divclass="campo">
31 <bean:messagekey="[Link]"/>
32 <html:textproperty="autor"/>
33 </div>
34
35 <divclass="campo">
36 <bean:messagekey="[Link]"/>
37 <html:textproperty="tematica"/>

[Link]

96

TUTORIALFRAMEWORKSTRUTS

38 </div>
39
40 <html:submitstyleClass="boton"><bean:messagekey="[Link]"/>
41 </html:submit>
42 <html:cancelstyleClass="boton"><bean:messagekey="[Link]"/>
43 </html:cancel>
44 <html:resetstyleClass="boton">borrar</html:reset>
45 </html:form>
46 </div>
47 <divid="pie">
48 <p>[Link]</p>
49 </div>
</div>
</body>
</html:html>

Imagencorrespondiente

[Link]

Lasetiquetaslogicnospermiteniterarsobrelosresultadosobtenidos,logic:emptynos
permitesabersielvalordelavariablereferenciadapornameestvaco,enstecaso
[Link]
seutilizalogic:notEmpty,paraluegoiterarporlosresultadoconlogic:iterate
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
2 <%@tagliburi="[Link]
3 <%@tagliburi="[Link]
4 <%@tagliburi="[Link]
5
6 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
7 "[Link]
8 <html>
9 <head>
10 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
11 <html:base/>
12 <title><bean:messagekey="[Link]"/></title>

[Link]

97

TUTORIALFRAMEWORKSTRUTS

13 <linkrel="stylesheet"href="../css/[Link]" type="text/css"/>
14
15 </head>
16 <body>
17 <divid="contenedor">
18 <divid="tabla">
19 <logic:emptyname="listadolibros">
20 <p>Labasededatosdelibrosestavac&iacute;a</p>
21 </logic:empty>
22
23 <logic:notEmptyname="listadolibros">
24 <h2><bean:messagekey="[Link]"/></h2>
25 <tabletitle="tabladedatoslibros">
26 <tr><th>titulo</th><th>autor</th><th>tematica</th></tr>
27
28 <logic:iteratename="listadolibros"id="libro">
29 <tr>
30 <tdclass="par">
31 <bean:writename="libro"property="titulo"/>
32 </td>
33 <tdclass="impar">
34 <bean:writename="libro"property="autor"/>
35 </td>
36 <tdclass="par">
37 <bean:writename="libro"property="tematica"/>
38 </td>
39 </tr>
40 </logic:iterate>
41 </table>
42 </logic:notEmpty>
43 </div>
44
45 <divid="pie">
46 <p>[Link]</p>
47 </div>
48 </div>
49 </body>
</html>

Imagencorrespondiente

[Link]

98

TUTORIALFRAMEWORKSTRUTS

[Link]

99

TUTORIALFRAMEWORKSTRUTS

MOSTRANDOLISTADODEDATOS

Cuandomostramoslosdatos,recogidosdeunabasesdedatos,puedequeelnmero
deitemsrecogidosseabastanteamplioporloqueresultarabastanteengorrosopara
elusuarioverunlistadomuylargo.
[Link]
Podemoscreardedosformasdistintas,bienamanoobienutilizandounalibrerade
[Link]
datosadiferentesformatos.
Parasuutilizacin,necesitamosimportarlalibreradisplaytag(
[Link]
<%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
1 <%@tagliburi="[Link]
2 <%@tagliburi="[Link]
3 <%@tagliburi="[Link]
4 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
5 "[Link]
6 <html:html>
7 <head>
8 <html:base/>
9 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
10 <title><bean:messagekey="[Link]"/></title>
11 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
12 </head>
13 <body>
14
15 <divid="contenedor">
16
17 <divid="tabla">
18
19 <display:tableid="libro"name="[Link]"pagesize="5"
20 requestURI="/[Link]">
21
22 <display:columnproperty="titulo"title="t&iacute;tulo"sortable="true"/>
23 <display:columnproperty="autor"title="autor"sortable="true"/>
24 <display:columnproperty="tematica"title="tem&aacute;tica"sortable="true"/>
25
26 </display:table>
27
28 </div>
29
30 <divid="pie">
31 <p>[Link]</p>
32 </div>
33
34 </div>
35
36 </body>
</html:html>

[Link]

100

TUTORIALFRAMEWORKSTRUTS

necesitamosincorporarelarchivodepropiedades,paradisplaytag,

Losdatosquesemuestranpuedencambiar,dejarmenosesposible
alpasarlapgina

enlacarpetasrcsecopiaelficherodepropiedadesen
castellano

_es_zonageogrficaejemploes_AR,es_MXetc.
elactionalquellamalatablaensuatributouri,[Link]
1 <action
2 path="/mostrarlistadodisplaytag"
3 forward="/pages/[Link]"/>

[Link]

101

TUTORIALFRAMEWORKSTRUTS

DESARROLLOWEBUPLOADFILESTRUTS

Ejemploparasubirunarchivozipmediantestruts

formbean,sedeclaraelnombredelformulariobeancomouploadFormenatributo
typesedeclaralarutadelaclasebean
1 <!elformbeansolamentenecesitaelnameyeltype>
2 <formbeanname="uploadForm"
3 type="[Link]"/>

[Link]
elatributopathindicamosquestrutsrespondaanteunaaccinuploadfileconla
pginaubicadaen/pages/[Link]
parasubirelarchivo
1
2 <actionpath="/uploadfile"
3 forward="/pages/[Link]">
4 </action>
5
6 <action
7 path="/subirarchivo"
8 type="[Link]"
9 scope="request"
10 name="uploadForm"
11 validate="true"
12 input="/pages/[Link]">
13
14 <forwardname="subido"path="/pages/[Link]"/>
15 </action>

Sisesubielarchivowebcorrectamenteserealizaunreenvioalapgina
mostrarinformacinparaindicarunmensajedeconfirmacinalusuario,encaso
[Link]

102

TUTORIALFRAMEWORKSTRUTS

contrariomedianteelatributoinputseindicaquelapropiapginajspdesubidadel
archivomuestreporpantallaelmensajecorrespondientesegnelerrorcometido
CDIGODELACLASESUBIRARCHIVO
packageacciones;
1
2 [Link];
3 [Link];
4 [Link];
5 [Link];
6 [Link];
7 [Link];
8 [Link];
9 [Link];
10 [Link];
11 [Link];
12
13
14
15 publicclassSubirArchivoextendsAction{
16
privateActionForwardenvio;
17
18
19
publicActionForwardexecute(ActionMappingmapping,ActionFormform,
20
21 HttpServletRequestrequest,HttpServletResponseresponse)throwsException
{

22

FormulariouploadformularioSubido=(Formularioupload)form;
23

FileOutputStreamfileoutputstream=null;
24
25

try
26

{
27

FormFilefichero=[Link]();
28

Stringruta=
29
30 [Link]().getServletContext().getRealPath("/upload/")+[Link]();

fileoutputstream=newFileOutputStream(newFile(ruta));
31

[Link]([Link]());
32
33

}
34
finally

35

{
36

if(fileoutputstream!=null)
37

{
38

[Link]();
39

}
40

}
41

[Link]("subido");
42
}
43
44
45
}

[Link]

103

TUTORIALFRAMEWORKSTRUTS

CDIGODELAPGINAJSPENCARGADADEMOSTRARELFORMULARIODESUBIDA
DEARCHIVO
<%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
1
<%@tagliburi="[Link]
2
<%@tagliburi="[Link]
3
<!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
4
"[Link]
5
<html:html>
6
<head>
7
<html:base/>
8
<metahttpequiv="ContentType"content="text/html;charset=UTF8">
9
<title><bean:messagekey="[Link]"/></title>
10
<linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
11
</head>
12
<body>
13
<divid="contenedor">
14

15
<h2><bean:messagekey="[Link]"/></h2>
16

17
<divid="errores">
18
<html:errors/>
19
</div>
20

21
<divid="contenido">
22

23
<divid="imagen">
24
<html:imgsrcKey="[Link]"altKey="[Link]"/>
25
</div>
26

27
<html:formmethod="post"action="/subirarchivo"enctype="multipart/formdata">
28

29
<divid="campo">
30

31
<bean:messagekey="[Link]"/>
32

33

34
<html:fileproperty="fichero"/>
35

36
<br/>
37

38
<html:submitstyleClass="boton"value="enviar"/>
39

40
</div>
41

42
</html:form>
43
</div>
44
<divid="pie">
45
<p>[Link]</p>
46
</div>
47

48
</div>
49
</body>
50
</html:html>

[Link]

104

TUTORIALFRAMEWORKSTRUTS

ENELFICHERODEPROPIEDADES
1 #uploadfile
2 [Link]=formulariouploadfile
3 [Link]=introduceelficheroasubir
4 [Link]=../imagenes/[Link]
5 [Link]=imagenarchivo
6 [Link]=elficheroestavac&iacute;o
7 [Link]=elarchivonoesdetipozip
8 [Link]=erroreltamaoexcedelopermitido
9 [Link]=formulariosubido

CLASEBEANPARAELFORMULARIO
1 packageformularios;
2
3 [Link];
4 [Link];
5 [Link];
6 [Link];
7 [Link];
8 [Link];
9
10 publicclassFormulariouploadextendsActionForm{
11
staticfinallongserialVersionUID=1L;
12
13
privateFormFilefichero;
14
privateStringinformacion;
15
16
publicStringgetInformacion(){
17

returninformacion;
18
}
19
20
publicvoidsetInformacion(Stringinformacion){
21
[Link]=informacion;

22
}
23
24
publicFormFilegetFichero(){
25

returnfichero;
26
}
27
28
publicvoidsetFichero(FormFilefichero){
29

[Link]=fichero;
30
}
31
32
33
publicActionErrorsvalidate(ActionMappingmapping,HttpServletRequestrequest)
34
{
35
36

ActionErrorserrores=newActionErrors();
37
38

//yaestasubidomiramossiesdeltipoindicado
39

if([Link]()==0)
40

{
41

//estavaco
42

[Link]("fichero",newActionMessage("[Link]"));
43

[Link]

105

TUTORIALFRAMEWORKSTRUTS

44

45

else
46

{
47
48

if(![Link]().equals("application/xzipcompressed"))
49

{
50

[Link]("fichero",newActionMessage("[Link]"));
51

[Link]([Link]());
52

}
53
54

else
55

{
56

if([Link]()>2000000)
57

{
58

[Link]("fichero",new
59
60 ActionMessage("[Link]"));

}
61
62

}
63
64

}
65
66

returnerrores;
67
}
68
69
70
}

Situacinenlaquehemosdadoalbotndeenviarsinhaberseleccionadounarchivo

Errordeformatodearchivo

[Link]

106

TUTORIALFRAMEWORKSTRUTS

Situacinelarchivo,stieneelformatozipperonoshemosexcedidodetamao
soportadoporlaaplicacin

Situacinenlaquehemosenviadocorrectamenteelarchivo

Paracomprobarelficherosubidoalproyectodesplegamoslaaplicacinenelservidor
tomcatmedianteunwardelproyecto

[Link]

107

TUTORIALFRAMEWORKSTRUTS

DESARROLLOWEBMLTIPLESARCHIVOSDECONFIGURACINSTRUTS

Enestepostveremoscomocreardiferentesarchivosdeconfiguracinparael
frameworkstruts.
Estamosconlaversin1.3.10destrutsysellevanmostradosdiferentesejemplos
[Link]
queiralarchivodeconfiguracin,llegaelmomentoenqueestearchivode
configuracinestasobrecargadodelneasdecdigo.

Enesteejemplointervienenlosdosarchivosdeconfiguracin,declaracindeuna
[Link]
[Link]
1 <action
2 path="/multiconfiguracion"
3 forward="/pages/[Link]"/>

CDIGODELAPGINAENLACEPRIVADO
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
2 <%@tagliburi="[Link]
3 <%@tagliburi="[Link]
4 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
5 "[Link]
6 <html:html>
7 <head>
8 <html:base/>
9 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
10 <title><bean:messagekey="[Link]"/></title>
11 <linkrel="stylesheet"type="text/css"href="../css/[Link]"/>
12 </head>
13 <body>
14 <divid="contenedor">
15 <divid="contenido">
16
17 <divid="campo">
18 <html:linkaction="/config2">Zonaprivada</html:link>
19 </div>
20
21 </div>
22 <divid="pie">
23 <p>[Link]</p>
24 </div>
25 </div>

[Link]

108

TUTORIALFRAMEWORKSTRUTS

26</body>
</html:html>

Enesapginajspexisteunenlacequeactivalaaccinconfig2queapareceenel
[Link]
Enlaceimagen

[Link]
camposdetipostring,yunaaccinprivado,quevasertratadadesdestruts
[Link]
1 <formbeans>
2
3 <formbeanname="formularioprivado"type="[Link]">
4 <formpropertyname="usuario"type="[Link]"/>
5 <formpropertyname="clave"type="[Link]"/>
6
7 </formbean>
8
9 </formbeans>
10
11 <actionmappings>
12
13 <action
14 path="/config2"
15 forward="/pages/[Link]"/>
16
17
18 <action
19 path="/privado"
20 type="[Link]"
21 name="formularioprivado"
22 input="/pages/[Link]"
23 validate="true"
24 >
25 <forwardname="satisfactorio"path="/pages/[Link]"/>
26 <forwardname="error"path="/pages/[Link]"/>
27 </action>

visualizacindelapginaprivadodondesemuestraunformulariodeusuario,

[Link]

109

TUTORIALFRAMEWORKSTRUTS

[Link]
1 <!StandardActionServletConfiguration>
2 <servlet>
3 <servletname>action</servletname>
4 <servletclass>[Link]</servletclass>
5 <initparam>
6 <paramname>config</paramname>
7 <paramvalue>/WEBINF/[Link],/WEBINF/[Link]</paramvalue>
8 </initparam>
9 <loadonstartup>2</loadonstartup>
10 </servlet>

[Link]

110

TUTORIALFRAMEWORKSTRUTS

DESARROLLOWEBCOMODINESSTRUTS

Seguimosconeltutorialdestruts
Pginajspconvariosejemplosdeutilizacindecomodines(wildcard)

Creamosunficherodeconfiguracinstrutsespecficoparaelejemploylointegramos
[Link]
<!StandardAction ServletConfiguration>
1
<servlet>
2
<servletname>action</servletname>
3
<servletclass>[Link]</servletclass>
4
<initparam>
5
<paramname>config</paramname>
6
<paramvalue>/WEBINF/[Link],/WEBINF/[Link],/WEBINF/struts
7
[Link]</paramvalue>
8
</initparam>
9
<loadonstartup>2</loadonstartup>
10
</servlet>

[Link]
1 strutsconfig>
2
3 <!sepuedeaplicaralos>
4 <actionmappings>
5 <actionpath="/enlaces"forward="/pages/[Link]"/>
6 <actionpath="/Primero*"forward="/pages/Wildcard/[Link]"/>
7 <actionpath="/*segundo"forward="/pages/Wildcard/{1}.jsp"/>
8 </actionmappings>
9
10
11 </strutsconfig>

[Link]

111

TUTORIALFRAMEWORKSTRUTS

[Link]
<%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
1
<%@tagliburi="[Link]
2
<%@tagliburi="[Link]
3
<!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
4
"[Link]
5
<html>
6
<head>
7
<metahttpequiv="ContentType"content="text/html;charset=UTF8">
8
<title><bean:messagekey="[Link]"/></title>
9
<html:base/>
10
<linkrel="stylesheet"href="../css/[Link]"type="text/css"/>
11
</head>
12
<body>
13
<divid="contenedor">
14

15

<h2>Enlaces</h2>
16
<divid="contenido">
17

18
<divid="campo">
19
<html:linkaction="PrimeroPaginap1">primerop&aacute;ginap1</html:link>
20
</div>
21

22
<divid="campo">
23
<html:linkaction="Paginap1segundo">p&aacute;ginap1segundo</html:link>
24
</div>
25

26
<divid="campo">
27
<html:linkaction="Paginap2segundo">primerap&aacute;ginap2</html:link>
28
</div>
29

30
</div>
31
<divid="pie">
32
<p>[Link]</p>
33
</div>
34
</div>
35
</body>
36
</html>

Laspginasjspsonsimples,notienenninguncdigoespecial
PGINA1JSP

[Link]

112

TUTORIALFRAMEWORKSTRUTS

PGINA2JSP

[Link]

113

TUTORIALFRAMEWORKSTRUTS

CREACINDEUNPLUGINCONSTRUTSXMLDOM

Tutorialdestrutsparalacreacindeunpluginenstruts
Strutsnospermitelacreacindepluginspropios,enlosdiferentespostutilizabamos
[Link]
pluginsamedidadenuestrasnecesidades
Tenemosunficheroxml,dondetenemosunaestructuraunelementonodoraiz
llamadoplantillayunaseriedenodoshijosllamadosobrero,cadaelementohijo
constadeunatributonombreydoselementossubhijoscargoyedad
1 <?xmlversion="1.0" encoding="UTF8"?>
2 <plantilla>
3 <obreronombre="pepe">
4 <cargo>pen</cargo>
5 <edad>25</edad>
6 </obrero>
7 <obreronombre="juan">
8 <cargo>capataz</cargo>
9 <edad>46</edad>
10 </obrero>
11 <obreronombre="maria">
12 <cargo>pintor</cargo>
13 <edad>38</edad>
14 </obrero>
15 </plantilla>

[Link]
struts.
[Link]
1 <!===============================================PlugInsConfiguration>
2 <pluginclassName="[Link]">
3
4 <setpropertyproperty="direccion"value="/WEBINF/[Link]"/>
5
6
7 </plugin>

Porunladotenemoselnombreeldelaclasedelplugin,enelvalordelatributo
classNameyporotroelvalordelapropiedaddireccinenelqueindicamoslarutaala
direccindelficheroxml
LaclasequeimplementalainterfacePlugin,debeimplementarlosmtodosinity
destroy,sisepasanparmetrosenladeclaracindelpluginenestecasodireccincon
elvalordelarutaalficheroparapoderasignarvaloryrecuperardesdelaclasedel
pluginesnecesariocrearmtodosgetterysetter

[Link]

114

TUTORIALFRAMEWORKSTRUTS

Elrestodelosmtodossonlosencargadosdeleerelficheroxml
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

packageacciones;

[Link];
[Link];

[Link];

[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];
[Link];

[Link];
[Link];
[Link];
[Link];

publicclassPluginEjemploimplementsPlugIn
{

privatestaticfinalStringnombreclase=[Link]();

privateStringdireccion;

privateDocumentdocumento;

privatestaticArrayList<Obrero>listadoObreros=newArrayList<Obrero>();

publicStringgetDireccion(){

returndireccion;

publicvoidsetDireccion(Stringdireccion){

[Link]=direccion;

publicvoidinit(ActionServletservlet,ModuleConfigconfig)throwsServletException

ServletContextcontexto=[Link]();

[Link](nombreclase+"direccion:"+getDireccion());

[Link]

115

TUTORIALFRAMEWORKSTRUTS

55

PluginEjemplopluginejemplo= new PluginEjemplo();


56
57

leerXml(getDireccion(),servlet);
58
59

[Link](nombreclase,pluginejemplo);
60
61
62
}
63
64
65
publicvoidleerXml(Stringdireccion,ActionServletservlet)
66
{
67

DocumentBuilderFactoryfactoria=[Link]();
68
69

try
70

{
71 DocumentBuilderconstructor=[Link]();
72 ServletContextcontexto=[Link]();
73 Stringlugar=[Link](direccion);
74
75
76 documento=[Link](newFile(lugar));
77 [Link]().normalize();
78
79 Nodenodoraiz=[Link]();
80 newArrayList<Obrero>();
81
82 [Link]([Link]());
83
84 nodos(documento);
85
86

}
87

catch(ParserConfigurationExceptionex)
88

{
89

[Link]("nosepuedecrearelDomparser:"+ex);
90

}
91
92

catch(SAXExceptionex)
93

{
94

[Link]("GenerarSaxexcepcin:"+ex);
95

}
96

catch(IOExceptionex)
97

{
98

[Link]("Ioexcepcin:"+ex);
99

}
100
101
102
}
103
104
105
privatevoidnodos(Documentdocumento)
106
{
107
108 NodeListlistadenodos=[Link]("obrero");
109
110

[Link]

116

TUTORIALFRAMEWORKSTRUTS

111 for(inti=0;i< [Link]() ; i++)


112 {
113
Nodenodo=[Link](i);
114
115
Obreroobrero=newObrero();
116
117
if([Link]()==Node.ELEMENT_NODE)
118
{
119

Elementelemento=(Element)nodo;
120
121

[Link]([Link]("nombre"));
122
123

[Link](getValor("cargo",elemento));
124

[Link]([Link](getValor("edad",elemento)));
125
126
}
127
128
[Link](obrero);
129
130
131 }
132 }
133
134 privateStringgetValor(Stringcadenatag,Elementelemento)
135 {
NodeListlistado=
136
137 [Link](cadenatag).item(0).getChildNodes();
Nodenodo=[Link](0);
138
139
[Link]();
140
141 }
142
143
144 publicstaticArrayList<Obrero>getListado()
145 {
returnlistadoObreros;
146
147 }
148
149
publicvoiddestroy()
150
{
151

[Link]("Findelplugin");
152
}
153
154
}

CLASEOBRERO
1
2
3
4
5
6
7
8
9

packagevo;

publicclassObrero{

privateStringnombre;

privateintedad;

privateStringcargo;

publicStringgetNombre(){

[Link]

117

TUTORIALFRAMEWORKSTRUTS

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 }

returnnombre;
}
publicvoidsetNombre(Stringnombre){

[Link]=nombre;
}
publicintgetEdad(){

returnedad;
}
publicvoidsetEdad(intedad){

[Link]=edad;
}
publicStringgetCargo(){

returncargo;
}
publicvoidsetCargo(Stringcargo){

[Link]=cargo;
}

[Link]
1 <action
2
3 path="/crearplugin"
4 type="[Link]">
5
6 <forwardname="satisfactorio"path="/pages/[Link]"/>
7
8
9
10 </action>

Resultadofinal

[Link]

118

TUTORIALFRAMEWORKSTRUTS

INTEGRACINSTRUTSHIBERNATE

Enesteejemploseinsertauntuplaenlabasededatoscreada,conlosdatos
introducidosmedianteunformulariorellenadoporelusuario
Tenemoslatablalibrosdelabasededatoslibros_jdbc,talcomovieneenesteejemplo
[Link]
camposeltitulo,autorylatemticadellibro.
Paraesteejemplonecesitamosparaunmejorentendimientonecesitamosconocer
comosecreaunpluginyaqutenemosunohechocreacindeplugin
Formularioderecogidadedatos

esteformumarioestaasociadoaunaaccinrecogidaenelficherodeconfiguracinde
[Link]
1 <action
2
3 path="/formularioHibernate"
4 type="[Link]"
5 scope="request"
6 name="hibernatelibro"
7 validate="true"
8 input="/pages/[Link]"
9 >
10 <setpropertyproperty="cancellable"value="true"/>
11 <forwardname="listado"path="/pages/[Link]"/>
12 <forwardname="cancelada"path="/pages/[Link]"/>
13 </action>

Sehaexplicadoenotrospostanteriorescadaunodeloselementosqueaparecenen
estaconfiguracin,peroamododerecordatorio,seenumeranlosvaloresdelos
[Link]
[Link]

119

TUTORIALFRAMEWORKSTRUTS

caso(formulariohibernate),estaaccinestarecogidaenunaclase
(AccionHibernateLibro)queeslaencargadadeevaluaryprocesarlosdatos,elname
hacereferenciaalbeanenestecasodinmicoencargadoderecogerlosdatosdel
formulario(hibernatelibro).
Cdigodelbeandinmicoencargadoderecogerlosdatosdelformulario,parapoder
sertratadosporlaclase(AccinHibernateLibro)
1 <formbeanname="hibernatelibro"type="[Link]">
2 <formpropertyname="titulo"type="[Link]"/>
3 <formpropertyname="tematica"type="[Link]"/>
4 <formpropertyname="autor"type="[Link]"/>
5 </formbean>

[Link]
1 <%@pagelanguage="java"contentType="text/html;charset=UTF8" pageEncoding="UTF8"%>
2 <%@tagliburi="[Link]
3 <%@tagliburi="[Link]
4 <!DOCTYPEhtmlPUBLIC"//W3C//DTDHTML4.01Transitional//EN"
5 "[Link]
6 <html:html>
7 <head>
8 <html:base/>
9 <metahttpequiv="ContentType"content="text/html;charset=UTF8">
10 <linkrel="stylesheet"href="../css/[Link]"type="text/css"/>
11 <title><bean:messagekey="[Link]"/></title>
12 </head>
13 <body>
14 <divid="contenedor">
15 <h2><bean:messagekey="[Link]"/></h2>
16 <divid="errores">
17 <html:errors/>
18 </div>
19
20 <divid="imagen">
21 <html:imgsrcKey="[Link]"titleKey="[Link]"/>
22 </div>
23
24 <divid="contenido">
25
26 <html:formmethod="post"action="formularioHibernate"styleId="formulario"focus="titulo">
27
28 <divclass="campo">
29
30 <bean:messagekey="[Link]"/>
31
32 <html:textproperty="titulo"/>
33
34 </div>
35
36 <divclass="campo">
37
38 <bean:messagekey="[Link]"/>

[Link]

120

TUTORIALFRAMEWORKSTRUTS

39
40 <html:textproperty="autor"/>
41
42 </div>
43
44 <divclass="campo">
45
46 <bean:messagekey="[Link]"/>
47
48 <html:textproperty="tematica"/>
49
50 </div>
51
52 <html:submitstyleClass="boton"value="enviar"/>
53 <html:cancelstyleClass="boton"value="cancelar"/>
54 <html:resetstyleClass="boton"value="borrar"/>
55
56
57 </html:form>
58
59 </div>
60
61 <divid="pie">
62 <p>[Link]</p>
63 </div>
64
65 </div>
66 </body>
</html:html>

[Link],creamosunpluginindicandola
claseHibernatePluginylapropiedaddireccinconelvalordelarutadelficherode
configuracindehibernate
1 <!==========Hibernate=======>
2
3
4 <pluginclassName="[Link]">
5
6 <setpropertyproperty="direccion"value="/[Link]"/>
7
8 </plugin>

paracargarelficherodeconfiguracindehibernatecreamosunplugin,comorepaso
tenemosqueextenderdelaclasePluginysobreescribimoslosmtodosdestroyeinit.
Secreaporcomodidadunavariableestticadelaclasellamadaclave_hibernateque
nospermitirrecogerlafactoriadehibernateparapoderinsertar,borrar,editaretc..
1
2
3
4
5
6

[Link];

[Link];
[Link];
[Link];
[Link];

[Link]

121

TUTORIALFRAMEWORKSTRUTS

7 [Link];
8 [Link];
9 [Link];
10 [Link];
11
12
13 publicclassHibernatePluginimplementsPlugIn
14 {
15
privateStringdireccion;
16
17
18
19 publicstaticfinalStringclave_hibernate="Hibernate";
20
21 privateSessionFactoryfactoria=null;
22
23
24 publicStringgetDireccion(){

returndireccion;
25
}
26
27
28 publicvoidsetDireccion(Stringdireccion){

[Link]=direccion;
29
}
30
31
32 publicvoiddestroy(){
33 try
34 {
35 [Link]();
36 }
37 catch(HibernateExceptione)
38 {
39 [Link]("Nosepuedecerrarlasesin:"+[Link]());
40 }
41
42 }
43
44
45
46 publicvoidinit(ActionServletservlet,ModuleConfigconfig)throwsServletException
47 {
48 Configurationconfiguration=null;
49
50 ServletContextcontexto=null;
51
52 try{
53
54 contexto=[Link]();
55 configuration=(newConfiguration()).configure(direccion);
56 factoria=[Link]();
57
58 [Link](clave_hibernate,factoria);
59
60 }catch(HibernateExceptione){
61 [Link]("Errordeinicializacindehibernate:"+[Link]());
62 }

[Link]

122

TUTORIALFRAMEWORKSTRUTS

63
64
65 }
66
67
68 }

cdigodelaclaseencargadaderecogerlaaccin,estaclasecomosolamenterealiza
[Link]
encargadaderecogerlosdatosdelformularioascomodelautilizacinderecuperar
elmanejadordelafactoria.
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

packageacciones;

[Link];
[Link];

[Link];
[Link];
[Link];
[Link];
[Link];
[Link];

[Link];

[Link];
[Link];
[Link];
[Link];
importmodelos.*;
[Link];
[Link];

publicclassAccionHibernateLibroextendsAction{

privateActionForwardreenvio=null;

privateDynaValidatorFormformulario=null;

privateSessionsesion=null;

privateSessionFactoryfactory=null;

privateTransactiontransaction=null;

publicActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse)throwsException

formulario=(DynaValidatorForm)form;

if(isCancelled(request))

[Link]

123

TUTORIALFRAMEWORKSTRUTS

44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

reenvio=[Link]("cancelada");

else

ServletContextcontext=[Link]().getServletContext();

factory=(SessionFactory)
[Link](HibernatePlugin.clave_hibernate);

sesion=[Link]();

try

transaction=[Link]();

Libroslibro=newLibros();

//introducimoslosvaloresparaellibronuevo

[Link]([Link]("titulo"));

[Link]([Link]("autor"));

[Link]([Link]("tematica"));

[Link](libro);

[Link]();

transaction=[Link]();

List<Libros>libros=[Link]("from
Libros").list();

for(Iterator<Libros>iterador=[Link]();
[Link]();)

libro=(Libros)[Link]();

[Link]("titulo:"+[Link]());

[Link]("autor:"+[Link]());

[Link]("tematica:"+[Link]());

[Link]();

[Link]("libros",libros);

reenvio=[Link]("listado");

catch(TransactionExceptione)

[Link]

124

TUTORIALFRAMEWORKSTRUTS

100
101

102 anteriores
103

104

105
106

107

108

109

110

111
112

113
114

//abortamoslatransaccinyrestauramoslosvalores

[Link]();
[Link]();

}
finally
{

//cerramoslasesin
[Link]();

}
returnreenvio;

[Link],XML
<?xmlversion="1.0" encoding="UTF8"?>
1
<!DOCTYPEhibernateconfigurationPUBLIC
2

"//Hibernate/HibernateConfigurationDTD3.0//EN"
3

"[Link]
4
<hibernateconfiguration>
5
<sessionfactory>
6
<propertyname="[Link].driver_class">[Link]</property>
7
<propertyname="[Link]">root</property>
8
<propertyname="[Link]">root</property>
9
<propertyname="[Link]">
10
jdbc:mysql://localhost:3306/libros_jdbc</property>
11
<propertyname="[Link]">[Link].MySQL5Dialect</property>
12
<propertyname="[Link]">update</property>
13

14
<propertyname="show_sql">true</property>
15
<propertyname="format_sql">true</property>
16

17
<mappingresource="modelos/[Link]"/>
18

19
</sessionfactory>
20
</hibernateconfiguration>

[Link]
posthibernatetools
[Link].
estosarchivoslospodemosponerenunpackagepropioporenesteejemplomodelo
haciendoreferenciaalaslasclasesyficherosdeconfiguracinasociadosalastablasde
labasededatos.

[Link]

125

TUTORIALFRAMEWORKSTRUTS

Alejecutarlaaplicacinsenoscreaautomticamenteunaclasebeanconlos
[Link],enestecasounaclaseLibro
Paracrearunficherohbmvamosconlavistahibernatedeeclipseactivadaanew,
[Link]
1 <?xmlversion="1.0"?>
2 <!DOCTYPEhibernatemappingPUBLIC"//Hibernate/HibernateMappingDTD3.0//EN"
3 "[Link]
4 <!Generated26ene20101:33:[Link]>
5 <hibernatemapping>
6 <classname="[Link]"table="libros"catalog="libros_jdbc">
7 <idname="id"type="[Link]">
8 <columnname="id"/>
9 <generatorclass="identity"/>
10 </id>
11 <propertyname="titulo"type="string">
12 <columnname="titulo"length="50"notnull="true"/>
13 </property>
14 <propertyname="autor"type="string">
15 <columnname="autor"length="50"notnull="true"/>
16 </property>
17 <propertyname="tematica"type="string">
18 <columnname="tematica"length="50"notnull="true"/>
19 </property>
20 </class>
21 </hibernatemapping>

Valoresdelosparmetros,tablehacereferenciaalatabladelabasededatos,catalog
hacereferenciaalabasededatos,elprimerparametroidindicamosqueelcampoes
laclaveprimaria,losatributospropertyindicamoselnombredelapropiedadyaque
campodelatablacorrespondeesdecirpodemostenerelcampotituloenlatablayen
lapropiedadtitu_xpordeciralgo,entocesalahoradeusarporcdigoelobjetode
mapeoharamosobjeto.titu_xperoporcomodidadledamoselmismovalorquela
tablaasesmsfcilacordorsedelaspropiedades.
Imagendellistadodellibrounavezguardadolosdatos

[Link]

126

TUTORIALFRAMEWORKSTRUTS

Salidaporpantallaparaverificarlainsercincomoconsecuenciadeactivarenel
[Link].xmlelparmetroshow_sqlyformat_sql
1 INFO:Tilesdefinitionfactoryfoundforrequestprocessor''.
2 Hibernate:
3 insert
4 into
5 libros_jdbc.libros
6 (titulo,autor,tematica)
7 values
8 (?,?,?)
9 Hibernate:
10 select
11 libros0_.idasid0_,
12 libros0_.tituloastitulo0_,
13 libros0_.autorasautor0_,
14 libros0_.tematicaastematica0_
15 from
16 libros_jdbc.libroslibros0_
17 titulo:titulo3
18 autor:autor3
19 tematica:tematica3

[Link]

127

También podría gustarte