Struts Java en Eclipse
Struts Java en Eclipse
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()
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´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
[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á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ámico</html:link>
25 </div>
26
27 <divclass="enlace">
[Link]
41
TUTORIALFRAMEWORKSTRUTS
28 <html:linkpage="/pages/[Link]"> 3) formulariodinámico
29 validació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ú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ámicoValidació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
//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
[Link]
1 <%@tagliburi="[Link] prefix="html" %>
2 <p>
3 Ejemplodedesarrolloconstrutstiles,tenemosunaplantillabaseydiferentesdefinicionesde
4 pá[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á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í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ítulo"sortable="true"/>
23 <display:columnproperty="autor"title="autor"sortable="true"/>
24 <display:columnproperty="tematica"title="temá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í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áginap1</html:link>
20
</div>
21
22
<divid="campo">
23
<html:linkaction="Paginap1segundo">páginap1segundo</html:link>
24
</div>
25
26
<divid="campo">
27
<html:linkaction="Paginap2segundo">primerapá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
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
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