You are on page 1of 15

Manual Básico de Struts

Autor: Javier Antoniucci

Introducción • ¿Qué es Struts? • ¿Cómo funciona esto en aplicaciones Web? • ¿Para qué sirve? • ¿ icencia? • ¿! para qué este manual b"sico? • ¿#ónde encuentro m"s info?

Introducción
¿Qué es Struts?
$s un frame%or& que implementa el patrón de arquitectura '(C en Java )n frame%or& es la e*tensión de un len+ua,e mediante una o m"s ,erarqu-as de clases que implementan una funcionalidad . que /opcionalmente0 pueden ser e*tendidas1 $l frame%or& puede involucrar 2a+ ibraries1 $l patrón de arquitectura '(C /'odel3(ie%3Controller0 es un patrón que define la or+ani4ación independiente del 'odel /5b,etos de 6e+ocio07 la (ie% /interfa4 con el usuario u otro sistema0 . el Controller /controlador del %or&flo% de la aplicación8 9si esto. aqu- . me piden esto entonces :acer tal cosa7 si sale bien mostrar esto . sino lo aquello otro901

el %or&flo% de la aplicación se puede pro+ramar desde un arc:ivo .o ob.' as acciones que se e. llamar al Action correspondiente pas"ndole los par"metros enviados1 $l Action instanciar" . ampliar o modificar7 . si+uiendo el patrón >acade1 ! la +eneración de interfa4 se soporta mediante un con. ló+ica de ne+ocio permitiendo desarrollar ambas en paralelo o con personal especiali4ado1 2ambién es evidente que potencia la reutili4ación7 soporte de m=ltiples interfaces de usuario /Btml7 sBtml7 Wml7 #es&top applications7 etc10 . bien lo que es la +estión del %or&flo% de la aplicación7 del modelo de ob.ecutar"n sobre el modelo de ob.etos de ne+ocio para concretar la tarea1 Se+=n el resultado que retorne el Action7 el Controller derivar" la +eneración de interfa4 a una o m"s JSPs7 las cuales podr"n consultar los ob.etos de ne+ocio . de perfomance /poolin+ de 2a+s7 cac:in+7 etc01 o+-sticamente7 separa claramente el desarrollo de interfa4 del %or&flo% .etivo es evitar el uso de Scriplets /los tro4os de códi+o Java entre 9?@9 .a se encuentra implementado por Struts7 aunque si fuera necesario se puede :eredar .etos del 'odel a fines de reali4ar su tarea1 ¿ ara !ué sir"e? $videntemente7 como todo frame%or& intenta7 simplifica notablemente la implementación de una arquitectura se+=n el patrón '(C1 $l mismo separa mu.o la licencia 9free3to3use3license9 de la Apac:e Soft%are >oundation /ver :ttp8<<%%%1apac:e1or+< IC$6S$3C1C0 . de m=ltiples idiomas7 localismos7 etc1 ¿#icencia? Struts est" disponible ba.' . 9@A907 lo cual +enera venta.<o utili4ar" los ob.etos de ne+ocio se implementan bas"ndose en clases predefinidas por el frame%or& .¿Cómo funciona esto en aplicaciones Web? $l nave+ador +enera una solicitud que es atendida por el Controller /un Servlet especiali4ado01 $l mismo se encar+a de anali4ar la solicitud7 se+uir la confi+uración que se le :a pro+ramado en su .unto de 2a+s predefinidos por Struts cu. de la +eneración de interfa41 $l controlador .as de mantenibilidad .

a&arta1apac:e1or+<struts<EInvolved F=squedas en %%%1+oo+le1com poniendo como primera palabra Struts1 .¿$ para !ué este manual básico? Para simplificar el 9first touc:9 . est"n disponibles en las direcciones que se mencionan en la sección 9¿#ónde encuentro m"s info?9 ¿%ónde encuentro más info? • • • • • • :ttp8<<.+uru1com<faq<Struts :ttp8<<.+uru1com<forums<Struts :ttp8<<. para e*plicar Struts desde el punto de vista del desarrollo de aplicaciones Web1 6o pretende ser un tutorial7 una +u-a del usuario ni un manual de referencia1 $llos .a&arta1apac:e1or+<struts<userDuide :ttp8<<.a se :an escrito .a&arta1apac:e1or+<struts<api<inde*1:tml :ttp8<<.a&arta1apac:e1or+<struts :ttp8<<.

ActionForm form.get/assword(#* tr0 { 1ata!ource data!ource ) servlet. ttp!ervlet"equest request.get+sername(#* !tring password ) ((LogonForm# form#. donde se debe soportar todos los requisitos funcionales del Sistema sin me4clarlo con partes correspondientes al %or&flo% /el 9%:at to do90 que corresponden al Controller1 Action Bean Deneralmente7 los Action Beans siempre reali4an las si+uientes acciones8 C1 5btener los valores necesarios del Action Form7 JavaBean7 request7 session o de donde sea1 H1 lamar a los ob.5L&BAL6'""&".add(Action'rrors.emplo de Action Bean8 public final class LogonAction extends Action { public ActionForward perform(ActionMapping mapping.get2onnection(#* 3 catc$ (!4L'xception e# { errors.etos de ne+ocio del 'odel1 I1 Anali4ar los resultados7 . new . se+=n los mismos retornar el Action>or%ard correspondiente1 (eamos entonces un e.Manual Básico de Struts Autor: Javier Antoniucci • 'odel • • • • • Intro Action Fean S. !ervlet'xception { (( &bteniendo atributos Locale locale ) getLocale(request#* Message"esources messages ) get"esources(#* +ser user ) null* (( . ttp!ervlet"esponse response# t$rows %&'xception.alidando los par-metros Action'rrors errors ) new Action'rrors(#* !tring username ) ((LogonForm# form#.stem State Feans Fusiness o+ic Feans Accediendo a F# Model Intro $l 'odel comprende todos los 5b.find1ata!ource(null#* 2onnection m02onnection ) data!ource.etos de 6e+ocio donde se implementa la ló+ica de ne+ocio /el 9:o% itGs done90 .

pr"ctico1 $ste es un e.emplo8 el carrito de la compra que el usuario va modificando a lo lar+o de su interacción con la aplicación1 $stos ob.getAttribute(##* else session.etos de ne+ocio no debiera tener nin+=n conocimiento de la (ie% o el Controller de forma que debieran ser perfectamente reutili4ables para implementar soporte a distintas interfaces .get%nput(###* 3 +serFactor0 userFactor0 ) new +serFactor0(database#* user ) userFactor0.findForward(7success7##* 3 3 S&stem State Beans os S.get%nput(###* 3 (( 5uardando el usuario en la sesion ttp!ession session ) request.setAttribute(2onstants.missing7##* save'rrors(request.add(Action'rrors. user#* (( 'liminando el form bean obsoleto if (mapping. errors#* return (new ActionForward(mapping.emplo de acceso a una cone*ión desde un Action8 .unto de ob.etos de ne+ocio que representan el estado actual del sistema7 por e.get!ession(#* session.Action'rror(7error.utili4arlo o pasarlo al 'odel1 'u.+!'"68'9.password.removeAttribute(mapping.etos de ne+ocio ser"n t-picamente JavaFeans o $JFs de los que se +uardar" referencia en la sesión del usuario7 que ser"n modificados desde los Action . errors#* return (new ActionForward(mapping.etos no debiera tener nin+=n conocimiento de la (ie%1 Business#o'ic Beans os ob.getAttribute(# :) null# { if (7request7.etos de ne+ocio son los que implementan la ló+ica de ne+ocio7 el cómo :acer las cosas .mismatc$7##* save'rrors(request.stem State Feans son el con.removeAttribute(mapping.database.get!cope(### request.equals(mapping. :asta para incluirse en nuevas aplicaciones1 Accediendo a B% Con Struts se puede definir un datasource para una aplicación desde el struts(confi')*ml /m"s información en la sección 92:e Action 'appin+s Confi+uration >ile9 del 9Struts )ser 'anual901 $ste datasource nos permite obtener una connection desde un Action . password#* if (user )) null# { errors. desde all.get+ser(username. su propia persistencia1 $stos ob. new Action'rror(7error.getAttribute(##* 3 (( /asando el control a la siguiente p-gina return (mapping.5L&BAL6'""&". que ser"n consultados desde las JSPs1 $sta clase de ob.

public ActionForward perform(ActionMapping mapping.sql. ActionForm form.... tr0 { data!ource ) servlet.log(72onnection. e#* 3 3 3 .close7..process7. ttp!ervlet"esponse response# { .ava..1ata!ource data!ource* .find1ata!ource(null#* m02onnection ) data!ource.2onnection m02onnection* .close(#* 3 catc$ (!4L'xception e# { get!ervlet(#..avax. sqle#* 3 finall0 { . tr0 { m02onnection. 3 catc$ (!4L'xception sqle# { get!ervlet(#.sql. ttp!ervlet"equest request.get2onnection(#* .log(72onnection.

$eader)Bienvenido a la 1emo de !truts en A/L%2A2%&< ... =init?param> =param?name>application=(param?name> =param?value>com.empresa. =taglib> =taglib?uri>(@'B?%<F(struts?bean. los servlets involucrados en la +eneración de la interfa4 de usuario o con otros Sistemas1 Struts provee soporte para construir aplicaciones multi3 idioma7 interacción con formularios .aplicacion. application.title) 1emo de !truts en A/L%2A2%&< index. valores con el formato clave1subclaveKte*to de los te*tos que pertene4can al idioma principal1 $.8 'iAplicacion1properties0 en el directorio donde se encuentren las clases de la aplicación /e.emplo8 =servlet> =servlet?name>action=(servlet?name> ..8 'iAplicaciónLen1properties01 I1 $n struts(confi')*ml se debe confi+urar el 2a+ <servlet<init3param<param3name application . H1 Para cada idioma alternativo se crear" un arc:ivo nuevo que se llame i+ual pero que termine en 9L**1properties9 siendo ** el códi+o IS5 de idioma /e.8 d8JcomJempresaJaplicacion0 donde se conten+an las claves ..tld=(taglib?uri> ..emplo8 . ponerle como param3value la locali4ación del arc:ivo con el idioma principal1 $. Intro a (ie% comprende las JSP /principalmente0 . otras utilidades mediante la utili4ación de 2a+s especiales /2a+ ibraries01 Internacionali-ación o podemos abreviar en la si+uiente receta8 C1 Crear un arc:ivo de te*to /e.MiAplicacion=(param?value> =(init?param> ...... M1 $n %eb1*ml deberemos inclur8 =web?app> .Manual Básico de Struts Autor: Javier Antoniucci • (ie% • • • • Intro Internacionali4ación >orms 2a+s +ie.

...=taglib?location>(@'B?%<F(struts?bean.tld7 prefix)7bean7 A> .o /aunque en realidad no lo mere4can0 es la interacción con formularios7 ... =(web?app> N1 $n las JSPs donde utilicemos la internacionali4ación deberemos incluir al comien4o8 .. +eneración de mensa....util. language## donde countr.o bean .o de +eneración de interfa4 en la<s JSP1 (eamos la receta8 C1 Crear el Action>orm /ver la sección 'odel < Action>orm Feans0 H1 Crear la p"+ina JSP del formulario utili4ando los 2a+s que provee Struts /ver la sección (ie% < 2a+s01 $.. para declarar que utili4aremos la 2a+ ibrar. subclave corresponden al te*to por el que se reempla4ar" se+=n el idioma del usuario1 $.es de error .o de comprobaciones .ava. =$tmlCform action)7(logon7 focus)7username7> .es de error se implementa en los Action>orm .Hse<C1I<docs<+uide<intl< .. =$tmlC$tml> . new .orms )na de las tareas que durante el desarrollo de una aplicación insume muc:o traba..ava1sun1com<.. =AB taglib uri)7(@'B?%<F(struts?bean. definida en <W$F3I6><struts3bean1tld O1 ! finalmente7 utili4aremos el 2a+ =beanCmessage De0)7clave. todo el traba. =AB taglib uri)7(@'B?%<F(struts?bean. .tld7 prefix)7bean7 A> =AB taglib uri)7(@'B?%<F(struts?$tml.L&2AL'68'9.Locale(countr0. :asta formato de datos1 Para m"s información ver la documentación oficial de Sun disponible en :ttp8<<.subclave7(> donde clave . un lar+o etcétera est"n soportadas por Struts a fines de :acernos la vida un poco m"s f"cil1 a idea es la si+uiente8 todo el traba.tld=(taglib?location> =(taglib> ...emplo8 . =E%EL'>=beanCmessage De0)7application.. Por defecto Struts asi+na a cada usuario el idioma principal de la aplicación1 Si se utili4a el ta+ =$tmlC$tml locale)7true7> /reempla4a a 9=$tml>9 .tld7 prefix)7$tml7 A> .emplo . los mensa.title7(>=(E%EL'> .setAttribute( Action.a sea para editar u obtener nueva información1 as comprobaciones7 la +estión de errores7 el volver a presentarle el mismo form al usuario con los valores que puso . lan+ua+e ser"n el strin+ del pa-s e idioma a establecer1 Adem"s de te*to podran incluirse variables /al i+ual que se :ace en los println0 . debe cerrarse con 9=($tmlC$tml>90 entonces se utili4ar" el primero de los idiomas soportados por la aplicación que se encuentre en el :eader 9Accept3 an+ua+e9 enviado por su nave+ador1 Pero si se desea proponerle al usuario una lista de idiomas entonces éste podr" cambiarse mediante session. struts3bean con el prefi.

sp71 $.username7(> =$tmlCtext propert0)7username7 siIe)7FJ7 maxlengt$)7FJ7(>=(p> =p>=beanCmessage De0)7logon....LogonForm7(> ..empresa.7 etc10 que a su ve4 se debe declarar en el %eb1*ml /dentro de =web?app> se pone =taglib> =taglib?uri> nombreEagLib =(taglib?uri> =taglib? location>(directorios(nombreArc$ivo. =($tmlCform> .oEagLibCnombreEag atributo)valor . =$F>=beanCmessage De0)7logon....aplicacion.mainEext7(>=($H> =p>=beanCmessage De0)7logon.... en la declaración del Action /ver la sección Controller < Action Feans0 a+re+ar los atributos name)7nombreForm77 scope)7(request K session#77 e input)7paginaForm..sp7> . =(form?beans> ....clase7(> .. setters correspondientes a sus atributos1 $sta clase se define en un 2a+ ibrar.07 que implementa su funcionalidad en los métodos do!tartEag(#7 do'ndEag(#7do%nitBod0(#7 doAfterBod0(# /los dos =ltimos sólo en las que e*tienden Bod0Eag!upport07 adem"s de los +etters ... =form?bean name)7logonForm7 t0pe)7com...emplo8 =struts?config> .. =action pat$)7(logon7 t0pe)7com..aplicacion. =($tmlC$tml> I1 #eclarar el Action>orm en struts(confi')*ml a+re+ando en <struts3confi+<form3beans el ta+ =form?bean name)7nombreForm7 t0pe)7paquete.LogonAction7 name)7logonForm7 scope)7request7 input)7(logon. =action?mappings> . =(struts?config> /a's F"sicamente7 un 2a+ de JSP consiste en un 2a+ con formato =prefi.password7(> =$tmlCpassword propert0)7password7 siIe)7FJ7 maxlengt$)7FJ7 redispla0)false(>=(p> =p>=$tmlCsubmit propert0)7submit7 value)7!ubmit7(>=(p> =p>=$tmlCreset(>=(p> .. =action?mappings> ..tld =(taglib?location> .. =form?beans> ..$eader7(>=($F> =$tmlCform action)7(logon7 focus)7username7> =$G>=$tmlCerrors(>=($G> =$H>=beanCmessage De0)7logon. > que cuando la JSP se compila es sustitu-do por una llamada a la clase 2a+Bandler que se encar+a de resolver su funcionalidad1 $l 2a+Bandler e*tiende Bod0Eag!upport o Eag!upport /se+=n si es un ta+ que tiene bod. =(action> . #efinition /arc:ivo *ml con e*tensión 2 # donde se define el nombre del ta+7 la clase 2a+Bandler que lo atiende7 la definición de sus atributos7 si tiene bod...empresa.

oEagLib7 A>01 >inalmente7 el 2a+ que se usa en la JSP consiste en =prefi.sp<ta+libraries1:tml1 a funcionalidad de los 2a+s inclu-dos en Struts se encuentran documentados en8 • • • • :tml8 :ttp8<<.1:tml as clases 2a+Bandlers que implementan dic:a funcionalidad est"n documentadas en8 • • • • ..a&arta1apac:e1or+<struts<struts3:tml1:tml bean8 :ttp8<<. >1 Para m"s info7 ver la p"+ina oficial de Sun sobre 2a+ ibraries en :ttp8<<.a&arta1apac:e1or+<struts<struts3lo+ic1:tml nested8 :ttp8<<.a&arta1apac:e1or+<struts<api<or+<apac:e<struts<ta+lib<lo+ic<pac&a+e3 summar. en la JSP donde se utili4ar" /=AB taglib uri)7nobreEagLib7 prefix)7prefi.1:tml nested8 :ttp8<<.oEagLibCnombreEag atributo)valor .ava1sun1com<products<.a&arta1apac:e1or+<struts<api<or+<apac:e<struts<ta+lib<bean<pac&a+e3 summar.a&arta1apac:e1or+<struts<struts3bean1:tml lo+ic8 :ttp8<<.a&arta1apac:e1or+<struts<struts3nested1:tml :tml8 :ttp8<<.a&arta1apac:e1or+<struts<api<or+<apac:e<struts<ta+lib<:tml<pac&a+e3 summar.1:tml bean8 :ttp8<<.1:tml lo+ic8 :ttp8<<.a&arta1apac:e1or+<struts<api<or+<apac:e<struts<ta+lib<nested<pac&a+e3 summar..=(taglib>0 .

..Manual Básico de Struts Autor: Javier Antoniucci • Controller • Intro • Action>orm Feans Controller Intro $l Controller comprende la funcionalidad involucrada desde que un usuario +enera un est-mulo /clic& en un lin&7 env-o de un formulario7 etc10 :asta que se +enera la interfa4 de respuesta1 $ntre medio7 llamar" a los ob. =(form?beans> .ecutar" (index.... el o los forwards necesarios1 Por e.empresa...LogonForm7(> . =action pat$)7(logoff7 t0pe)7com.apac$e.. =(action?mappings> .emplo8 =struts?config> .LogoffAction7> =forward name)7success7 pat$)7(index. =form?bean name)7logonForm7 t0pe)7com.e un servlet que a partir de la confi+uración de struts3confi+1*ml recibe las solicitudes del usuario7 llama al Action Fean que corresponda ... =action?mappings> . =global?forwards> .. se+=n el resultado de la misma e.action. si esta retorna un Action>or%ard con valor success entonces e.ecutar" la JSP que deba +enerar la interfa4 resultante1 Struts inclu..a el nuevo action mappin+ .Action1 (er sección 9Controller Action Fean91 H1 Confi+urar el struts(confi')*ml para que inclu. sus posibles for%ards de salida1 Por e.aplicacion.7 se+=n lo que éste retorne7 e.empresa.aplicacion..sp7(> =(action> .sp1 Pero111 ¿qué pasa si es una acción asociada a un formulario? a respuesta es un poco m"s comple.a8 se debe definir un Form Bean7 un Action Mapping con el Form Bean asociado ....emplo8 =struts?config> ..etos de ne+ocio del 'odel para que resuelvan funcionalidad propia de la ló+ica de ne+ocio . =(struts?config> $n este caso7 cuando la solicitud sea 9(logoff9 el Controller llamar" a o+offAction .. =form?beans> .ecuta una JSP1 Por consi+uiente7 las tareas que se deben reali4ar son8 C1 $scribir una clase Action que e*tienda de org.

si no lo encuentra lo crea1 ue+o reali4a un set por cada input del form . =(struts?config> $n este caso se :a definido un +lobal3for%ard que7 como su nombre lo indica7 viene a ser un for%ard que se aplica a todos los action3mappin+s /e*cepto que se re3defina para al+uno en particular01 I1 Incluir los lin&s /preferentemente utili4ando =$tmlClinD>0 o forms /necesariamente utili4ando =$tmlCform>0 necesarios en las JSPs correspondientes1 Action. 3 public !tring get<ombre(# { return (t$is. =(action?mappings> . =action pat$)7(logon7 t0pe)7com. (( 2rear u obtener el ob...eto de ne+ocio entonces se deber-a utili4ar una instancia de éste para efectuarlos1 $. a fines de evitar la duplicación de funcionalidad7 si un desde un ActionForm debe reali4ar controles de validación que se :ubiesen implementado en un ob. que implementan métodos +et ..aplicacion... =(global?forwards> .... finalmente llama al método validate1 Si éste retornara uno o m"s errores7 el Controller llamar-a a la JSP del formulario para que ésta lo volviera a +enerar /con los valores establecidos por el usuario0 e inclu.. lo env-a7 el Controller busca en el scope especificado el ActionForm Fean correspondiente /todo esto confi+urado en el struts(confi')*ml0 .emplo8 public final class 2lienteForm extends ActionForm { private !tring nombre ) null* Action'rrors errors ) null* 2liente cliente ) null* ..sp7> =(action> .. reset1 Cuando un usuario completa un formulario ..empresa.do7(> ... =action?mappings> .eto como sea. cliente ) new 2liente(#* errors ) new Action'rrors* .era el o los mensa. set para cada una de los inputs de un form de una p"+ina7 . =forward name)7success7 pat$)7(mainMenu.nombre#* 3 ..es de error correspondientes1 Si todo estuviese bien7 llamar-a al método perform del Action /también confi+urado en el struts(confi')*ml0 pas"ndole el ActionForm Fean como par"metro para que sea utili4ado para obtener los valores de los datos1 Si bien el ActionForm tienen caracter-sticas que corresponden al 'odel7 los ActionForm pertenecen a la (ie%1 Justamente uno de estos puntos comunes es la validación de datos ...orm Beans os Action>orm Feans son clases que e*tienden Action>orm .LogonAction7 name)7logonForm7 scope)7request7 input)7(logon. los métodos validate ...... public 2lienteForm(# { .

nombre ) nombre* 3 public void reset(ActionMapping mapping.nombre ) null* 3 public Action'rrors validate(ActionMapping mapping. ttp!ervlet"equest request# { 3 3 . set<ombre(!tring nombre##7 ..public void set<ombre(!tring nombre# { tr0 { cliente.nombre7##* 3 t$is.. el Action deber"n ser los mismos7 lo que permitir"7 entre otras cosas7 que los input se puedan reor+ani4ar en distintas p"+inas sin cambiar los Action>orm ni los Action .all entre el usuario & el Action !ue deten'a todo tipo de errores de incompletitud o inconsistencia Si el formulario se desarrolla en varias p"+inas /por e. ttp!ervlet"equest request# { t$is. setters /obli+atoriamente un par por cada input del formP si el input se llama nombre entonces tendremos get<ombre(# .add(7nombre7. return errors* Al momento de escribir un Action>orm debemos tener en mente los si+uientes principios8 • • • • 6o debe tener nada que corresponda a la ló+ica de ne+ocio 6o deber-a tener m"s que implementaciones de +etters .emplo7 en las interfaces de tipo 9Wi4ard9<9Asistentes90 el Action>orm . de los métodos reset . new Action'rror(7error.ire.set<ombre(nombre#* 3 catc$ ('xception e# { errors. validate %ebe ser un .

P0 specification7 C1C o posterior J#FC H1R 5ptional Pac&a+e Classes a instalación consiste en8 C1 5btener la distribución binaria desde :ttp8<<.' Parser compatible con Java API for .. similar en todos los servidores de aplicaciones que provean /o puedan a+re+"rsele0 soporte de8 • • • • • Java #evelopment Qit /version C1H or posterior0 Servlet Container /version H1H or posterior0 JavaServer Pa+es /JSP0 /version C1C o posterior0 . una serie de confi+uraciones por lo que su instalación es mu.struts.Action!ervlet=(servlet?class> =init?param> =param?name>application=(param?name> =param?value>com.a&arta1apac:e1or+<struts<inde*1:tmlEAcquirin+ .' Parsin+ /JA.apac$e. un 9=servlet?mapping>9 que estable4ca las peticiones que éste atiende1 Por e.empresa. #escriptors de los 2a+s de Struts0 en el directorio W$F3I6><lib de la aplicación I1 'odificar el W$F3I6><%eb1*ml de la aplicación para incluir un elemento 9=servlet>9 que define el Servlet del Controller .xml=(param?value> =(init?param> =init?param> =param?name>debug=(param?name> =param?value>L=(param?value> =(init?param> =init?param> =param?name>detail=(param?name> =param?value>L=(param?value> =(init?param> =init?param> =param?name>validate=(param?name> =param?value>true=(param?value> =(init?param> =load?on?startup>L=(load?on?startup> .action. lib0struts(1)tld /2a+ ibrar. descomprimirla H1 Copiar lib0commons(1)2ar /clases comunes de Ja&arta07 lib0struts)2ar /JAS de las clases Struts0 .Application"esources=(param? value> =(init?param> =init?param> =param?name>config=(param?name> =param?value>(@'B?%<F(struts?config. =servlet> =servlet?name>action=(servlet?name> =servlet?class>org.emplo8 =web?app> ..Manual Básico de Struts Autor: Javier Antoniucci • ¿Cómo pon+o en funcionamiento Struts? ¿Cómo pon'o en funcionamiento Struts? Como todo frame%or&7 Struts consiste en una librer-a de clases .aplicacion.

recomendable familiari4arse primero con la confi+uración manual antes de utili4ar estas :erramientas .tld=(taglib?location> =(taglib> =taglib> =taglib?uri>struts tml=(taglib?uri> =taglib?location>(@'B?%<F(struts?$tml.aplicacion....empresa..Application"esources es la locali4ación del arc:ivo 91properties9 del idioma principal de la aplicación M1 'odificar el W$F3I6><%eb1*ml de la aplicación para incluir la definición de los 2a+ ibraries1 Por e. =(web?app> N1 A+re+ar la definición de las 2a+ ibraries en las JSPs que se utilicen1 $.emplo8 =web?app> .do=(url?pattern> =(servlet?mapping> .tld=(taglib?location> =(taglib> =taglib> =taglib?uri>strutsLogic =(taglib?uri> =taglib?location>(@'B?%<F(struts?logic..=(servlet> .emplo8 =AB taglib uri)7strutsBean7 prefix)7bean7 A> =AB taglib uri)7struts tml7 prefix)7$tml7 A> =AB taglib uri)7strutsLogic7 prefix)7logic7 A> O1 Crear un struts(confi')*ml donde se confi+ure el Controller se+=n se describió en las secciones anteriores1 Si bien est"n comen4ando a sur+ir aplicaciones que +estionan la confi+uración de Struts en forma visual /Camino7 StrutsConsole7 etc10 es mu. =(web?app> 3ota8 com. =taglib> =taglib?uri>strutsBean=(taglib?uri> =taglib?location>(@'B?%<F(struts?bean..tld=(taglib?location> =(taglib> =displa0?name>=(displa0?name> =description>=(description> .. =servlet?mapping> =servlet?name>action=(servlet?name> =url?pattern>M..