Struts 2 O framework Apache framework Apache Struts 2 é é uma estrutura elegante e extensível extensível para a criação de aplicaçõe aplicações s Web em Java. estrutura estrutura foi pro!etada pro!etada visando otim otimi" i"ar ar o cicl ciclo o comp comple leto to de dese desenv nvol olvi vime ment nto# o# desd desde e cons constr truç ução ão a implantaçã implantação o e manutençã manutenção o das aplicações. aplicações. $oi originalmen originalmente te con%ecido con%ecido como WebWork 2 . &epois &epois de trabal%ar trabal%ar de forma independe independente nte durante v'rios v'rios anos# as comunidade comunidades s Struts e WebWork !untaram forças para criar Struts 2 . (sta nova versão é mais simples de usar usar e se aproxima da ideia da )ual o *truts foi concebido para ser.
Versão 1.0 postila destinada destinada ao curso com carga carga %or'ria %or'ria de +, -vinte -vinte %oras %oras
Curso Struts 2
Sumário 1. Struts 2...................................................................................................................................3 Características do Struts 2.....................................................................................................3 Projeto Simplificado...........................................................................................................3 Classes de Ações Simplificadas........................................................................................3 Não eistem mais os Actio!"orms....................................................................................3 Padrões i!teli#e!tes..........................................................................................................3 $el%ores características das &a#......................................................................................' No(os )etal%es..................................................................................................................' Cria!do um *ello +orld em Struts 2.....................................................................................' Criação de estrutura de diret,rios para o projeto..............................................................' 2. Co!fi#urações........................................................................................................................ Arui(o /e.ml..................................................................................................................... Arui(o struts.ml................................................................................................................... Arui(o strutsco!fi#.ml.......................................................................................................4 Arui(o struts.properties................................................................................................ ........5 ........ 5 3. Actio!s....................................................................................................................................6 Camada Actio!.......................................................................................................................6 Camada Visão......................................................................................................................10 '. &emplates.............................................................................................................................12 -. Aja com Struts....................................................................................................................1' 7mpleme!tação de 8a!ela de 9o#i! com o Aja :);8;<.....................................................1' . Validação e Co!(ersão........................................................................................................14 Validação..............................................................................................................................14 Co!(ersão............................................................................................................................20 4. Struts e Spri!#......................................................................................................................25. "ormul=rio $aster>)etail......................................................................................................25
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
2 de 31
Curso Struts 2
1. Struts 2 ?m framework @ respo!s=(el por automatiar as tarefas mais comu!s e for!ecer uma plataforma !a ual os usu=rios criam rapidame!te seus aplicati(os. Struts 2 foi aseado !o WebWork. 7mpleme!ta o padrão de projeto $odelo B Visão B framework OpenSymphony WebWork Co!trole :$VC B $odelVie/Co!trol<. m Struts 2 o modelo de eiiçãoD e o co!trolador são impleme!tadas pelo resultado da ação de um FilterDispatcher :ue :ue real reali ia a o tra traal al%o %o do co!t co!tro rola lado dor< r<.. ; traa traal% l%o o do Co!trolador @ mapear a solicitação do usu=rio e tomar as medidas caí(eis. A camada de $odelo co!t@m os dados e a l,#ica de !e#,cios ue @ impleme!tado pelo compo!e!te de ação. A camada de (isão @ o compo!e!te de aprese!tação ue @ comume!te impleme!tado usa!d usa!do o os padrõe padrõess JSPD Velocity TemplateD Freemaker ou ou ualuer outra tec!olo#ia de aprese!tação.
Características do Struts 2 Projeto Simplificao Pro#ramação das classes astratas em (e de i!terfaces era um prolema do projeto do Struts ! ue ue foi foi reso resol( l(id ido o !o Struts 2. A maioria das classes a#ora são aseadas em i!terfaces e !a maioriaD essas i!terfaces são o !Ecleo i!depe!de!te de *&&P. As classes "ctions do Struts 2 são uma estrutura i!depe!de!te e simplificada para o uso com POJOs simples. #lasses e "$%es Simplificaas As classes "ctions a#ora são simples P;8;s. Fualuer classe 8a(a ue possua o m@todo e&ecute'( pode ser usada como uma classe !o modelo "ction. Não !ecessita impleme!tar ualu ualuer er i!terf i!terface ace.. A 7!(ers 7!(ersão ão de Co!tr Co!trole ole :7oC< :7oC< a#ora a#ora @ automa automatic ticam ame!t e!te e i!trod i!trodui uida da dura!te o dese!(ol(ime!to das classes "ctions. )*o e&istem mais os "ctionForms Struts ts 2. Se!d A característica dos "ctionForms !ão @ mais ais reco reco!% !%ec ecid ida a para ara o Stru Se!do o sus sustititu tuíd ídas as por por simp simple less Ja+a,ean ue são utili utiliado adoss para para coloc colocar ar as propri proprieda edades des diretame!te. Não @ preciso usar todas as propriedades. Par%es inteli-entes ;s eleme!tos de co!fi#uração possuem um (alor padrão ue pode ser defi!ido de acordo com a !ecessidade. Ai!da eistem arui(os aseados em padrão G$9 de co!fi#uração ue pode ser sustituído de acordo com a !ecessidade. Ao co!tr=rio dos "ctionFor.arsD os /esults for!ecem uma maior fleiilidade para criar mEltiplos tipos de saídas.
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
3 de 31
Curso Struts 2
0elhores caracter1sticas as Ta A#ora as ta-s permitem adicio!ar capacidades de estilo sheetri+enD para ue possamos criar p=#i!as mais co!siste!tes e com me!os c,di#o. As ta-s são mais capaes e orie!tada para resultados. Podem ser ser alteradas para uma fol%a de estilo sujace!te. A marcação i!di(idual da ta- pode ser alterada edita!do um modelo Free0arker . )o+os Detalhes ?tiliação de a!otações 8a(a - como uma alter!ati(a para G$9 e co!fi#uração de propriedades 8a(a. ; compo!e!te #heckbo& !ão !ecessita mais de um tratame!to especial para os (alores falsos. $uitas muda!ças podem ser feitas !a %oraD sem a !ecessidade de rei!iciar o co!tHi!er /e.
Criando um Hello World em Struts 2 Vamos dese!(ol(er a aplicação tipo I;l= $u!doJ usa!do o framework Struts 2. Nossa aplicação ser= o primeiro passo para ue possamos compree!der as modificações ue ocorreram com este framework .
#ria$*o e estrutura e iret3rios para o projeto Kealiar o do/!load do Struts 2 e c,piar o arui(o struts2blank245464.ar para o diret,rio .ebapps do Tomcat. Ke!omear o arui(o struts2blank245464.ar para struts2tutorial4rar e descompact=lo. A#ora i!icie o Tomcat e acesse o e!dereço http://localhost:8080/struts2tutorial/
No seu !a(e#ador mostrar=
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
' de 31
Curso Struts 2
2. Configurações A Co!fi#uração =sica !ecess=ria para o framework Struts 2 depe!de da co!fi#uração dos se#ui!tes arui(os struts4&mlD .eb4&mlD strutsconfi-4&ml e struts4properties.
Arquivo web.xml ; arui(o de co!fi#uração .eb4&ml @ um arui(o de co!fi#uração Ja+a 77 ue determi!a como os eleme!tos da solicitação *&&P são processados pelo servlet container . Não @ estritame!te um arui(o de co!fi#uração do Struts 2D mas @ um arui(o ue precisa ser co!fi#urado para ue o Struts 2 possa traal%ar corretame!te. ste arui(o for!ece um po!to de e!trada para ualuer aplicação +e. ; po!to de e!trada de uma aplicação Struts 2 ser= um filtro defi!ido !o descritor de deplo/ment . )esta formaD (amos defi!ir uma e!trada de classe $ilter&ispatc%er !o arui(o .eb4&ml. ; arui(o .eb4&ml de(e ser criada so a pasta Web#ontent8W7,9)F. Vejamos um eemplo do arui(o .eb4&ml
Para mapear o filtro do Struts 2D usamos 8:D e !ão 8:4action o ue si#!ifica ue todas as urls serão a!alisadas pelo filtro do Struts.
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
- de 31
Curso Struts 2
Arquivo struts.xml ; arui(o struts4&ml co!t@m as i!formações de co!fi#uração ue de(emos modificar como as ações ue são dese!(ol(idas. ste arui(o pode ser usado para sustituir as co!fi#urações padrões de um aplicati(oD por eemplo struts.dev(ode = 3alse
outras co!fi#urações ue são defi!idas !o arui(o de propriedades. ste arui(o pode ser criado !a pasta W7,9)F8classes. Vejamos um eemplo do arui(o struts4&ml elloorldction" method="execute"#
elloorld.+sp
A primeira coisa a !otar @ o eleme!to );C&LP. &odo o arui(o ;0< !ecessita ter um eleme!to octype corretoD co!forme mostrado !o c,di#o. =struts> @ a ta# raiD !o ual podemos declarar difere!tes pacotes usa!do a ta# =packa-e>D isso permite a separação e a modulariação da co!fi#uração. ; ue (em a ser muito Etil ua!do temos um #ra!de projeto di(idido em difere!tes partes. )i#amos ueD seu projeto possua trHs domí!ios Ne#ocioD Clie!te e PessoalD e!tão podemos criar trHs pacotes e armae!ar as ações associadas !o pacote apropriado. A ta# =packa-e> possui os se#ui!tes atriutos "tributo
Descri$*o
name :ori#at,rio<
; ide!tificador eclusi(o para o pacote Nome do pacote %erdado. Por padrãoD usamos strutsefaultD como o pacote ase Se marcado como ItrueJD o pacote !ão est= dispo!í(el para o usu=rio fi!al Nome E!ico para as ações
extends abstract namespace
A ta# =constant> ju!tame!te com os atriutos !ome e (alor são usados para sustituir ualuer uma das se#ui!tes propriedades defi!idas !o efault4propertiesD como acaamos de defi!ir !a propriedade struts4e+0oe. )efi!ir esta propriedade permite (er as SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
de 31
Curso Struts 2
me!sa#e!s de depuração !o arui(o de lo#. )efi!imos as ta#s =action> correspo!dete a cada ?K9 ue desejamos acessar e defi!imos uma classe com m@todo e&ecute'( ue @ acessado ao acessarmos a ?K9 correspo!de!te. A ta# =result> determi!a o ue @ retor!ado para o !a(e#ador ap,s uma ação for eecutada. A ação retor!a um ojeto do tipo Stri!# ue co!t@m o !ome de um resultado. ssas ta#s são co!fi#uradas por ação ou como um resultado M#loalMD dispo!í(el para cada ação em um pacote. ;s resultados tHm !ome opcio!al e atriutos de tipo. ?samos a Stri!# M sucess M como o !ome de (alor padrão . ; arui(o struts4&ml pode ficar muito #ra!de ao lo!#o do tempoD e!tão @ possí(el uer=lo por pacotesD o ue @ uma forma de modulariarD mas a Struts 2 oferece uma !o(a ma!eira de modulariar o arui(o struts4&ml. possí(el di(idilo em (=rios arui(os ;0< e import= los da se#ui!te forma
Arquivo struts-coni!.xml" ; arui(o de co!fi#uração strutsconfi-4&ml @ a li#ação e!tre a Visão e os compo!e!tes do modelo !o Clie!te +e. Co!t@m os se#ui!te eleme!tos pri!cipais 9nterceptor
Descri$*o
N, rai do arui(o de co!fi#uração. 9ocal para mapear sua suclasse "ctionForm. Podese usar este !ome form0bean como um alias para a Actio!"orm todo o resto do arui(o struts co!fi#.mlD e at@ mesmo !as p=#i!as 8SP. sta seção mapeia uma p=#i!a em seu /eapp para um !ome. Podese global forwards usar este !ome para se referir O p=#i!a real. 7sso e(ita codificar ?K9s em suas p=#i!as +e. action0mappings )eclaração do ma!ipuladores de formul=rios e o!de tam@m são co!%ecidos como mapeame!tos de ação. sta seção co!fi#ura as i!ter!as do Struts e rarame!te @ usada em controller situações pr=ticas. sta seção i!forma ao Struts o!de e!co!trar seus arui(os de plug0in propriedadesD ue co!tHm i!struções e me!sa#e!s de erro struts0config
Vejamos um eemplo do arui(o strutsco!fi#.ml SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
4 de 31
Curso Struts 2
Arquivo struts.properties ste arui(o de co!fi#uração for!ece um meca!ismo para alterar o comportame!to padrão do framework . &odas propriedades co!tidas !este arui(o tam@m podem ser co!fi#uradas !o .eb4&ml usa!do o paraminitD em como usa!do a ta# =constant> !o arui(o struts4&ml. Para ma!ter os detal%es separados e um suporte mais específicoD podemos criar este arui(o !a pasta W7,9)F8classes. ;s (alores co!fi#urados !este arui(o sustituem os (alores padrões co!fi#urados em efault4properties ue estão co!tidos !a distriuição struts2core&4y4?4jar . istem propriedades ue podem ser modificadas usa!do o arui(o struts4properties EEE o ser de3inido como verdadeiroF mostra as mensagens padrGes struts.dev(ode = true EEE 9ermite a releitura dos arHuivos de internacionaliCaIJo struts.i18n.reload = true EEE 9ermite a releitura dos arHuivos de con3iguraIJo '() struts.con3iguration.xml.reload = true EEE e3ine a porta Hue o servidor K executado struts.url.http.port = 8080
A li!%a i!iciada com com o caracter IJD ser= assumida como um come!t=rio e i#!orada pelo Struts 2. SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
5 de 31
Curso Struts 2
3. Actions "ctions são o po!to ce!tral do framework Struts 2D em como para ualuer framework modelo 0V# :$odel Vie/ Co!troller<. Cada ?K9 @ mapeada para uma action específicaD
ue for!ece a l,#ica de processame!to !ecess=ria para ate!der O solicitação do usu=rio. "ctions possuem duas outras capacidades importa!tes. PrimeiroD uma action desempe!%a um papel importa!te !a tra!sferH!cia de dados a partir do pedido atra(@s do po!to de (istaD se o seu tipo um 8SP ou outro resultado. m se#u!do lu#arD o recurso de(e ajudar o uadro para determi!ar ual resultado de(e tor!ar a (isão de ue ser= de(ol(ido !a resposta ao pedido.
Camada Action ; E!ico reuisito para as actions em Struts 2 @ ue de(e %a(er um m@todo sem ar#ume!to ue retor!a um ojeto Stri!# ou um eleme!to /esult e de(e ser um P;8;. Se o m@todo !ãoar#ume!to !ão for especificadoD o comportame!to padrão @ usar o m@todo e&ecute'(. ;pcio!alme!teD podese este!der a classe "ctionSupport ue impleme!ta seis i!terfacesD i!clui!do a i!terface "ction. sta i!terface @ mostrada como se se#ue pu%lic inter3ace ction L pu%lic static 3inal *tring *U77** = "success"B pu%lic static 3inal *tring 6 = "none"B pu%lic static 3inal *tring MM6M = "error"B pu%lic static 3inal *tring 9U = "input"B pu%lic static 3inal *tring )6@ = "login"B pu%lic *tring executeNO thro$s xceptionB P
Vamos dar uma ol%ada !o m@todo de ação para um eemplo M*ello +orldM pacage x2-.com.tutorialB pu%lic class >elloorldctionL private *tring nameB pu%lic *tring executeNO thro$s xception L return "success"B P pu%lic *tring getameNO L return nameB P pu%lic void setameN*tring nameO L this.name = nameB P P
Para ilustrar o po!to ue o m@todo da action co!trola a (isãoD faremos a se#ui!te alteração !o m@todo e&ecute'( e este!der a classe "ctionSupport como se#ue SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
6 de 31
Curso Struts 2
pacage x2-.com.tutorialB import com.opensmphon.x$or2.ction*upportB pu%lic class >elloction extends ction*upportL private *tring nomeB pu%lic *tring executeNO thro$s xception L i3 N"*7M".eHualsNnomeOO L return *U77**B P else L return MM6MB P P pu%lic *tring getomeNO L return nomeB P pu%lic void setomeN*tring nomeO L this.nome = nomeB P P
Neste eemploD temos a se#ui!te l,#ica para o m@todo e&ecute'( de modo a (isualiar o atriuto nome. Se este atriuto for i#ual a MSCK&MD retor!amos S?CSS como o resultadoD caso co!tr=rio retor!amos um KK;K como o resultado. Porue este!demos "ctionSupportD para isso usamos as co!sta!tes S?CSS e KK;K. A#oraD (amos modificar !osso arui(o struts4&ml como se#ue elloction" method="execute"#
elloorld.+sp
Camada #is$o Criamos o arui(o c%amado @elloWorl4jsp !a pasta rai? do seu projeto. ste arui(o ser= c%amado em caso do retor!o ter como resultado MS?CSSMD tal como defi!ido !a i!terface "ction
10 de 31
Curso Struts 2
ello orld
ste outro arui(o ser= c%amado pelo framework !o caso ue o resultado da "ction seja KK;K. A se#uir @ o co!teEdo de "ccessDenie4jsp
&am@m precisamos criar o arui(o ine&4jsp !a pasta rai. ste arui(o ser= utiliado como ação i!icial o!de o usu=rio i!forma o !ome e sumete o formul=rio c%ama!do o m@todo da classe @ello"ction e tor!ar a (isão @elloWorl4jsp.
() .01 ransitional//" "http://$$$.$&.org/M/html/loose.dtd"# ello orldello orld com *truts 2ello"/# 3orm# %od#
Não eiste ualuer muda!ça !ecess=ria !o arui(o .eb4&ml. ecute o aplicati(o atra(@s do e!dereço httpA88localhostAB5B58struts2tutorial.
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
11 de 31
Curso Struts 2
4. Templates Templates são carre#adas prioritariame!teD pesuisa!do a aplicação e depois por procurar o classpath. Se uma Template precisa de ser sustituídaD uma c,pia @ editada e pode ser
colocada !a aplicaçãoD de modo ue seja e!co!trada. m muitas =reas o Struts 2 perma!eceu praticame!te i!alterado depois de sua ju!ção com o Web.ork. possí(el ter uma Template para o co!trole da aparH!cia de suas ta#s em um !í(el de #ra!ulação fi!a ou em !í(el de aplicati(o. Supo!do o suporte a oas pr=ticas e cada ta# =input> possua uma ta# =label>D co!forme a se#ui!te codificação
mora possamos escre(er uma ta# =label> para cada ta# =input> ma!ualme!te para co!se#uir essa oa pr=ticaD podemos especificar uma Template para re!deriar as ta#s =sAte&tfiel> de modo a reduir a codificação escrita !a 8SP. Criar uma Template c%amada te&t4ftl !o pasta template%m&Simple'heme e certifiuese ue est= !a classpath. Codificação te&t4ftl
; arui(o de i!clusão est= apo!ta!do para um modelo bare0bones dispo!iiliado com o Struts ue tor!a um simples =input typeCte&t8> com todos seus atriutos. &udo o ue estamos fae!do !o c,di#o adicio!al @ uma (erificação da eistH!cia de um id se!do passado atra(@s da ta# =te&tfiel> e mostr=lo em uma ta# =label> ju!tame!te com seu (alor ue est= se!do passado. A#ora temos tem uma Template para traal%arD tudo o ue resta a faer @ utili=la. sta @ uma ma!eira ue pode aplic=la a um E!ico campo de teto
A declaração do tema MmQSimple&%emeM est= i!forma!do ao Struts procurar uma Template !o diret,rio mySimpleTheme so o diret,rio padrão de Templates. Para este modelo processar todos as ta#s =Te&tFiel> em (e de especificar t%emeRMmQSimple&%emeM todas as (eesD de(emos modificar as propriedades struts4ui4theme e struts4ui4templateDir !o arui(o struts4properties ue possuem como (alores padrões de &html e templateD respecti(ame!te. ; tema padrão do Struts @ &html ue re!deria as ta#s =t> e =tr> e tudo o mais ue @ i!desej=(el !a marcação. Para desati(ar essa re!deriação e os atriutos de ta#D podemos utiliar o tema M simpleM como a se#ui!te codificação
Alter!ati(ame!teD podemos defi!ir o atriuto struts4ui4theme para IsimpleJ !o arui(o struts4properties. &am@m podemos defi!ir o atriuto template de cada co!trole para SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
12 de 31
Curso Struts 2
apo!tar para um outro diret,rio. Kesumidame!teD o Struts for!ece templates padrões !o arui(o strutscore4jar de(e ate!der Os !ecessidades de muitas aplicações. No e!ta!toD se uma template precisa ser modificadaD @ f=cil co!ectar uma !o(a (ersão. Para etrair uma template @ !ecess=ria mudar a partir do strutscore4jar D faça as modificações e sal(e uma c,pia atualiada !a pasta template8Etheme8Etemplate4ftl. Se esti(er utilia!do o tema ;@0T< e precisa mudar a forma como as ta#s selecio!em e re!deriamD editar esse modelo e sal(eo em 8template8&html8select4ftl. ; meca!ismo #loal para co!trolar a aparH!cia @ completame!te difere!te do Struts !4& se!do um pouco mais complea do ue pode ser !ecess=rio para muitos projetos. Por@m permite uma maior lierdade para ajustar as templates de modo a ate!der ualuer caso. ste @ um m@todo de aio !í(el para co!trolar a aparH!cia de um co!trole #SS. Struts usa arui(os #SS !a re!deriação de sua co!strução. &emas como &html são modificados para &htmlcssD emora essa re!omeação possa !ão ser um om padrão. Por eemploD ao usar o seu tema &htmlcss e =sAte&tfiel>D @ !ecess=rio escre(er classes #SS c%amadas ..-rp e ..lbl para co!trolar a eiição das ta#s =label> e =input>.
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
13 de 31
Curso Struts 2
5. Ajax com Struts )ese!(ol(edores do Aja saem ue as taelas podem faer muito mais do ue a eiição est=tica i!formações em um formato or#a!iadoD le#í(el. Ao si!cro!iarse as li!%as da taela com um a!co de dados do lado do ser(idorD @ possí(el criar taelas di!micas desse tipoD filtrar dados e realiar pa#i!ação. )i(ersas soluções "ja& possuem a (a!ta#em de simplificar a pro#ramaçãoD co!(erte!do o c,di#o do ser(idor 8a(a em 8a(aScriptD !ormalme!te O custa da fleiilidade. A maioria dos dese!(ol(edores !ão uerem ter o modelo de pro#ramação restri!#ido pelo !Emero limitado de compo!e!tes ue essas estruturas for!ecem. Neste uisitoD criar co!teEdo perso!aliado com Struts 2 e "ja& realme!te @ a mel%or escol%aD pois Struts 2 i!te#ra poderosos aliados para faer o dese!(ol(ime!to Aja tor!arse praer.
(mplementa)$o de *anela de +o!in com o A,ax /*/0 Vejamos como dese!(ol(er uma aplicação de
A i!terface #r=fica do aplicati(o co!siste em um formul=rio de lo#i! : aja&lo-in4jsp ue cria uma =rea de co!teEdo para carre#ar o co!teEdo utilia!do ta-s do Aja. Aui tam@m usamos a ta# =sAsubmit> para atualiar o:s< eleme!to:s< ou ue aprese!te uma me!sa#em de ajuda. Sempre ue ocorre um erro as ta#s =sAactionerror> e =sAfielerror> eiem uma me!sa#em !o formul=rio de lo#i!. Pá-inaA aja&lo-in4jsp
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
1' de 31
Curso Struts 2
)e(emos a#oraD dese!(ol(er uma classe de ação ue trata a solicitação de lo#i! e (erifica a aute!ticação do usu=rio. Se o !ome do usu=rio e se!%a for MAdmi!MD e!tão retor!a S?CSS caso co!tr=rio o ojeto KK;K. ,ean e "$*oA
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
1- de 31
Curso Struts 2
P pu%lic void set9ass$ordN*tring valueO L pass$ord = valueB P P
A p=#i!a aja&lo-insuccess4jsp eie a me!sa#em de sucesso do
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
1 de 31
Curso Struts 2
6. ali!aç"o e Con#ers"o ?m Validador :+aliator < (erifica automaticame!te se um erro de co!(ersão ocorreu para um determi!ado campo. ?ma co!(ersão de tipo !o framework @ tra!spare!te. Ueralme!teD tudo o ue @ !ecess=rio faer @ #ara!tir as e!tradas *&$9 possuem !omes ue podem ser usados em epressões ;UN9.
#alida)$o Neste eemploD (eremos como podemos (alidar uma p=#i!a de lo#i! usa!do as (alidações do Struts 2. Para criarmos a p=#i!a de lo#i!D as ta#s da i!terface do Struts. A ta# =sAhea> de(e ser colocada !a seção hea da p=#i!a *&$9D esta ta# #era automaticame!te li!Ws para as iliotecas de CSS e 8a(ascript ue são !ecess=rios para processar os eleme!tos do formul=rio. A ta# =sAform> co!t@m os eleme!tos do formul=rio. ; atriuto action co!t@m o !ome da ação ue de(e ser eecutada ua!do o formul=rio for sumetido. ste !ome da ação de(e ser i#ual ao especificado !o arui(o de co!fi#uração struts4&ml. ; ta# =sAte&tfiel> @ usada para criar uma caia de teto. ; atriuto label dessa ta# co!t@m o !ome a ser eiido !a p=#i!a e o atriuto name co!t@m o !ome da propriedade !a classe da ação a ser mapeado. A ta# =sApass.or> @ idH!tica a ta# =sAte&tfiel> ecepto ue o (alor de e!trada @ mascarado. A ta# =sAsubmit> @ usada para criar um otão de sumissão :e!(io do formul=rio<. Pá-inaA lo-in4jsp
Fua!do o usu=rio clicar !o otão I!trarJ o pedido ser= e!cami!%ado para a ação 9o#i!. )e(emos realiar o mapeame!to desta ação !o arui(o struts4&ml.
Aui o !osso pacote MpadrãoM este!de o pacote MstrutsdefaultM. Ao este!der o Mstruts SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
14 de 31
Curso Struts 2
defaultM o pacote %erda o co!ju!to de i!terceptores defi!ido !o efaultstack. ; pacote MstrutsdefaultM @ defi!ido !o arui(o strutsefault4&ml. &odas as tarefas comu!s são realiadas pelas ações e separadas e colocadas em i!terceptores difere!tes. Podese defi!ir um i!terceptador para cada ação. ;s i!terceptores mais comu!s são utiliados a#rupados em uma pil%a efaultstack do pacote IstrutsdefaultJ. ; efaultstack ser= suficie!te !a maioria dos casos. ;s i!terceptores serão disparados !a ordem em ue são declarados !a pil%aD ta!to a!tes como ap,s a acção @ eecutada. AuiD a ação M9o#i!M @ mapeado para a classe M9o#i!M do pacote I2-.com.tutorialJ. ;s resultados são defi!idos usa!do o eleme!to M =result>M. Se al#um erro de (alidação ocorrer o usu=rio ser= e!cami!%ado para a p=#i!a lo-in4jsp. Se o lo#i! for em sucedidoD e!tão o usu=rio ser= e!cami!%ado para a p=#i!a sucesso4jsp. ; efaultstack co!t@m os se#ui!tes i!terceptores
A classe de ação
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
15 de 31
Curso Struts 2
return *U77**B P pu%lic void validateNO L i3 NgetUserameNO.lengthNO == 0O L add!ieldrrorN"userame"F "ome K o%rigatZrio"OB P else i3 N5getUserameNO.eHualsN"dmin"OO L add!ieldrrorN"userame"F "UsuSrio nvSlido"OB P i3 Nget9ass$ordNO.lengthNO == 0O L add!ieldrrorN"pass$ord"F getextN"pass$ord.reHuired"OOB P P pu%lic *tring getUserameNO L return userameB P pu%lic void setUserameN*tring userameO L this.userame = userameB P pu%lic *tring get9ass$ordNO L return pass$ordB P pu%lic void set9ass$ordN*tring pass$ordO L this.pass$ord = pass$ordB P P
A classe impleme!ta a i!terface "ctionSupport ue epõe o m@todo eecute:<. As se#ui!tes co!sta!tes são declarados !a i!terface de ação ue podem ser usadas como (alores de retor!o do m@todo eecute:<. pu%lic pu%lic pu%lic pu%lic pu%lic
static static static static static
3inal 3inal 3inal 3inal 3inal
*tring *tring *tring *tring *tring
MM6M = "error" 9U = "input" )6@ = "login" 6 = "none" *U77** = "success"
São os se#ui!tes (alores •
7//O/ de(ol(ido ua!do a eecução da ação fal%a
•
9)PGT de(ol(ido ua!do a ação ei#e a e!trada do usu=rio.
•
•
)O)7 de(ol(ido ua!do a eecução da ação for em sucedida e !ão eistem (isões
para mostrar. •
SG##7SS de(ol(ido ua!do a ação for eecutada com Hito e o resultado
correspo!de!te @ eiido para o usu=rio. A#ora (amos (er os pap@is desempe!%ados pelos difere!tes i!terceptores. •
; i!terceptor params ajuda em tra!sferir os dados da solicitação para o ojeto da SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
16 de 31
Curso Struts 2
ação. ; i!terceptor .orkflo. co!trola o fluo de co!trole. Verifica se a ação impleme!ta a i!terface Valiateable D se isso aco!tecerD esse i!terceptor c%amar o m@todo +aliate'( da classe "ction. No m@todo (alidate:< (alida o usu=rio e a se!%a. Se a (alidação fal%ar um erro @ adicio!ado usa!do o m@todo aFile7rror'(. ; m@todo +aliate'( !ão retor!a !e!%um erroD em (e dissoD armae!a todos os erros com a ajuda da i!terface Valiation".are . A#oraD o i!terceptor .orkflo. (erifica os erros de (alidação ocorridos. Se al#um erro ocorreu !o i!terceptor o processame!to do pedido ser= i!terrompido e o co!trole @ tra!sferido para a p=#i!a de e!trada com as me!sa#e!s de erro apropriadas. Para cada campoD as me!sa#e!s de erro podem ser adicio!adas usa!do o m@todo aFiel7rror'(. As me!sa#e!s de erro pode ser adicio!adas diretame!te ou pode ser especificado em um arui(o de propriedades separado. ;s arui(os de propriedades de(e possuir o mesmo !ome da classe "ction. Neste caso o !ome do arui(o de propriedades @ M
pass$ord.reHuired = *enha K o%rigatZria.
; m@todo -etTe&t'( @ for!ecido pela i!terface Te&tPro+ier e pode ser usado para retor!ar as me!sa#e!s de erro.
Convers$o Co!(ersão de tipo @ ideal para as situações !a ual precisamos tra!sformar uma Stri!# em um ojeto mais compleo. Porue para a +e tudo @ uma seuH!cia em *&&PD ?ma das pri!cipais características do WebWork era uma co!(ersão de tipo muito Eteis. Por eemploD se o usu=rio esti(esse acessa!do as coorde!adas !a forma de uma Stri!# :como M3D 22M
?m eemplo de co!(ersão de tipo @ mostrado aaioD usamos a co!(ersão de data e moedaD ao clicar !o otão !(iar esses (alores serão co!(ertidos. Pá-inaA Submit4jsp
20 de 31
Curso Struts 2
Pá-inaA Sho.4jsp
#lasse e "$*oA Type#on+ersion7&le4ja+a pacage x2-.comB import +ava.util.ateB import com.opensmphon.x$or2.ction*upportB pu%lic class pe7onversionxample extends ction*upportL private private private private private
*tring nameB int rolloB dou%le amountB ate su%missionateB *tring date9attern="mmdd"B
pu%lic *tring getate9atternNO L
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
21 de 31
Curso Struts 2
return date9atternB P pu%lic void setate9atternN*tring date9atternO L this.date9attern = date9atternB P pu%lic *tring getameNO L return nameB P pu%lic void setameN*tring nameO L this.name = nameB P pu%lic int getMolloNO L return rolloB P pu%lic void setMolloNint rolloO L this.rollo = rolloB P pu%lic dou%le getmountNO L return amountB P pu%lic void setmountNdou%le amountO L this.amount = amountB P pu%lic ate get*u%missionateNO L return su%missionateB P pu%lic void set*u%missionateNate su%missionateO L this.su%missionate = su%missionateB P R6verride pu%lic *tring executeNO thro$s xception L *stem.out.printlnNget*u%missionateNOOB *stem.out.printlnNsu%missionateOB return *U77**B P P
)epois de escre(er uma classe de ação. )e(emos passar os (alores para o arui(o de propriedades como "rIui+o e ProprieaeA Type#on+ersion7&lecon+ersion4properties su%missionate=x2-.com.converter.ate7onverter7laC amount=x2-.com.converter.7urrenc7onverter7laC
Podemos criar !o arui(o de propriedades as me!sa#em de erro apropriadas. 9emra!do ue este arui(o de(e ser do mesmo !ome do arui(o de ação. "rIui+o e ProprieaeA Type#on+ersion7&le4properties invalid.3ieldvalue.amount=!avor entrar com o valor correto invalid.3ieldvalue.su%missionate=!avor entrar com a da no 3ormato mmdd
A#ora (amos codificar as classes ue co!(ertem os tipos. SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
22 de 31
Curso Struts 2
#lasse e #on+ers*oA Data#on+erter#la?4ja+a pacage x2-.com.converterB import import import import import import import
+ava.text.ate!ormatB +ava.text.9arsexceptionB +ava.text.*impleate!ormatB +ava.util.ateB +ava.util.(apB ognl.e3aultpe7onverterB com.opensmphon.x$or2.conversion.pe7onversionxceptionB
pu%lic class ate7onverter7laC extends e3aultpe7onverter L private ate convertedateB pu%lic ate convertAalueN(ap contextF 6%+ect o%+ectF 7lass tpeO L i3 Ntpe == ate.classO L *tring date9attern = "((dd"B ate!ormat 3ormat = ne$ *impleate!ormatNdate9atternOB 3ormat.set)enientN3alseOB tr L *tring\] date*tring = N*tring\]O o%+ectB convertedate = 3ormat.parseNdate*tring\0]OB return convertedateB P catch Nxception eO L e.to*tringNOB thro$ ne$ pe7onversionxceptionN"ata K invSlida"OB P P return nullB P P
#lasse e #on+ers*oA #urrency#on+erter#la?4ja+a pacage x2-.com.converterB import import import import import
+ava.lang.re3lect.(em%erB +ava.text.ecimal!ormatB +ava.text.um%er!ormatB +ava.util.(apB com.opensmphon.x$or2.conversion.pe7onverterB
pu%lic class 7urrenc7onverter7laC implements pe7onverterL private*tring;uilder string;uilderB pu%lic *tring replaceN*tring stringF char characterF *tring convertO L i3 Nstring == nullO return nullB int length = string.lengthNOB string;uilder= ne$ *tring;uilderNstring.lengthNO 4 2OB 3or Nint i = 0B i < lengthB i^^O L char char2 = string.chartNiOB SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
23 de 31
Curso Struts 2
i3 Nchar2 == characterO L string;uilder.appendNconvertOB P else L string;uilder.appendNchar2OB P P return string;uilder.to*tringNOB P
R6verride pu%lic 6%+ect convertAalueN(ap<*tringF 6%+ect# arg0F 6%+ect arg1F (em%er arg2F *tring arg&F 6%+ect valueF 7lass tpeO L i3 Nvalue == nullO L return nullB P else i3 Ntpe == *tring.classO L um%er!ormat ne$7urrenc = ne$ ecimal!ormatN"EFEE0.00"OB *tring 3ormated7urrenc=ne$7urrenc.3ormatNNou%leO valueOB return 3ormated7urrencB P else i3 Ntpe == ou%le.9 __ tpe == ou%le.classO L *tring\] strings = N*tring\]O valueB *tring dou%leAalue = strings\0]B return ou%le.parseou%leNreplaceNdou%leAalueF `F`F ""OOB P return nullB P P
Por fim o arui(o de mapeame!to. "rIui+o e #onfi-ura$*oA struts4&ml
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
2' de 31
Curso Struts 2
$. Struts e Spring No m@todo de eecução o!de muitas classes "ctionSupport do Struts 2 são declarações e criam ojetos e depois temos de eecutar esses ojetos e os m@todos ue eecutam as tarefas !ecess=rias. Sempre ue uma classe cria um ojeto de outra classe aprese!ta uma depe!dH!cia e!tre as duas classes. ; framework Sprin- tor!a mais f=cil para o dese!(ol(edor de aplicati(os #ere!ciar essas depe!dH!cias e ajuda a tor!ar a aplicação mais fleí(el e de f=cil ma!ute!ção. Vamos criar um eemplo para mostrar como fu!cio!a a i!te#ração Sprin- e Struts 2D utilia!do o struts2sprin-plu-in. Ao faer isso podemos utiliar o recurso de 7!jeção do Sprin-. "rIui+o e #onfi-ura$*oA .eb4&ml
Por padrão o arui(o application#onte&t4&ml ser= utiliado para faer a co!fi#uração do ea! Spri!#. "rIui+o e #onfi-ura$*oA application#onte&t4&ml
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
2- de 31
Curso Struts 2
<%eans# <%ean id="helloorld7lass" class="x2-.com.>elloorld" #
Ke#istramos a classe @elloWorl e i!jetamos a me!sa#em M;l= $u!doXM para o atriuto messa-e usa!do o m@todo de i!jeção. "rIui+o e ProprieaeA struts4&ml <5679 struts 9U;)7 "//pache *o3t$are !oundation// *truts 7on3iguration 2.0//" "http://struts.apache.org/dtds/struts2.0.dtd"#
A E!ica muda!ça @ ue em (e de se referir a classe &24com4@elloWorl diretame!teD relacio!amos a ela usa!do o !ome do ea! defi!ido !o arui(o de co!fi#uração do Sprin,ean. A classe *ello+orld @ mostrada aaio. No m@todo eecute:< ue simplesme!te retor!a MS?CSSM e o atriuto messa-e @ defi!ido usa!do a i!jeção. #lasse POJOA @elloWorl4ja+a pacage x2-.comB pu%lic class >elloorld L private *tring messageB pu%lic *tring get(essageNO L return messageB P pu%lic void set(essageN*tring messageO L this.message = messageB P pu%lic *tring executeNO L return "*U77**"B P
Y Na p=#i!a ine&4jsp e!cami!%amos o pedido para a ação helloWorl. Pá-inaA ine&4jsp <( >9UA="Me3resh" 76="0BUM)=helloorld.action"#
)epois de i!(ocar o m@todo eecute:< o usu=rio ser= direcio!ado para a p=#i!a success.jsp. Nesta p=#i!a mostramos (alor da me!sa#em. !ecess=rio ter os se#ui!tes arui(os 8AK !o diret,rio W7,9)F8lib para ue este eemplo seja eecutado corretame!te commons3ileupload1.2.1
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
2 de 31
Curso Struts 2
commonsio1.&.2 commonslogging1.1 3reemarer2.&.1& +unit&.8.1 ognl2.D.11 struts2conventionplugin2.1.D struts2core2.1.D x$or2.1.2 struts2springplugin2.1.D antlrruntime&.0 org.spring3rame$or.asm&.0.0.(& org.spring3rame$or.%eans&.0.0.(& org.spring3rame$or.context&.0.0.(& org.spring3rame$or.core&.0.0.(& org.spring3rame$or.expression&.0.0.(& org.spring3rame$or.$e%&.0.0.(& org.spring3rame$or.$e%.servlet&.0.0.(&
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
24 de 31
Curso Struts 2
%. &ormul'rio (aster)*etail ste @ um simples eemplo $aster)etail. ?ma lista de dados mestre @ ma!tido em uma lista e eiidos em uma taela. Fua!do uma li!%a for selecio!ada com a (isão de li#ação de um detal%e da tela 8SP @ aerta e o item selecio!ado @ eiido. A lista @ usada pela taela mestre @ carre#ado com a ação !o i!ício da aplicação. "rIui+o e #onfi-ura$*oA .eb4&ml
Pá-inaA ine&4html <5679 >() 9U;)7 "//&7// >() .0 ransitional//"# 9UA="Me3resh" 76="0BUM)=ars/set)ist.action"#
"rIui+o e #onfi-ura$*oA struts4&ml
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
25 de 31
Curso Struts 2
,ean e "$*oA Set
com.opensmphon.x$or2.ction7ontextB +avax.servlet.http.>ttp*ervletMeHuestB +avax.servlet.http.>ttp*ervletMesponseB com.opensmphon.x$or2.ction*upportB +ava.util.4B +avax.servlet.http.>ttp*essionB org.apache.struts2.*ervletction7ontextB org.apache.struts2.interceptor.*ervletMeHuest$areB org.apache.struts2.interceptor.*ervletMesponse$areB
pu%lic 3inal class *et)istction extends ction*upport implements *ervletMeHuest$areF*ervletMesponse$are L private >ttp*ervletMeHuest reHuestB private >ttp*ervletMesponse responseB private )ist listB pu%lic *et)istctionNO L reHuest = get*ervletMeHuestNOB P pu%lic *tring executeNO thro$s xception L >ttp*ession session = reHuest.get*essionNOB list = ne$ rra)istNOB list.addN"!rutas"OB list.addN"(aIJ"OB list.addN"(anga"OB list.addN")aran+a"OB list.addN"omate"OB session.setttri%uteN"%ase)ist"FlistOB return *U77** B P pu%lic )ist get)istNOL return listB P pu%lic void set*ervletMeHuestN>ttp*ervletMeHuest reHuestOL this.reHuest = reHuestB P pu%lic >ttp*ervletMeHuest get*ervletMeHuestNOL return reHuestB P pu%lic void set*ervletMesponseN>ttp*ervletMesponse responseOL SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
26 de 31
Curso Struts 2
this.response = responseB P pu%lic >ttp*ervletMesponse get*ervletMesponseNOL return responseB P P
Pá-inaA listProcess4jsp () 9U;)7 "//&7// >() .01 ransitional//"#
,ean e "$*oA Vie.Detail"ction4ja+a pacage x2-.comB import import import import import import
+avax.servlet.http.>ttp*ervletMeHuestB +avax.servlet.http.>ttp*ervletMesponseB com.opensmphon.x$or2.ction*upportB +avax.servlet.http.>ttp*essionB org.apache.struts2.interceptor.*ervletMeHuest$areB org.apache.struts2.interceptor.*ervletMesponse$areB
pu%lic 3inal class Aie$etailction extends ction*upport implements *ervletMeHuest$areF *ervletMesponse$are L private >ttp*ervletMeHuest reHuestB private >ttp*ervletMesponse responseB pu%lic Aie$etailctionNO L reHuest = get*ervletMeHuestNOB P pu%lic *tring executeNO thro$s xception L
SGAS 910, Bloco D, salas, 237 a 243, Mix Park Sul – Asa Sul, Brasília/DF CP! 70"390#100 – Fo$%/Fax! &'1( 3244#2)10 – 3242#4339
30 de 31