MVC c)' Se,0&e.- JSP e JSTL *), T"#a!) Fa,#a =; Ed32&6 =<:=<:><=?
A&!aW A&!aW),% ),%-- S).1a S).1a,e,e- T,e#(a ,e#(a'e( 'e(.) .)-- e Se,0#9 Se,0#9))- L.da L.da T)d))d)- )- d#,e#. d#,e#.)),e-e,0ad)- Ne("/'a *a,.e de-.e ,) *)de -e, ,e*,)d/4#da )/ .,a(-'#.#da e' +/a&+/e, ),'a -e$a *), 'e#) e&e.,>(#c) )/ 'ec7(#c) -e' *e,'#--8) *), e-c,#.) da A&!aW),%- e2ce.) e2ce.) *a,a ,e-/')- b,e0eb ,e0e- e' ,e0#-?e- e a(6-e- A&!aW),% A&!aW),%- S).1a,e- S).1a,e- T,e#(a'e(.)T,e#(a'e(.)- e Se,0#9)- L.da 111a&!a1) 111a&!a1),%-c)' ,%-c)' c)(.a.)a&!a1),%-c)' Z Y
www.algaworks.com
3
S)b,e ) a/.), T"#a!) Fa,#a de A(d,ade T"#a!)FA(d,ade F/(dad), #(-.,/.), e c)(-/&.), da A&!aW),%- G,ad/ad) e' S#-.e'a- de I(),'a98) e ce,.#cad) c)') *,)!,a'ad), Ja0a *e&a S/( I(#c#)/ -e/ #(.e,e--e *), *,)!,a'a98) e' YY +/a(d) de-e(0)&0e/ /' -).1a,e *a,a e(.,e.e(#'e(.) e -e .),()/ /' d)- 'a#*)*/&a,e- () B,a-#& e )/.,)- *a<-e- de &<(!/a *),./!/e-a J6 )# -=c#) e .,aba&")/ e' )/.,a- e'*,e-a- de -).1a,e c)') *,)!,a'ad), !e,e(.e e d#,e.), de .ec()&)!#a 'a(/(ca de#2)/ de *,)!,a'a,
www.algaworks.com
5
S/'6,#)
I(.,)d/98) a) de-e(0)&0#'e(.) 1eb
O +/e : Ja0a EE
O *,).)c)&) HTTP
De-e(0)&0#'e(.) 1eb c)' Ja0a
C)(.a#(e,-
I(-.a&a(d) ) A*ac"e T)'ca.
I(.e!,a(d) ) Ec*-e c)' ) A*ac"e T)'ca.
P,#'e#,) *,)$e.) 1eb
E-.,/./,a de d#,e.=,#)-
Pe,-#-.;(c#a de dad)- c)' JPA
Y
O +/e : *e,-#-.;(c#a
Ma*ea'e(.) Ob$e.) Re&ac#)(a& ORM
P),+/e /-a, ORM
Ja0a Pe,-#-.e(ce API e H#be,(a.e
D)1(&)ad e c)(!/,a98) d) H#be,(a.e ORM
C,#a98) d) D)'a#( M)de&
I'*&e'e(.a98) d) e+/a&- e "a-"C)de
Ma*ea'e(.) b6-#c)
O a,+/#0) *e,-#-.e(ce2'&
Ge,a(d) a- .abe&a- d) ba(c) de dad)-
P,=2#')- *a--)-
Y
Se,0&e.-
O +/e -8) Se,0&e.-
P,#'e#,a -e,0&e.
Ma*ea'e(.) de -e,0&e.
Ca'#(") d) c)(.e2.)
Y
C,#a(d) E(.#.3Ma(a!e,
Se,0&e. +/e c)(-/&.a *,)d/.)-
O *ad,8) Re*)-#.),3
Pa,7'e.,)- de ,e+/#-#98)
Y
M:.)d) POST
Red#,ec#)(a'e(.) de e(0#)
F#&.,)-
O a,+/#0) 1eb2'&
T,a.a'e(.) de e,,)-
Y
A,+/#0)- WAR
Ja0aSe,0e, Pa!e-
Y
O +/e : JSP
F/(c#)(a'e(.) #(.e,()
JSP +/e c)(-/&.a *,)d/.)-
Y
De-*ac") de ,e+/#-#9?e-
E2*,e--#)( La(!/a!e
Ta!b- e JSTL
C)(d#98) e #.e,a98)
F),'a.a98) (/':,#ca
F),'a.a98) de da.a-
I'*),.a98) de *6!#(a-
Ta! F#&e-
I'*&e'e(.a(d) ) cada-.,) de *,)d/.)-
MVC M)de& V#e1 C)(.,)&&e,
F,a'e1),%- MVC
Se--?e-
O +/e -8) -e--?e-
L)!#( de /-/6,#) c)' -e--?e-
I(0ada(d) a -e--8)
Y
A/.),#4a98) de /-/6,#)-
Y
Te'*) '#.e de -e--?e-
Y
Ca*<./&)
I(.,)d/98) a) de-e(0)&0#'e(.) 1eb O +/e : Ja0a EE A Ja0a EE Ja0a P&a.),' E(.e,*,#-e Ed#.#)( : /'a *&a.a),'a *ad,8) *a,a de-e(0)&0e, a*ca9?e- Ja0a de !,a(de *),.e e)/ *a,a a #(.e,(e. +/e #(c&/# b#b).ecae /(c#)(adade- *a,a #'*&e'e(.a, -).1a,e Ja0a d#-.,#b/
10
+/e -e de-e(0)&0e -#-.e'a- de-%.)* a.: 'e-') c)' e,,a'e(.a- +/e -/*),.a' cca,ea,,a-.a, c)'*)(e(.e- JPA Ja0a Pe,-#-.e(ce API : /'a API *ad,8) d) Ja0a *a,a *e,-#-.;(c#a de dad)- +/e /-a /' c)(ce#.) de 'a*ea'e(.) )b$e.),e&ac#)(a& E--a .ec()&)!#a .,a4 a&.a *,)d/.#0#dade *a,a ) de-e(0)&0#'e(.) de -#-.e'a- +/e (ece--#.a' de #(.e!,a98) c)' ba(c) de dad)- S= *a,a c#.a, e--a API *)--#b#.a +/e 0)c; de-e(0)&0a a*ca9?e- /-a(d) ba(c) de dad)- -e' *,ec#-a, e-c,e0e, /'a ("a -e+/e, de SQL EJB E(.e,*,#-e Ja0a Bea(- -8) c)'*)(e(.e- +/e e2ec/.a' e' -e,0#d),ede a*ca98) e *)--/e' c)') *,#(c#*a#- )b$e.#0)- ),(ece, ac#dade e *,)d/.#0#dade () de-e(0)&0#'e(.) de c)'*)(e(.e- d#-.,#b/
O *,).)c)&) HTTP O *,).)c)&) HTTP : /.#ad) (a (a0e!a98) de *6!#(a- da I(.e,(e. Q/a(d) 0)c; ab,e /'a $a(e&a de /' b)&.*e) ace--a /'a *6!#(a Web e (a0e!a e' -e/- (%- 0)c; e-.6 (a 0e,dade /.#a(d) e--e *,).)c)&) *a,a 0#-/aa, e' -/a '6+/#(a ) c)(.e@d) +/e e-.6 a,'a4e(ad) e)/ : *,)ce--ad) e' -e,0#d),e- ,e').)- O HTTP : /' *,).)c)&) *+a+e#e** de c)'/(#ca98) ce(.e-e,0#d), ) ce(.e e(0#a /'a ,e+/#-#98) *a,a ) -e,0#d), +/e *,)ce--a a ,e+/#-#98) e de0)&0e /'a ,e-*)-.a *a,a ) ce(.e -e(d) +/e a *,#(c<*#) (e("/'a #(),'a98) : 'a(.#da () -e,0#d), e' ,e&a98) 5- ,e+/#-#9?e- *,e0#a'e(.e ,eceb#da- A--#' +/a(d) d#!#.a')- ) e(de,e9) de /'a *6!#(a e' /' b)&.*e) e-.a')- !e,a(d) /'a ,e+/#-#98) a /' -e,0#d), +/e #,6 *), -/a 0e4 de0)&0e, *a,a ) b)&.*e) ) c)(.e@d) da *6!#(a HTML ,e+/#-#.ada
www.algaworks.com
11
A ,e+/#-#98) e(0#ada *), /' ce(.e de0e c)(.e, ba-#ca'e(.e /' c)'a(d) .a'b:' c"a'ad) de ':.)d) ) e(de,e9) de /' ,ec/,-) () -e,0#d), .a'b:' c"a'ad) de 'a+h e /'a #(),'a98) -)b,e a 0e,-8) d) *,).)c)&) HTTP -e(d) /.#ad) S/*)(d) *), e2e'*&) +/e +/e,e')- b/-ca, ) c)(.e@d) d) e(de,e9) h++'599...6,c&$6b)9%de/6h+$# U.#e')- ) ':.)d) GET ) 'a+h /index.html e a 0e,-8) 1.1 d) *,).)c)&) HTTP Te')- a -e!/#(.e ,e+/#-#98) e(0#ada GET /index.html HTTP/1.1 Host: www.uol.com.br
E2#-.e' d#0e,-)- ':.)d)- HTTP +/e *)de' -e, e-*ec#cad)- e' ,e+/#-#9?e- -e(d) )- 'a#- c)'/(- ) ':.)d) GET (),'a&'e(.e /.#ad) *a,a )b.e, ) c)(.e@d) de /' a,+/#0) () -e,0#d), e ) ':.)d) POST /.#ad) *a,a e(0#a, dad)- de ),'/&6,#)HTML a) -e,0#d), U'a ,e+/#-#98) *)de c)(.e, *a,7'e.,)- ad#c#)(a#- c"a'ad)- heade)* A&!/(heade)* c)'/(- -8) *), e2e'*&) H&*+ U*e)7Age%+ e Acce'+ U'a 0e4 *,)ce--ada a ,e+/#-#98) ) -e,0#d), *), -/a 0e4 'a(da /'a ,e-*)-.a *a,a ) ce(.e -e(d) +/e e--a ,e-*)-.a .a'b:' .e' /' ),'a.) *,:de.e,'#(ad) a *,#'e#,a ("a c)(.:' #(),'a9?e- -)b,e a 0e,-8) d) *,).)c)&) /' c=d#!) de -.a./da ,e-*)-.a e /'a 'e(-a!e' a--)c#ada a e--e -.a./- E' -e!/#da -8) e(0#ad)- )heade)* da ,e-*)-.a e (a&'e(.e : e(0#ad) ) c)(.e@d) da ,e-*)-.a Ve$a /' e2e'*&) -#'*&e- de ,e-*)-.a HTTP HTTP/1.1 200 OK Date: Thu, 26 Sep 2013 15:17:12 GMT Server: Apache/2.2.15 (CentOS) Content-Type: text/html; charset=utf-8
www.algaworks.com
12
N) e2e'*&) a(.e,#), ) c=d#!) de -.a./- 200 #(d#ca +/e ")/0e -/ce--) () a.e(d#'e(.) da ,e+/#-#98) e(0#ada *e&) ce(.e e )- heade)* #(d#ca' a da.a e "),a d) -e,0#d), ) -e,0#d), /-ad) .#*) d) c)(.e@d) e *), ' .e')- ) c=d#!))(.e da *6!#(a HTML O/.,)- c=d#!)- de -.a./- ba-.a(.e c)'/(- -8) ) 404 +/e #(d#ca +/e ) ,ec/,-) (8) )# &)caad) () -e,0#d), e ) c=d#!) 500 +/e #(d#ca +/e ")/0e e,,) () *,)ce--a'e(.) da ,e+/#-#98) e(0#ada
De-e(0)&0#'e(.) 1eb c)' Ja0a C)' ) a0a(9) da .ec()&)!#a -)b,e ,ede- de c)'*/.ad),e- e c)' ) c,e-c#'e(.) da #(.e,(e. a- *6!#(a- 1eb e-.8) -e .),(a(d) cada 0e4 'a#- a.,ae(.e- e c"e#a- de ,ec/,-)- +/e a/'e(.a' a #(.e,a.#0#dade c)' ) /-/6,#) Q/a(d) a&a')- e' a*ca9?e- 1eb e-.a')- ()- ,ee,#(d) a -#-.e'a- )/ -#.e- )(de !,a(de *a,.e da *,)!,a'a98) ca ")-*edada e' -e,0#d),e- (a #(.e,(e. e ) /-/6,#) ce(.e (),'a&'e(.e (8) *,ec#-a .e, (ada #(-.a&ad) e' -/a '6+/#(a *a,a /.#.&a- a&:' de /' (a0e!ad), b,)1-e, O ace--) 5- *6!#(a- de--e- -#-.e'a- : e#.a /.#a(d) ) ')de&) c"a'ad) de )e(,e*+7 )e*'&%*e )/ -e$a ) ce(.e -)c#.a +/e a&!/'a a98) -e$a ,eaada )e(,e*+ e ) -e,0#d), a ,eaa e ,e-*)(de *a,a ) ce(.e )e*'&%*e Na *&a.a),'a Ja0a e--e ')de&) )# #'*&e'e(.ad) a.,a0:- da API de Se,0&e.- e JSP Ja0aSe,0e, Pa!e- U' Se,0&e. e-.e(de a /(c#)(adade de /' -e,0#d), 1eb *a,a -e,0#, *6!#(a- d#(7'#ca- a)- (a0e!ad),e- /.#a(d) ) *,).)c)&) HTTP J6 ) JSP /.#a(d)-e de /'a -#(.a2e e-*ec#a& *e,'#.e +/e de-e(0)&0ed),e- 1eb c,#e' *6!#(a- +/e *)--/a' *,)!,a'a98) Ja0a -e'e&"a(.e a) PHP e ASP *),:' '/#.) 'a#,)b/-.) e *ad,)(#4ad) N) '/(d) Ja0a )- -e,0#d),e- 1eb -8) c"a'ad)- de Se,0&e. C)(.a#(e, *)##'*&e'e(.a' a e-*ec#ca98) de Se,0&e. e JSP O -e,0#d), c)(0e,.e a ,e+/#-#98) e' /' )b$e.) d) .#*) HttpServletRequest E-.e )b$e.) : e(.8) *a--ad) a)- c)'*)(e(.e 1eb +/e *)de' e2ec/.a, +/a&+/e, c=d#!) Ja0a *a,a +/e *)--a -e, !e,ad) /' c)(.e@d) d#(7'#c) E' -e!/#da ) c)'*)(e(.e 1eb de0)&0e /' )b$e.) HttpServletResponse +/e ,e*,e-e(.a a ,e-*)-.a a) ce(.e E-.e )b$e.) : /.#ad) *a,a +/e ) c)(.e@d) !e,ad) -e$a e(0#ad) a) (a0e!ad), d) /-/6,#) www.algaworks.com
13
C)(.a#(e,C)(.a#(e,- -8) #(.e,ace- e(.,e c)'*)(e(.e- e /(c#)(adade- de ba#2) (<0e& e-*ec<ca- de /'a *&a.a),'a Pa,a /'a a*ca98) 1eb de-e(0)&0#da e' Ja0a )/ /' c)'*)(e(.e c),*),a.#0) -e, e2ec/.ad) e&e- *,ec#-a' -e, #'*&a(.ad)- e' /' c)(.a#(e, O- c)(.a#(e,- .a'b:' -8) c"a'ad)- de -e,0#d),e- de )b$e.)- )/ -e,0#d),e- de a*ca98) *)#- )e,ece' -e,0#9)- de #(,ae-.,/./,a *a,a e2ec/98) de c)'*)(e(.e- O EJB C)(.a#(e, -/*),.a E(.e,*,#-e Ja0aBea(- EJB +/e -8) c)'*)(e(.ec),*),a.#0)- d#-.,#b/
www.algaworks.com
14
I(-.a&a(d) ) A*ac"e T)'ca. O *,)ce--) de #(-.a&a98) d) A*ac"e T)'ca. : -#'*&e- ba-.a de-c)'*ac.a, ) a,+/#0) ba#2ad) () &)ca& de-e$ad) Ne-.e ,) /-a,e')- ) T&$ca* @8< U'a 0e4 (aad) .e'-e /' c)(.a#(e, *,)(.) *a,a *,)d/98) De +/a&+/e, ),'a ) -#.e d#-*)(#b#a .)da a d)c/'e(.a98) (ece--6,#a *a,a ,e-)&0e, *,)b&e'ae(c)(.,ad)- e e-c&a,ece, d@0#da- c)' ,e&a98) a) *,)ce--) de #(-.a&a98) e c)(!/,a98) d) -e,0#d), Pa,a e(.e(de, /' *)/c) -)b,e ) /(c#)(a'e(.) d) T)'ca. e2a'#(e )- d#,e.=,#)c,#ad)- d/,a(.e ) *,)ce--) de #(-.a&a98) O- *,#(c#*a#- -8) b% E2ec/.60e#- #(c&/#(d) )- a*ca.#0)- *a,a #(#c#a, e *a,a e(ce,,a, a e2ec/98) d) -e,0#d), c&%f A,+/#0)- de c)(!/,a98) d) T)'ca. O a,+/#0) *e)-e)6/$# e' *a,.#c/&a, de(e /'a -:,#e de *a,7'e.,)- *a,a a e2ec/98) d) -e,0#d), c)') *), e2e'*&) a *),.a )(de ) -e,0#d), #,6 ,ecebe, ,e+/#-#9?e- e--a *),.a
www.algaworks.com
15
: *), dea/&. de0e(d) -e, e2a'#(ad) c)' c/#dad) e ')d#cad) c)(),'e a- (ece--#dade- #&g) A,+/#0)- de &)! d) -e,0#d), O T)'ca. .a'b:' *)de !e,a, a,+/#0)- de &)! c)' ./d) ) +/e a- a*ca9?e- de-e(0)&0#da- e(0#a' *a,a a -a
www.algaworks.com
16
Ab,a /' b)&.*e) e ace--e ) e(de,e9) h**'7::#&ca#h&)*7@<@< Se a .e&a aba#2) a*a,ece, *a,a 0)c; *a,ab:(- ) T)'ca. e-.6 #(-.a&ad) e /(c#)(a(d) e' -e/ c)'*/.ad),
Pa,a #(.e,,)'*e, a e2ec/98) d) T)'ca. e2ec/.e ) a,+/#0) *h,+d&.%6ba+ W#(d)1- )/ *h,+d&.%6*h L#(/2 )/ Mac
I(.e!,a(d) ) Ec*-e c)' ) A*ac"e T)'ca. P)de')- #(#c#a, ) T)'ca. de(.,) d) Ec*-e *a,a !a("a,')- 'a#- *,)d/.#0#dade 'a- *a,a #--) *,ec#-a')- d) *&/!#( WTP Web T&* P#a+f&)$ O Ec#')e IDE f&( Ja,a EE De,e#&'e() $6 0e' c)' e--e *&/!#( +/e a&:' de *)--#b#.a, a #(.e!,a98) de c&%+a%e)* a) Ec*-e 0e' c)' d#0e,-)- ed#.),e- +/e a/2#a' ) de-e(0)&0#'e(.) 1eb e ()0a- *e,-*ec.#0a- Va')- #(.e!,a, ) A*ac"e T)'ca. a) Ec*-e *a,a *)de,')- #(#c#a, e *a,a, ) T)'ca. a&:' de #'*&a(.a, a- a*ca9?e- a *a,.#, d) a'b#e(.e de de-e(0)&0#'e(.) Ace--e a -e. Se(,e() e c+/e () @(#c) (% +/e a*a,ece *a,a ad#c#)(a, /' ()0) -e,0#d),
www.algaworks.com
17
Na .e&a +/e ab,#, e(c)(.,e e -e&ec#)(e T&$ca* @8< Se(,e( De*)#- c+/e e' Ne.*
C+/e () b).8) B(&-)e888 -e&ec#)(e ) d#,e.=,#) ,a#4 )(de ) T)'ca. )# de-c)'*ac.ad) e c+/e e' F%)h
www.algaworks.com
18
V)c; 0e,6 ) T)'ca. ad#c#)(ad) (a -e. Se(,e()
D; /' d/*&) c+/e () -e,0#d), d) T)'ca. ad#c#)(ad) (a -e. Ma,+/e a )*98) U)e T&$ca* %)*a##a*&% e' Se(,e( L&ca*&%) e -a&0e a a&.e,a98) Fa4e')- #--) *a,a +/e ) WTP /-e a- 'e-'a- c)(!/,a9?e- da #(-.a&a98) d) T)'ca.
Pa,a #(#c#a, ) T)'ca. de(.,) d) Ec*-e *,#'e#,a'e(.e c)(,'e +/e ) -e,0#d), (8) e-.6 ,)da(d) ),a d) Ec*-e De*)#- -e&ec#)(e a ("a +/e ,e*,e-e(.a ) -e,0#d), ad#c#)(ad) e c+/e ()
Se ./d) de, ce,.) 0)c; 0e,6 (a -e. Se(,e() +/e ) T)'ca. e-.6 #(#c#ad) S+a)+ed
Ab,a /' b)&.*e) e ace--e ) e(de,e9) h**'7::#&ca#h&)*7@<@<
www.algaworks.com
19
P,#'e#,) *,)$e.) 1eb Pa,a c,#a, /' ()0) *,)$e.) 1eb c+/e c)' ) b).8) d#,e#.) d) ')/-e (a *a,.e b,a(ca da -e. P(&!ec* E.'#&(e( e ace--e ) 'e(/ Ne- D/%a$c Web P(&!ec*
I(),'e ) ()'e d) *,)$e.) e c+/e e' F%)h
www.algaworks.com
20
Va')- c,#a, /' a,+/#0) HTML '/#.) -#'*&e- +/e a*e(a- e2#be O# M/(d) *a,a ) /-/6,#) C+/e c)' ) b).8) d#,e#.) () *,)$e.) c,#ad) ace--e a )*98) Ne- e c+/e e' HTML F#e Na .e&a +/e ab,#,6 #(),'e ) ()'e d) a,+/#0) HTML c)') OM,%d&6h+$# e c+/e e' F%)h
O a,+/#0) OM,%d&6h+$# -e,6 c,#ad) (a *a-.a WebC&%+e%+ d) *,)$e.) D#!#.e O# M/(d) de(.,) da .a! body d) a,+/#0)
www.algaworks.com
21
A!),a *,ec#-a')- ad#c#)(a, ) *,)$e.) a) T)'ca. *a,a +/e e&e a9a a #'*&a(.a98) -e'*,e +/e ")/0e, a&!/'a ')d#ca98) Na -e. Se(,e() c+/e c)' ) b).8) d#,e#.) () -e,0#d), d) T)'ca. e ace--e a )*98) Add a%d Re$&,e888
Ma,+/e ) *,)$e.) (a -.a!e' da e-+/e,da e .,a(-,a *a,a a -.a!e' da d#,e#.a cca(d) () b).8) Add De*)#- c+/e e' F%)h
www.algaworks.com
22
I(#c#e ) T)'ca. -e e&e (8) e-.#0e, -e(d) e2ec/.ad) de*)#- ace--e h**'7::#&ca#h&)*7@<@<:P($e(&P(&!e*&Web:OM+%d&8h*$# A *6!#(a OM,%d&6h+$# +/e c,#a')- -e,6 a*,e-e(.ada () (a0e!ad),
www.algaworks.com
23
E-.,/./,a de d#,e.=,#) A *e,-*ec.#0a Ja,a EE d) Ec*-e +/e /-a')- *a,a c,#a, ()--) *,#'e#,) *,)$e.) 1eb e2#be )- a,+/#0)- de /'a ),'a d#e,e(.e d) ,ea& () -#-.e'a de a,+/#0)- P), e2e'*&) 0e$a )- d#,e.=,#)- e a,+/#0)- de ()--) *,)$e.) *e&) !e,e(c#ad), de a,+/#0)-
A *a-.a b+#d a,'a4e(a .)da- a- c&a--e- c)'*#&ada- e ,ec/,-)- d) -#-.e'a )(c !/a,da .)d)- )- a,+/#0)- de c=d#!))(.e de c&a--e- Ja0a e WebC&%*e%* .)d)- )- a,+/#0) 1eb c)') *), e2e'*&) HTML CSS Ja0aSc,#*. #'a!e(- JSP +/e a#(da e-./da,e')- e.c De(.,) de WebC&%*e%* e2#-.e a *a-.a WEB9INF +/e *)de c)(.e, a,+/#0)- de c)(!/,a98) c)') *), e2e'*&) ) .eb6/$# +/e e-./da,e')- 'a#ad#a(.e Na *a-.a #b +/e ca de(.,) de WEB9INF c)&)ca')- a- b#b).eca(ece--6,#a- *a,a ()--) *,)$e.) a,+/#0)- JAR
www.algaworks.com
24
Ca*<./&)
Pe,-#-.;(c#a de dad)- c)' JPA O +/e : *e,-#-.;(c#a A 'a#),#a d)- -#-.e'a- de-e(0)&0#d)- e' /'a e'*,e-a *,ec#-a de dad)- *e,-#-.e(.e- *),.a(.) *e,-#-.;(c#a : /' c)(ce#.) /(da'e(.a& () de-e(0)&0#'e(.) de a*ca9?e- Se /' -#-.e'a de #(),'a98) (8) *,e-e,0a--e )- dad)- +/a(d) e&e )--e e(ce,,ad) ) -#-.e'a (8) -e,#a *,6.#c) e /-/a& Q/a(d) a&a')- de *e,-#-.;(c#a de dad)- c)' Ja0a (),'a&'e(.e a&a')- d) /-) de -#-.e'a- !e,e(c#ad),e- de ba(c) de dad)- ,e&ac#)(a#- e SQL *),:' e2#-.e' d#0e,-a)/.,a- a&.e,(a.#0a- *a,a *e,-#-.#, dad)- c)') e' a,+/#0)- XML a,+/#0)- .e2.) e e.c
Ma*ea'e(.) Ob$e.) Re&ac#)(a& ORM Ma*ea'e(.) )b$e.) ,e&ac#)(a& &b!ec+7)e#a+&%a# $a''%g ORM ORM )/ OR 'a**#(! : /'a .:c(#ca de *,)!,a'a98) *a,a c)(0e,-8) de dad)- e(.,e ba(c) de dad)- ,e&ac#)(a#- e (!/a!e(- de *,)!,a'a98) ),#e(.ada a )b$e.)- E' ba(c) de dad)- e(.#dade- -8) ,e*,e-e(.ada- *), .abe&a- +/e *)--/e' c)&/(a+/e a,'a4e(a' *,)*,#edade- de d#0e,-)- .#*)- U'a .abe&a *)de -e a--)c#a, c)' )/.,a- e c,#a, ,e&ac#)(a'e(.)- d#0e,-)- E' /'a (!/a!e' ),#e(.ada a )b$e.)- c)') Ja0a e(.#dade- -8) c&a--e- e )b$e.)de--a- c&a--e- ,e*,e-e(.a' e&e'e(.)- +/e e2#-.e' () '/(d) ,ea& P), e2e'*&) /' -#-.e'a de a./,a'e(.) *)--/# a c&a--e N).aF#-ca& +/e () '/(d) ,ea& e2#-.e e .)d) '/(d) $6 0#/ a&!/'a *e&) 'e()- /'a 0e4 a&:' de *)--/#, /'a c&a--e +/e *)de -e c"a'a, I'*)-.) +/e #(e'e(.e .)d) '/(d) -e(.e () b)&-) E--a- c&a--e- -8) www.algaworks.com
25
c"a'ada- de c&a--e- de d)'<(#) d) -#-.e'a *)#- a4e' *a,.e d) (e!=c#) +/e e-.6 -e(d) de-e(0)&0#d) E' ba(c) de dad)- *)de')- .e, a- .abe&a- ().a-ca& e .a'b:' #'*)-.) 'aa e-.,/./,a de ba(c) de dad)- ,e&ac#)(a& e-.6 &)(!e de -e, ),#e(.ad) a )b$e.)- e *), #--) a ORM )# #(0e(.ada *a,a -/*,#, a (ece--#dade +/e )- de-e(0)&0ed),e- .;' de 0#-/aa, ./d) c)') )b$e.)- *a,a *a,a *,)!,a'a,e' *,)!,a'a,e' c)' 'a#- ac#dade P)de')- c)'*a,a, ) ')de&) ,e&ac#)(a& c)' ) ')de&) ),#e(.ad) a )b$e.)- c)(),'e a .abe&a aba#2) M&de# &de#& & (e# (e#ac ac& &%a %a##
M&de# &de#& & OO OO
Tabe&a
C&a--e
L#("a
Ob$e.)
C)&/(a
A.,#b/.)
M:.)d)
C"a C"a0e e-., e-.,a( a(!!e#,a e#,a
A--) A--)c# c#a9 a98) 8)
E--a c)'*a,a98) : e#.a e' .)d) ) .e'*) +/e -e e-.6 de-e(0)&0e(d) /-a(d) a&!/' 'eca(#-') de ORM O 'a*ea'e(.) : e#.) /-a(d) 'e.adad)- +/e de-c,e0e' a ,e&a98) e(.,e )b$e.)- e ba(c) de dad)- U'a -)&/98) ORM c)(-#-.e de /'a API *a,a e2ec/.a, )*e,a9?e- CRUD -#'*&e- e' )b$e.)- de c&a--e- *e,-#-.e(.e- /'a (!/a!e' )/ API *a,a e-*ec#ca, +/e,#e- +/e -e ,ee,e' a c&a--e- e *,)*,#edade- de c&a--e- ac#dade- *a,a e-*ec#ca, 'e.adad)- de 'a*ea'e(.) e .:c(#ca- *a,a #(.e,a!#, c)' )b$e.)- .,a(-ac#)(a#- *a,a #de(.#ca,e' a/.)'a.#ca'e(.e a&.e,a9?e- ,eaada- ca,,e!a'e(.) de a--)c#a9?e- *), de'a(da e )/.,a- /(9?e- de ).#'#4a98) E' /' a'b#e(.e ORM a- a*ca9?e- #(.e,a!e' c)' API- e ) ')de&) de c&a--ede d)'< d)'<(# (#)) e )- c=d# c=d#!!)- SQL SQLJD JDBC BC -8) -8) ab-. ab-.,,a
www.algaworks.com
26
P),+/e /-a, ORM U'a #'*&e'e(.a98) ORM : 'a#- c)'*&e2a +/e )/.,) ,a'e1),% +/a&+/e, *a,a de-e(0)&0#'e(.) 1eb *),:' )- be(e
Ja0a Pe,-#-.e(ce API e H#be,(a.e Ja-a Pe)**+e%ce API JPA A Ja-a JPA : /' ,a'e1),% *a,a *e,-#-.;(c#a e' Ja0a +/e )e,ece /'a API de 'a*ea'e(.) )b$e.),e&ac#)(a& e -)&/9?e- *a,a #(.e!,a, *e,-#-.;(c#a c)' -#-.e'a- c),*),a.#0)- e-ca&60e#-
C)' JPA )- )b$e.)- -8) POJO P#a% O#d Ja-a Ob!ec+* )/ -e$a (8) : (ece--6,#) (ada de e-*ec#a& *a,a .),(a, )- )b$e.)- *e,-#-.e(.e- *e,-#-.e(.e- Ba-.a ad#c#)(a, a&!/'a- a().a9?e- (ac&a--e- +/e ,e*,e-e(.a' a- e(.#dade- d) -#-.e'a e c)'e9a, a *e,-#-.#, )/ c)(-/&.a, )b$e.)- JPA JPA : /'a e-*ec#ca98) e (8) /' *,)d/.) *,)d/.) Pa,a .,aba&"a, c)' JPA JPA *,ec#-a')- de /'a #'*&e'e(.a98)
www.algaworks.com
27
O *,)$e.) d) H#be,(a.e ORM *)--/# a&!/(- '=d/&)- -e(d) +/e ) Hbe(%a*e E%**/Ma%age( : a #'*&e'e(.a98) da JPA +/e e(ca*-/&a ) H#be,(a.e C),e O Hbe(% Hbe(%a* a*e e C&(e C&(e : a ba-e *a,a ) /(c#)(a'e(.) da *e,-#-.;(c#a c)' API- (a.#0ae 'e.adad)- de 'a*ea'e(.)- e' a,+/#0)- XML P)--/# /'a (!/a!e' de c)(-/&.ac"a'ada HQL *a,ec#d) c)' SQL /' c)($/(.) de #(.e,ace- *a,a c)(-/&.a- /-a(d) c,#.:,#)- C,#.e,#a API e.c Ne-.e ,) e-./da,e')- a*e(a- ) b6-#c) de JPA e H#be,(a.e *a,a #'*&e'e(.a,')e2e'*&)- 'a#- #(.e,e--a(.e- c)' Se,0&e.- e JSP c)' ace--) a) ba(c) de dad)-
D)1(&)ad e c)(!/,a98) d) H#be,(a.e ORM Va') Va')- a4e, ) d)1(&)ad d) H#be,(a.e ORM () -#.e "..*"#be,(a.e), "..*"#be,(a.e),!! O a,+/#0) ),(ec#d) () -#.e *)--/# .)d)- )- '=d/&)- e de*e(d;(c#a- (ece--6,#a-
De*)#- de c)(c&/#, ) d)1(&)ad de-c)'*ac.e ) a,+/#0) C)') /-a,e')- ) M3SQL (e-.e c/,-) *,ec#-a,e')- .a'b:' d) d,#0e, JDBC de-.e SGBD Ba#2e ) d,#0e, e' "..*de0'3-+&c)'d)1(&)ad-c)((ec.),$ e de-c)'*ac.e ) a,+/#0)
www.algaworks.com
28
A!),a *,ec#-a')- #(c&/#, a- b#b).eca- ba#2ada- e' ()--) *,)$e.) E' ()--) *,)$e.) 1eb c+/e c)' ) b).8) d#,e#.) ace--e B+#d Pa*h e de*)#- C&%5g+(e B+#d Pa*h888
Ace--e a aba Lb(a(e) Ne-.a aba *)de')- c)(!/,a, +/a#- a,+/#0)- JAR ca,8) () b,#d 'a+h d) *,)$e.) Ve$a +/e /'a b#b).eca d) Ja0a SE e )/.,a d) T)'ca. $6 e-.8) *,e-e(.e- C+/e () b).8) Add Lb(a(/888
Na .e&a Add Lb(a(/ -e&ec#)(e U)e( Lb(a(/ e c+/e e' Ne.*
www.algaworks.com
29
N8) .e')- (e("/'a b#).eca de /-/6,#) *a,a ad#c#)(a, a) *,)$e.) C+/e e' U)e( Lb(a(e)888 *a,a c,#a,')- /'a
A!),a c+/e e' Ne-888
I(),'e /' ()'e *a,a a b#b).eca Ne-.e ca-) c)&)ca')- Pe,-#-.e(c#a JPA +/e a,6 ,ee,;(c#a a .)d)- )- JAR- (ece--6,#)- *a,a .,aba&"a, c)' JPA H#be,(a.e e M3SQL
N)--a b#b).eca de /-/6,#) a#(da e-.6 0a4#a -e' JAR- C+/e () b).8) Add E.*e(%a# JAR)888
www.algaworks.com
30
Ad#c#)(e .)d)- )- JAR- da *a-.a #b9)e(,)ed e #b9!'a d) H#be,(a.e Ad#c#)(e .a'b:' ) JAR d) d,#0e, d) M3SQL C+/e e' OK e de*)#- e' F%)h
P,ec#-a')- d#4e, a) Ec*-e *a,a ad#c#)(a, )- JAR- da ()--a b#b).eca de /-/6,#) (a *a-.a WEB7INF9#b d) *,)$e.) +/a(d) e&e ), #'*&a(.ad) () T)'ca. Na*,)*,#edade- d) *,)$e.) ace--e De'#&/$e%* A))e$b#/ e c+/e () b).8) Add888 Se&ec#)(e Ja,a B+#d Pa*h E%*(e) e c+/e e' Ne.*
www.algaworks.com
31
Se&ec#)(e a b#b).eca de /-/6,#) +/e c,#a')- c+/e e' F%)h e OK
A!),a ()--) *,)$e.) $6 *)--/# a- b#b).eca- (ece--6,#a- *a,a .,aba&"a, c)' JPA H#be,(a.e e M3SQL
www.algaworks.com
32
C,#a98) d) D)'a#( M)de& E' ()--) *,)$e.) de e2e'*&) #'*&e'e(.a,e')- /' c)(.,)&e de e-.)+/e -#'*&e- A(.e- de +/a&+/e, c)#-a *,ec#-a')- c,#a, ()--) ')de&) de d)'<(#) *a,a ) (e!=c#) e' +/e-.8) I(#c#a&'e(.e ()--) -#-.e'a *)--/#,6 /'a c&a--e -#'*&e- c"a'ada Produto +/e ,e*,e-e(.a a e(.#dade *,)d/.) (a 0#da ,ea& package com.algaworks.estoque.model; import java.math.BigDecimal; public class Produto { private Long id; private String nome; private Integer quantidadeEstoque; private BigDecimal precoCusto; public Long getId() { return id;
} public void setId(Long id) { this.id = id;
} public String getNome() { return nome;
} public void setNome(String nome) { this.nome = nome;
} public Integer getQuantidadeEstoque() { return quantidadeEstoque;
} public void setQuantidadeEstoque(Integer quantidadeEstoque ) { this.quantidadeEstoque = quantidadeEstoque;
} public BigDecimal getPrecoCusto() { return precoCusto;
} public void setPrecoCusto(BigDecimal precoCusto) { this.precoCusto = precoCusto;
}
www.algaworks.com
33
}
O a.,#b/.) #de(.#cad), c"a'ad) de id : ,ee,e(.e 5 c"a0e *,#'6,#a () ba(c) de dad)- Se e2#-.#,e' d/a- #(-.7(c#a- de Produto c)' ) 'e-') #de(.#cad), e&e,e*,e-e(.a' a 'e-'a ("a () ba(c) de dad)- A- c&a--e- de e(.#dade- de0e' -e!/#, ) e-.#&) de Ja0aBea(- c)' ':.)d)- ge++e)* e *e++e)* É )b,#!a.=,#) +/e e-.a c&a--e *)--/a /' c)(-.,/.), -e' a,!/'e(.)-
I'*&e'e(.a98) d) e+/a&- e "a-"C)de Pa,a +/e )- )b$e.)- de e(.#dade- -e$a' d#e,e(c#ad)- /(- de )/.,)- *,ec#-a')#'*&e'e(.a, )- ':.)d)- equals() e hashCode() N) ba(c) de dad)- a- c"a0e- *,#'6,#a- d#e,e(c#a' ,e!#-.,)- d#-.#(.)- Q/a(d) 'a*ea')- /'a e(.#dade de /'a .abe&a de0e')- c,#a, )- ':.)d)- equals() e hashCode() &e0a(d) e' c)(-#de,a98) a ),'a e' +/e )- ,e!#-.,)- -8) d#e,e(c#ad)() ba(c) de dad)- O Ec*-e *)--/# /' !e,ad), de--e- ':.)d)- +/e /-a /'a *,)*,#edade )/ 06,#a- #(),'ada- *), 0)c; *a,a c,#a, ) c=d#!))(.e Ve$a c)') de0e ca, a #'*&e'e(.a98) d)- ':.)d)- *a,a a e(.#dade Produto @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Produto other = (Produto) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false;
www.algaworks.com
34
return true;
}
A!),a ) H#be,(a.e c)(-e!/#,6 c)'*a,a, )b$e.)- *a,a de-c)b,#, -e -8) )- 'e-')-
Ma*ea'e(.) b6-#c) Pa,a +/e ) 'a*ea'e(.) )b$e.),e&ac#)(a& /(c#)(e *,ec#-a')- #(),'a, 5 #'*&e'e(.a98) d) JPA 'a#- #(),'a9?e- -)b,e c)') a c&a--e Produto de0e -e .),(a, *e,-#-.e(.e )/ -e$a c)') #(-.7(c#a- de--a c&a--e *)de' -e, !,a0ada- e c)(-/&.ada- () ba(c) de dad)- Pa,a #--) de0e')- a().a, )- ge++e)* )/ )- a.,#b/.)- a&:' da *,=*,#a c&a--e package com.algaworks.estoque.model; import java.math.BigDecimal; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id ;
@Entity @Table(name = "produto") public class Produto { private Long id; private String nome; private Integer quantidadeEstoque; private BigDecimal precoCusto;
@Id @GeneratedValue public Long getId() { return id; } public void setId(Long id) { this.id = id;
} @Column(nullable = false) public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome;
}
www.algaworks.com
35
@Column(name = "quantidade_estoque", nullable = false) public Integer getQuantidadeEstoque() { return quantidadeEstoque; } public void setQuantidadeEstoque(Integer quantidadeEstoque ) { this.quantidadeEstoque = quantidadeEstoque;
} @Column(name = "preco_custo", precision = 10, scale = 2, nullable = false) public BigDecimal getPrecoCusto() { return precoCusto; } public void setPrecoCusto(BigDecimal precoCusto) { this.precoCusto = precoCusto;
} // hashCode e equals
}
V)c; de0e .e, *e,ceb#d) +/e a- a().a9?e- ),a' #'*),.ada- d) *ac).e javax.persistence De(.,) de--e *ac).e e-.8) .)da- a- a().a9?e- *ad,)(#4ada- *e&a JPA A a().a98) @Entity d#4 +/e a c&a--e : /'a e(.#dade +/e ,e*,e-e(.a /'a .abe&a d) ba(c) de dad)- e @Table de(e de.a&"e- da .abe&a () ba(c) de dad)- c)') *), e2e'*&) ) ()'e da .abe&a @Entity @Table(name = "produto") public class Produto {
A- a().a9?e- ()- ':.)d)- ge++e)* c)(!/,a' a ,e&a98) d)- a.,#b/.)- da c&a--e c)' a- c)&/(a- d) ba(c) de dad)- A- a().a9?e- @Id e @GeneratedValue -8) /-ada- *a,a dec&a,a, ) #de(.#cad), d) ba(c) de dad)- e e--e #de(.#cad), de0e .e, /' 0a&), !e,ad) () ')'e(.) de #(-e,98) a/.)#(c,e'e(.) @Id @GeneratedValue public Long getId() { return id; }
De(#')- +/e a *,)*,#edade nome (8) ace#.a 0a&),e- (/&)- )/ -e$a +/e,e')- c,#a, /'a ,e-.,#98) %&+ %,## () ba(c) de dad)- C)') (8) #(),'a')- ) ()'e da c)&/(a () ba(c) de dad)- e&a ,ecebe,6 ) 'e-') ()'e da *,)*,#edade www.algaworks.com
36
@Column(nullable = false) public String getNome() { return nome; }
A *,)*,#edade quantidadeEstoque de0e -e, ,e*,e-e(.ada *), /'a c)&/(a de ()'e quantidade_estoque e .a'b:' : %&+ %,## @Column(name = "quantidade_estoque", nullable = false) public Integer getQuantidadeEstoque() { return quantidadeEstoque; }
A.,#b/<')- a *,ec#-8) de 10 c)' e-ca&a de 2 ca-a- (a c)&/(a de (@'e,) dec#'a& @Column(name = "preco_custo", precision = 10, scale = 2, nullable = false) public BigDecimal getPrecoCusto() { return precoCusto; }
Y O a,+/#0) *e,-#-.e(ce2'& O 'e)**+e%ce6/$# : /' a,+/#0) de c)(!/,a98) *ad,8) da JPA E&e de0e -e, c,#ad) () d#,e.=,#) META7INF da a*ca98) )/ d) '=d/&) +/e c)(.:' )- bea(- de e(.#dade N) Ec*-e )*c#)(a&'e(.e 0)c; *)de ad#c#)(a, ) P)&!ec+ Face+ JPA () -e/ *,)$e.) +/e a e-.,/./,a b6-#ca de--e a,+/#0) : c,#ada a/.)'a.#ca'e(.e a&:' de .e, )/.,aac#dade- O a,+/#0) 'e)**+e%ce6/$# de(e /(#dade- de *e,-#-.;(c#a c)("ec#da- c)') 'e)**+e%ce ,%+*
org.hibernate.ejb.HibernatePersistence
www.algaworks.com
37
value="senha" />
value="org.hibernate.dialect.MySQL5Dialect" />
O ()'e da /(#dade de *e,-#-.;(c#a )# de(#d) c)') EstoquePU P,ec#-a,e')- de--e ()'e da+/# a *)/c) +/a(d) ),')- c)&)ca, ./d) *a,a /(c#)(a, O provider d#4 +/a& : a #'*&e'e(.a98) +/e -e,6 /-ada c)') *,)0ed), de *e,-#-.;(c#a E2#-.e' 06,#a- )*9?e- de c)(!/,a98) +/e *)de' -e, #(),'ada- (e-.e a,+/#0) XML Ve$a')- a- *,#(c#*a#- *,)*,#edade- +/e /-a')- e' ()--) a,+/#0) de c)(!/,a98) javax.persistence.jdbc.url de-c,#98) da URL de c)(e28) c)' ) ba(c) de dad)- javax.persistence.jdbc.driver ()'e c)'*&e.) da c&a--e d) d,#0e, JDBC javax.persistence.jdbc.user ()'e d) /-/6,#) d) ba(c) de dad) javax.persistence.jdbc.password -e("a d) /-/6,#) d) ba(c) de dad) hibernate.dialect d#a&e.) a -e, /-ad) (a c)(-.,/98) de c)'a(d)- SQL hibernate.show_sql #(),'a -e )- c)'a(d)- SQL de0e' -e, e2#b#d)- (a c)(-)&e #'*),.a(.e *a,a deb,g 'a- de0e -e, de-ab#.ad) e' a'b#e(.e de *,)d/98) hibernate.format_sql #(d#ca -e )- c)'a(d)- SQL e2#b#d)- (a c)(-)&e de0e' -e, ),'a.ad)- ac#.a a c)'*,ee(-8) 'a- *)de !e,a, .e2.)- &)(!)(a -a
Ge,a(d) a- .abe&a- d) ba(c) de dad)C)') a#(da (8) .e')- a .abe&a ,e*,e-e(.ada *e&a c&a--e Produto () ba(c) de dad)- *,ec#-a')- c,#6&a www.algaworks.com
38
O H#be,(a.e *)de a4e, #--) *,a !e(.e !,a9a- 5 *,)*,#edade hibernate.hbm2ddl.auto c)' 0a&), update +/e #(c&/<')- () a,+/#0) 'e)**+e%ce6/$# P,ec#-a')- a*e(a- c,#a, /' EntityManagerFactory +/e .)da- a- .abe&a- 'a*eada*e&a- e(.#dade- -e,8) c,#ada- )/ a./aada- import javax.persistence.Persistence; public class CriaTabelas { public static void main(String[] args) {
Persistence.createEntityManagerFactory("EstoquePU"); } }
O *a,7'e.,) d) ':.)d) createEntityManagerFactory de0e -e, ) 'e-') ()'e +/e #(),'a')- () a.,#b/.) name da +ag persistence-unit () a,+/#0) 'e)**+e%ce6/$# A) e2ec/.a, ) c=d#!) a .abe&a produto : c,#ada ... Set 26, 2013 3:48:57 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000228: Running hbm2ddl schema update Set 26, 2013 3:48:57 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000102: Fetching database metadata Set 26, 2013 3:48:57 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000396: Updating schema Set 26, 2013 3:48:57 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata INFO: HHH000262: Table not found: produto Set 26, 2013 3:48:57 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata INFO: HHH000262: Table not found: produto Set 26, 2013 3:48:57 PM org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata INFO: HHH000262: Table not found: produto Set 26, 2013 3:48:57 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000232: Schema update complete
P,=2#')- *a--) J6 .e')- ()--a e(.#dade Produto 'a*eada e a .abe&a c,#ada () ba(c) de dad)- P,ec#-a,e')- *e,-#-.#, )b$e.)- c)(-/&.a, e2c&/#, e a./aa, 'a- de#2a,e')- *a,a a*,e-e(.a, c)') /(c#)(a e--e- de.a&"e- a*e(a- +/a(d) ), (ece--6,#) *)#- e-.e (8) : /' ,) de JPA )%
www.algaworks.com
39
Ca*<./&)
Se,0&e. O +/e -8) Se,0&e.- Se,0&e.- -8) *,)!,a'a- +/e e-.e(de' a /(c#)(adade de /' 1eb -e,0e, !e,a(d) c)(.e@d) d#(7'#c) e #(.e,a!#(d) c)' )- ce(.e- /.#a(d) ) ')de&) )e(,e*+7 )e*'&%*e A- -e,0&e.- (8) -8) ,e-.,#.a- a) ')de&) HTTP )(de (a ,eadade -8) *e+/e(a- a*ca9?e- -e,0#d),a- 'a- ) ')de&) HTTP : ) ')de&) 'a#- /.#ad) Se,0&e.- -8) c&a--e- Ja0a de-e(0)&0#da- de ac),d) c)' /'a e-.,/./,a be' de(#da e +/e +/a(d) #'*&a(.ada- e' /' -e,0#d), +/e #'*&e'e(.e /' Se,0&e. C)(.a#(e, *)de' .,a.a, ,e+/#-#9?e- ,eceb#da- de ce(.e- A) ,ecebe, /'a ,e+/#-#98) /' Se,0&e. *)de ca*./,a, *a,7'e.,)- de-.a ,e+/#-#98) ee./a, +/a&+/e, *,)ce--a'e(.) e de0)&0e, /'a *6!#(a HTML )/ +/a&+/e, )/.,) ),'a.)
P,#'e#,a -e,0&e. Pa,a c,#a, /'a -e,0&e. c+/e c)' ) b).8) d#,e#.) () *,)$e.) ace--e Ne- e c+/e e' Se(,#e* P,ee(c"a a- #(),'a9?e- c)') ) *ac).e e ) ()'e da c&a--e da -e,0&e.
www.algaworks.com
40
O Ec*-e #,6 !e,a, a&!/(- c)'e(.6,#)- e c=d#!)- de-(ece--6,#)- *a,a ) ')'e(.) De#2e ) c=d#!) *a,ec#d) c)' e-.e package com.algaworks.servlet; import java.io.IOException; import import import import import
javax.servlet.ServletException; javax.servlet.annotation.WebServlet; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;
@WebServlet("/EuSouUmServlet") public class EuSouUmServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { } }
A.: a!),a .e')- /'a -e,0&e. +/e (8) a4 (ada A(.e- de #'*&e'e(.a, /' e2e'*&) -#'*&e- +/e a9a a&!/'a c)#-a 0a')- c)("ece, /' *)/c) a e-.,/./,a da c&a--e da -e,0&e. EuSouUmServlet
www.algaworks.com
41
@WebServlet("/EuSouUmServlet") public class EuSouUmServlet extends HttpServlet {
A a().a98) @WebServlet dec&a,a +/e e-.a c&a--e : /' -e,0&e. e de0e -e, #'*&a(.ada *e&) c)(.a#(e, d/,a(.e a #(#c#aa98) a&:' de #(),'a, +/e ) -e,0&e. : ace--<0e& *e&) ca'#(") 9E,S&,U$Se)-#e+ T)d) -e,0&e. HTTP de0e "e,da, a c&a--e HttpServlet protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { }
O ':.)d) doGet -e,6 c"a'ad) -e'*,e +/e e-.a -e,0&e. ), ace--ad) /-a(d) ) ':.)d)) GET d) *,).)c)&) HTTP O ':.)d) POST c"a'a doPost 'a- (8) #'*&e'e(.a')- e' ()--a -e,0&e. *), #--) e&e (8) -e,6 -/*),.ad) *), e(+/a(.) O*a,7'e.,)- request e response ,ecebe )b$e.)- +/e ),(ece' #(),'a9?e- -)b,e a ,e+/#-#98) e a ,e-*)-.a ,e-*ec.#0a'e(.e A!),a 0a')- #'*&e'e(.a, /'a ,e-*)-.a *a,a ()--a -e,0&e. Se'*,e +/e e&e ), c"a'ad) +/e,e')- de0)&0e, /'a *6!#(a HTML c)' a 'e(-a!e' E/ -)/ /' Se,0&e. protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println(""); out.println(""); out.println("
Eu sou um Servlet
"); out.println(""); out.println(""); }
Pa,a de0)&0e, #(),'a9?e- *a,a +/e' c"a')/ a -e,0&e. *e!a')- /' )b$e.) d) .#*) PrintWriter a.,a0:- d) ':.)d) getWriter da ,e-*)-.a C)' e--e )b$e.) *)de')c"a'a, ) ':.)d) println +/a(.a- 0e4e- ), (ece--6,#) Pa,ece a--/-.ad), Te')- +/e c)&)ca, .a!- HTML de(.,) de c=d#!) Ja0a 'a- +/e .,a(+/#&) +/e a.: ) (a& ./d) ca,6 'a#- 6c#& P)de')- ace--a, ()--a -e,0&e. *e&a URL h++'599#&ca#h&*+5=<=<9P)$e)&P)&!e+&Web9 E,S&,U$Se)-#e+
www.algaworks.com
42
Ma*ea'e(.) de -e,0&e. C"a'a')- ()--a *,#'e#,a -e,0&e. *e&a URI 9P)$e)&P)&!e+&Web9E,S&,U$Se)-#e+ P)de')- a&.e,a, e-.e e(de,e9) *a,a /' )/.,) +/a&+/e, #(c&/#(d) a.: e2.e(-?e- +/e (8) .;' (ada "a0e, c)' -e,0&e.- P), e2e'*&) @WebServlet("/eu-sou-um-servlet.html") public class EuSouUmServlet extends HttpServlet { ... }
A!),a *)de')- c"a'a, a -e,0&e. a&.e,a(d) ) ca'#(") *a,a 9P)$e)&P)&!e+&Web9e,7 *&,7,$7*e)-#e+6h+$# A&:' de /' e(de,e9) 2) *)de')- 'a*ea, /' *ad,8) de URL Ve$a ) e2e'*&) aba#2) @WebServlet("*.exe") public class EuSouUmServlet extends HttpServlet {
... } www.algaworks.com
43
C)' e--e ()0) 'a*ea'e(.) (,a#(,e)7c&*a6e/e e(ca'#("a,6 a ,e+/#-#98) *a,a a -e,0&e. EuSouUmServlet *), e2e'*&) a#*d"46e/e )/ ')&g)a$a6e/e
Ca'#(") d) c)(.e2.) Cada a*ca98) 1eb #'*&a(.ada e' /' -e,0&e. c)(.a#(e, ,ecebe /' c&%+e/+ 'a+h @(#c) O c&%+e/+ 'a+h a4 *a,.e da URI +/e /-a')- *a,a ace--a, ,ec/,-)- de /'a a*ca98) P), e2e'*&) a) ace--a,')- 9P)$e)&P)&!e+&Web9E,S&,U$Se)-#e+ 9P)$e)&P)&!e+&Web : ) c&%+e/+ 'a+h da a*ca98) P), *ad,8) ) Ec*-e de(e ) c&%+e/+ 'a+h c)' ) 'e-') ()'e d) *,)$e.) 'a*)de')- a&.e,a, #--) (a- *,)*,#edade- d) *,)$e.) )*98) Web P(&!ec* Se**%g) ca'*) C&%*e.* (&&*
Se a&.e,a,')- ) c&%+e/+ 'a+h *a,a P,#'e#,)P,)$e.) *)de')- ace--a, ()--a -e,0&e. *e&a URI 9P)$e)&P)&!e+&9E,S&,U$Se)-#e+
www.algaworks.com
44
C,#a(d) E(.#.3Ma(a!e, O-
-#-.e'a-
+/e
/-a' JPA *,ec#-a' de a*e(a- /'a #(-.7(c#a de EntityManagerFactory E-.a @(#ca #(-.7(c#a *)de -e, /-ada *), +/a&+/e, c=d#!) +/e +/e#,a )b.e, /' EntityManager U' EntityManager : ,e-*)(-60e& *), !e,e(c#a, e(.#dade- () c)(.e2.) de *e,-#-.;(c#a A.,a0: A.,a0:- d)- ':.)d)':.)d)- de--a #(.e,ace #(.e,ace : *)--<0e& *e,-#-.#, *e,-#-.#, *e-+/#-a, e e2c&/#, )b$e.))b$e.)- d) ba(c) de dad)- A #(#c#aa98) de EntityManagerFactory *)de de'),a, a&!/(- -e!/(d)- *), #--) a #(-.7(c#a de--a #(.e,ace de0e -e, c)'*a,.#&"ada (a a*ca98) P,ec#-a,e')- de /' &/!a, *a,a c)&)c &)ca, a #(-.7(c#a c)'* '*aa,.#& .#&"ada de EntityManagerFactory )(de +/a&+/e, c=d#!) .e("a ace--) 6c#& e ,6*#d) C,#a,e')a c&a--e JpaUtil *a,a a,'a4e(a, a #(-.7(c#a e' /'a 0a,#60e& e-.6.#ca public class JpaUtil {
EntityManagerFactory factory ; private static EntityManagerFactory static {
factory = factory = Persistence Persistence. .createEntityManagerFactory createEntityManagerFactory( ("EstoquePU" "EstoquePU"); ); } EntityManager getEntityMan getEntityManager ager() () { public static EntityManager factory .createEntityManager createEntityManager(); (); return factory. } }
C,#a')- /' b&)c) e-.6.#c) *a,a #(#c#aa, a 6b,#ca de E%++0 Ma%age) I--) )c),,e,6 a*e(a- /'a 0e4 () ca,,e!a'e(.) da c&a--e A!),a -e'*,e +/e *,ec#-a,')- de /'a EntityManager *)de')- c"a'a, EntityManager EntityManager manager = manager = JpaUtil JpaUtil. .getEntityManager getEntityManager(); ();
Se,0&e. Se, 0&e. +/e c)(-/&.a *,)d/.)*,)d/.)C,#a,e')- /'a -e,0&e. +/e c)(-/&.a )- *,)d/.)- () ba(c) de dad)- e e2#be a ,e&a98) e' /'a *6!#(a HTML Pa,a #--) *,ec#-a')- #(c&/#, a&!/(- *,)d/.)- (a .abe&a produto E2ec/.a,e')- ) c)'a(d) SQL aba#2) () ba(c) de dad)- d) -#-.e'a de e-.)+/e
www.algaworks.com
45
quantidade_estoque) insert into produto (nome, preco_custo, quantidade_estoque) insert ('Feijão', , 5 5. .3, 10 10), ), ('Sabonete' ('Sabonete', , 1 1. .8, 35 35), ), values ('Feijão' ('Arroz' 'Arroz', , 8 8. .9, 101 101), ), ('Cerveja' ('Cerveja', , 3 3. .5, 242 242), ), ('Água' ('Água', , 1 1. .2, 29 29); );
Pe)**+e%ce P)de')- c)(-/&.a, )b$e.)- de e(.#dade- JPA c)' a (!/a!e' JPQL Ja-a Pe)**+e%ce Q,e)0 La%g,age A JPQL : /'a e2.e(-8) da SQL *),:' c)' ca,ac.e,<-.#ca- da ),#e(.a98) a )b$e.)- C)' e--a (!/a!e' (8) ,ee,e(c#a')- .abe&a- d) ba(c) de dad)- 'a- a*e(a- e(.#dade- de ()--) ')de&) +/e ),a' 'a*eada- *a,a .abe&a-
Q/a(d) a4e')- *e-+/#-a- e' )b$e.)- (8) *,ec#-a')- -e&ec#)(a, a- c)&/(a- d) ba(c) de dad)- c)') : ) ca-) de SQL O c=d#!) e' SQL a -e!/#, produto select * from produto
F#ca da -e!/#(.e ),'a e' JPQL Produto from Produto
A -#(.a2e ac#'a e' JPQL -#!(#ca +/e +/e,e')- b/-ca, )- )b$e.)- *e,-#-.e(.e- da e(.#dade Produto Pa,a a4e, /'a c)(-/&.a /-a(d) JPQL *e!a')- /'a #(-.7(c#a de EntityManager e c"a'a')- ) ':.)d) createQuery *a--a(d) c)') *a,7'e.,) a -.,#(! da (,e)0 e ) .#*) e-*e,ad) c)') ,e.),() O ,e.),() -e,6 d) .#*) TypedQuery +/e *)de')- /-a, *a,a )b.e, /'a -.a c)' ) ,e-/&.ad) da c)(-/&.a a.,a0:- d) ':.)d) getResultList EntityManager EntityManager manager = manager = JpaUtil JpaUtil. .getEntityManager getEntityManager(); (); TypedQuery< TypedQuery
Produto> query = query = manager manager. .createQuery createQuery( ("from Produto", Produto" , Produto. Produto.class class); ); List< List Produto> produtos = produtos = query query. .getResultList getResultList(); ();
Sabe(d) d#--) *)de')- #'*&e'e(.a, a -e,0&e. +/e c)(-/&.a )- *,)d/.)- () ba(c) de dad)- e ')(.a ) HTML d#(a'#ca'e(.e +/e : e(0#ad) *a,a ) /-@a,#) a.,a0:- da ,e-*)-.a da ,e+/#-#98) @WebServlet( @WebServlet ("/consulta-produtos" "/consulta-produtos") ) HttpServlet { public class ConsultaProdutosServlet extends HttpServlet { serialVersionUID = = 1L; private static final long serialVersionUID void doGet( (HttpServletRequest HttpServletRequest request, request , protected void doGet HttpServletResponse HttpServletResponse response) response ) ServletException, , IOException { IOException { throws ServletException PrintWriter out = out = response response. .getWriter getWriter(); (); EntityManager manager = manager = JpaUtil JpaUtil. .getEntityManager getEntityManager(); (); try { // consulta os produtos
www.algaworks.com
46
TypedQuery< TypedQuery Produto> query = query = manager. manager.createQuery createQuery( ("from Produto", Produto" , Produto. Produto .class class); ); List< List Produto> todosProdutos todosProdutos = = query query. .getResultList getResultList(); (); // imprime a abertura das tags html e body
out. out.println println( ("" ""); ); out. out.println println( ("" ""); ); // imprime a abertura da tag table e linha do cabeçalho
out. out.println println( ("" >"); ); out. out.println println( ("Nome | Preço | " + "Quanti " | Quantidade |
" >" ); // imprime cada linha da tabela
(Produto Produto produto : produto : todosProdutos todosProdutos) ) { for ( out. out.println println( ("" "
"); ); out. out.println println( ("" " | " + + produto produto. .getNome getNome() () + " | " + ""); ); out. out.println println( ("" " | " + + produto produto. .getPrecoCusto getPrecoCusto() () + " | " ""); ); out. out.println println( ("" " | " + + produto produto. .getQuantidadeEstoque getQuantidadeEstoque() () + " | " ""); ); out. out.println println( ("
" ""); ); } // imprime o fechamento da tabela e das tags body e html
out. out.println println( ("
" ""); ); out. out.println println( ("" ""); ); out. out.println println( ("" ""); ); } finally { manager. manager.close close(); (); } } }
h++'599#&ca#h&*+5=<=<9E*+&(,e9c&%*,#+a7')&d,+ &(,e9c&%*,#+a7')&d,+&* &* P)de')- ace--a, a -e,0&e. *e&a URL h++'599#&ca#h&*+5=<=<9E*+ e 0e, ) ,e-/&.ad) da c)(-/&.a
www.algaworks.com
47
O *ad,8) Re*)-#.),3 N) @&.#') e2e'*&) '#-./,a')- c=d#!) de ace--) a dad)- c)' ')(.a!e' de HTML (a -e,0&e. Se c)(.#(/6--e')- a4e(d) #--) c"e!a,#a /'a "),a +/e (e' (=- 'e-')e(.e(de,
public class Produtos {
www.algaworks.com
48
private EntityManager manager; public Produtos(EntityManager manager) { this.manager = manager;
} public List todos() {
TypedQuery query = manager.createQuery("from Produto", Produto.class); return query.getResultList(); } }
O c)(-.,/.), d) ,e*)-#.=,#) Produtos ,ecebe,6 /' E%++0 Ma%age) )/ -e$a (8) : ,e-*)(-ab#dade d) ,e*)-#.=,#) )b.e, /' E%++0 Ma%age) O ':.)d) todos a4 a c)(-/&.a de .)d)- )- *,)d/.)- e ,e.),(a /' List A!),a a&.e,a')- ()--a -e,0&e. *a,a /-a, ) ,e*)-#.=,#) Produtos protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); EntityManager manager = JpaUtil.getEntityManager(); Produtos produtos = new Produtos(manager); try { // consulta os produtos
List todosProdutos = produtos.todos(); ...
Ta&0e4 0)c; a#(da (8) c)(-#!a 0e, /'a !,a(de 0a(.a!e' e' /-a, e-.e *ad,8) *)#()--) e2e'*&) a#(da : '/#.) -#'*&e- 'a- a 'ed#da +/e ) *,)$e.) ), c,e-ce(d) ) /-) de ,e*)-#.=,#)- c)'e9a,6 a a4e, 'a#- -e(.#d)
Pa,7'e.,)- de ,e+/#-#98) E' +/a&+/e, -#-.e'a +/e de-e(0)&0a')- *,ec#-a,e')- *e!a, *a,7'e.,)- d)/-/6,#)- *a,a ,eaa, )*e,a9?e- d#0e,-a- c)') *), e2e'*&) cada-.,a, () ba(c) de dad)- &.,a, /'a c)(-/&.a e.c Pa,a )b.e, /' *a,7'e.,) da ,e+/#-#98) a *a,.#, de /'a -e,0&e. *)de')- /-a, ) ':.)d) getParameter de HttpServletRequest www.algaworks.com
49
Va')- 'e&"),a, /' *)/c) ()--a c)(-/&.a de *,)d/.)- ad#c#)(a(d) /' &.,) de ()'e d) *,)d/.) P), e2e'*&) -e a URI c"a'ada ), 9E*+&(,e9c&%*,#+a7 ')&d,+&*8%&$e>e! a c)(-/&.a de0e ,e.),(a, .)d)- )- *,)d/.)- +/e *)--/e' e#$ () ()'e c)') ) Fe#$8) O c)(.e@d) *a--ad) de*)#- d) -#(a& ? #(.e,,)!a98) : c"a'ad) de (,e)0 *+)%g Na c&a--e Produtos #'*&e'e(.a,e')- ) ':.)d) porNomeNaoExato +/e ,e.),(a a -.a de *,)d/.)- c)(-/&.ad)- a *a,.#, de /' ()'e *a--ad) c)') *a,7'e.,) public List porNomeNaoExato(String nome) {
TypedQuery query = manager.createQuery( "from Produto where upper(nome) like upper(:nome)" , Produto.class); query.setParameter("nome", "%" + (nome == null ? "" : nome) + "%"); return query.getResultList(); }
Na -e,0&e. ConsultaProdutosServlet *e!a')- ) *a,7'e.,) da ,e+/#-#98) e a.,#b/#')- 5 0a,#60e& nome De*)#- c"a'a')- ) ':.)d) porNomeNaoExato d) ,e*)-#.=,#) protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); EntityManager manager = JpaUtil.getEntityManager(); Produtos produtos = new Produtos(manager); String nome = request.getParameter("nome"); System.out.println(request.getQueryString ()); try { // consulta os produtos
List todosProdutos = produtos.porNomeNaoExato(nome); ...
P)de')- ace--a, a URL h++'599#&ca#h&*+5=<=<9E*+&(,e9c&%*,#+a7')&d,+&*8%&$e>e! *a,a c)(-/&.a, *,)d/.)- +/e *)--/e' e#$ () ()'e
www.algaworks.com
50
O- /-/6,#)- *,ec#-a' de /'a #(.e,ace a'#!60e& *a,a c)(-/&.a, *,)d/.)- *), #--) c,#a,e')- /'a *6!#(a HTML e-.6.#ca c)' /' ),'/&6,#) -#'*&e- +/e ,ecebe ) ()'e d) *,)d/.) e ac#)(a a -e,0&e. <meta charset="UTF-8"> Consulta de produtos
C"a'a')- ) a,+/#0) HTML de c&%*,#+a7')&d,+&*6h+$# e #(c&/<')- (a *a-.a WebC&%+e%+ d) *,)$e.) Pa,a ace--a, ) ),'/&6,#) e(.,e c)' a URL h++'599#&ca#h&*+5=<=<9E*+&(,e9c&%*,#+a7')&d,+&*6h+$# () (a0e!ad),
C)') #(c&/<')- ) a.,#b/.) method="get" () ),'/&6,#) ) *a,7'e.,) -e,6 e(0#ad) *a,a a -e,0&e. *e&a URL 0#a GET
www.algaworks.com
51
Y M:.)d) POST A.: a!),a /-a')- a*e(a- ) ':.)d) GET *a,a e(0#a, ,e+/#-#9?e- HTTP *a,a ()--a -e,0&e. O/.,) ':.)d) '/#.) /-ad) : ) POST +/e e(0#a a (,e)0 *+)%g () c),*) da 'e(-a!e' -e' e2#b#, (a URL E-.e ':.)d) : '/#.) /-ad) *a,a -/b'e.e, ),'/&6,#)de cada-.,) *), e2e'*&) O ':.)d) POST : /' *)/c) 'a#- -e!/,) +/e ) GET *)#- )- *a,7'e.,)- (8) -8) e2#b#d)- (a URL e (e' a,'a4e(ad)- () "#-.=,#c) d) b)&.*e) )/ e' &)!- de ace--) d) -e,0#d), N) ca-) de ()--a c)(-/&.a de *,)d/.)- (8) e2#-.e (e("/' ').#0) *a,a '/da,')*a,a ) ':.)d) POST 'a- a,e')- #--) a*e(a- *a,a /' .e-.e
A&.e,a')- ) ':.)d) d) ()--) ),'/&6,#) *a,a post Se a./aa,')- a *6!#(a d) ),'/&6,#) e .e(.a,')- a4e, /'a ()0a c)(-/&.a a -e,0&e. (8) c)(-e!/#,6 ,e-*)(de,
A 'e(-a!e' de e,,) d#4 +/e ) ':.)d) POST (8) : -/*),.ad) *e&a -e,0&e. P,ec#-a')#'*&e'e(.a, ) ':.)d) doPost (a -e,0&e. 'a- c)') +/e,e')- 'a(.e, ) -/*),.e .a(.) www.algaworks.com
52
c)' GET c)') c)' POST a*e(a- e(ca'#("a,e')- a- ,e+/#-#9?e- *a,a ) ':.)d) doGet a *a,.#, d) ':.)d) doPost protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { ... ... }
Red#,ec#)(a'e(.) de e(0#) Q/a(d) ,ecebe')- /'a ,e+/#-#98) e' /'a -e,0&e. a.,a0:- de ()--a &=!#ca *)de')dec#d#, +/e ) /-/6,#) -e$a ,ed#,ec#)(ad) *a,a /'a )/.,a *6!#(a )/ )/.,a -e,0&e. P)de')- a4e, ) ,ed#,ec#)(a'e(.) de /'a ,e+/#-#98) c)' ) -e!/#(.e c=d#!) response.sendRedirect("outra-pagina.html");
E-.e ':.)d) #,6 e(0#a, /' c=d#!) de ,e.),() 302 *a,a ) (a0e!ad), +/e #,6 ab,#, /'a ()0a ,e+/#-#98) e ace--a, ) ()0) e(de,e9) Va')- a&.e,a, ()--a -e,0&e. de c)(-/&.a de *,)d/.)- *a,a ,ed#,ec#)(a, ) /-/6,#) *a,a /'a ()0a *6!#(a HTML c"a'ada %e%h,$7')&d,+&7e%c&%+)ad&6h+$# ca-) (e("/' *,)d/.) -e$a e(c)(.,ad) <meta charset="UTF-8"> Nenhum produto encontrado
Na -e,0&e. &)!) a*=- a c)(-/&.a de *,)d/.)- () ,e*)-#.=,#) #(c&/<')- /'a 0e,#ca98) e ) ,ed#,ec#)(a'e(.) List todosProdutos = produtos.porNomeNaoExato(nome);
www.algaworks.com
53
if (todosProdutos.isEmpty()) {
response.sendRedirect("nenhum-produto-encontrado.html"); return; }
Se .e(.a,')- *e-+/#-a, *,)d/.)- *), /' ()'e +/e (8) e2#-.e -e,e'),ed#,ec#)(ad)- e a ()0a URL : a*,e-e(.ada (a ba,,a de e(de,e9)- d) (a0e!ad),
V)c; de0e .)'a, c/#dad) *a,a (8) a4e, /' ,ed#,ec#)(a'e(.) de*)#- de e-c,e0e, a ,e-*)-.a C)') ) PrintWriter e-c,e0e *a,a /' b,3e) -e e&e $6 .#0e, de-*e$ad) a&!/'a #(),'a98) (a ,e-*)-.a da ,e+/#-#98) /'a e2ce98) *)de -e, &a(9ada
F#&.,)U' &.,) : /' .#*) de )b$e.) +/e #(.e,ce*.a a- ,e+/#-#9?e- de /' -#-.e'a e *)de de*e(de(d) da (ece--#dade a&.e,a, ) cabe9a&") )/ c)(.e@d) de /'a ,e+/#-#98) )/ ,e-*)-.a F#&.,)- *)de' -e, /-ad)- *a,a a4e, a/.),#4a98) de /-/6,#)- ,e!#-.,a, a9?e- e' a,+/#0)- de &)! c)'*,#'#, )/ c,#*.)!,aa, dad)- e.c V)c; *)de c)(!/,a, ) &.,) *a,a /' ,ec/,-) e-*ec<c) )/ *a,a /' *ad,8) de URL U' 'e-') ,ec/,-) 1eb *)de -e, #(.e,ce*.ad) *), /'a cade#a de d#0e,-)- &.,)- www.algaworks.com
54
N)--) *,#'e#,) &.,) (8) #,6 a&.e,a, (e("/' c)'*),.a'e(.) da a*ca98) *)#- e&e #,6 a*e(a- #'*,#'#, (a -a
@WebFilter("*.html") public class LogAcessoFilter implements Filter { public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; System.out.println("Acessando " + req.getRequestURI()); chain.doFilter(request, response); } public void init(FilterConfig config) throws ServletException {
} public void destroy() {
} }
U' &.,) de0e #'*&e'e(.a, a #(.e,ace Filter O ':.)d) *,#(c#*a& de--a #(.e,ace : ) doFilter E-.e ':.)d) : c"a'ad) a cada #(.e,ce*.a98) d) ,ec/,-) &.,ad) E' ()--) &.,) LogAcessoFilter e-.a')- &.,a(d) :6h+$# )/ -e$a .)da- a,e+/#-#9?e- c)' a e2.e(-8) h+$# De(#')- #--) c)' a a().a98) @WebFilter +/e a4 ) 'a*ea'e(.) d) &.,) A c"a'ada chain.doFilter(request, response) e(ca'#("a *a,a ) *,=2#') &.,) da cade#a Se e-+/ece,')- de a4e, #--) #(.e,,)'*e,e')- a e2ec/98) da ,e+/#-#98) A!),a 0a')- c,#a, /' &.,) +/e ')d#ca ) c)'*),.a'e(.) de ()--a a*ca98) S/*)("a +/e ()--) -#-.e'a (8) *)--a -e, ace--ad) de*)#- da- "),a- P)de,
www.algaworks.com
55
<meta charset="UTF-8"> Expediente encerrado
N)--) ()0) &.,) 0e,#ca -e ) "),6,#) a./a& *e,'#.e ) ace--) e ,ed#,ec#)(a ) /-/6,#) ca-) $6 e-.e$a ),a d) "),6,#) de e2*ed#e(.e C)') a *6!#(a de a0#-) .a'b:' -e,6 #(.e,ce*.ada *e&) &.,) : #'*),.a(.e de#2a, ) /-/6,#) ace--a, a*e(a- e&a () ca-) de "),6,#) ),a d) e2*ed#e(.e @WebFilter("/*") public class HorarioFuncionamentoFilter implements Filter { public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; HttpServletRequest req = (HttpServletRequest) request; Calendar dataAtual = Calendar.getInstance(); if (dataAtual.get(Calendar.HOUR_OF_DAY) >= 20
&& !req.getRequestURI().endsWith( "/expediente-encerrado.html")) { res.sendRedirect ("expediente-encerrado.html"); } else { chain.doFilter(request, response); } } public void init(FilterConfig config) throws ServletException {
} public void destroy() {
} }
www.algaworks.com
56
O a,+/#0) 1eb2'& A- a*ca9?e- 1eb e' Ja0a *)de' .e, /' a,+/#0) e-*ec#a& c"a'ad) .eb6/$# +/e de0e ca, (a *a-.a WEB7INF E-.e a,+/#0) .a'b:' : c"a'ad) de De'#&/$e%* De)c('*&( *)#- e&e de-c,e0e a&!/'a- c)(!/,a9?e- e de.a&"e- de #'*&a(.a98) d),ec/,-)- da a*ca98) O a,+/#0) .eb6/$# (8) : )b,#!a.=,#) 'a- *)de')- c,#6&) cca(d) c)' ) b).8) d#,e#.) e' De'#&/$e%* De)c('*&( de(.,) d) *,)$e.) e de*)#- e' Ge%e(a*e De'#&/$e%* De)c('*&( S*+b
www.algaworks.com
57
O a,+/#0) -e,6 c,#ad) c)' /' c)(.e@d) -e'e&"a(.e a) c=d#!) aba#2) Estoque index.html index.htm index.jsp default.html default.htm default.jsp
O a,+/#0) !e,ad) de-c,e0e ) ()'e da a*ca98) a.,a0:- de display-name e a&!/(a,+/#0)- de b)a- 0#(da- a.,a0:- de welcome-file-list +/e -8) /-ad)- ca-) ) /-/6,#) ace--e ) -#-.e'a a*e(a- *e&) c&%+e/+ 'a+h -e' #(),'a, ) ()'e de /' ,ec/,-) O de'#&0$e%+ de*c)'+&) de /'a a*ca98) *)de de-c,e0e, .a'b:' -e,0&e.- &.,)- 'a*ea'e(.)- e )/.,a- c)(!/,a9?e- P), e2e'*&) -e a -e,0&e. ConsultaProdutosServlet e ) &.,) HorarioFuncionamentoFilter (8) .#0e--e' -#d) a().ada- c)' @WebServlet e @WebFilter *)de,
58
Servlet de Consulta de Produtos
com.algaworks.estoque.servlet.ConsultaProdutosServlet Servlet de Consulta de Produtos /consulta-produtos Filtro de Expediente
com.algaworks.estoque.filter.HorarioFuncionamentoFilter Filtro de Expediente /*
T,a.a'e(.) de e,,)D/,a(.e a e2ec/98) de /'a a*ca98) d#0e,-)- e,,)- *)de' )c),,e, P), e2e'*&) -e ) ba(c) de dad)- de ()--) -#-.e'a e-.#0e, ),a d) a, 0e$a a 'e(-a!e' +/e ) /-/6,#) #,6 0#-/aa, +/a(d) .e(.a, ace--a, a -e,0&e. de c)(-/&.a de *,)d/.)-
www.algaworks.com
59
N8) : (ada &e!a& ')-.,a, 'e(-a!e(- .:c(#ca- *a,a )- /-/6,#)- U' -).1a,e *,)--#)(a& de0e .,a.a, )- e,,)- e e2#b#, 'e(-a!e(- +/e )- /-/6,#)- c)(-#!a' &e, P,#'e#,a'e(.e 0a')- c,#a, /'a *6!#(a de e,,) e' HTML c"a'ada e))&6h+$# <meta charset="UTF-8"> Erro no sistema. Tente novamente em alguns minutos.
A!),a 0a')- c)(!/,a, a *6!#(a de e,,) () a,+/#0) .eb6/$# ad#c#)(a(d) ) .,ec") de c=d#!) aba#2)
javax.persistence.PersistenceException /erro.html
Se'*,e +/e )c),,e, /'a e2ce98) d) .#*) PersistenceException ) /-/6,#) 0#-/aa,6 ) c)(.e@d) da *6!#(a e))&6h+$# www.algaworks.com
60
Se /'a e2ce98) de /' .#*) d#e,e(.e ), &a(9ada a+/e&a *6!#(a e#a e .:c(#ca a*a,ece,6 ()0a'e(.e *), #--) a&.e,a,e')- ) 0a&), da .a! exception-type *a,a .,a.a, .)d)- )- .#*)- de e2ce9?e- java.lang.Exception /erro.html
Se .e(.a,')- ace--a, /'a URL #(e2#-.e(.e /'a *6!#(a de e,,) 404 -e,6 e2#b#da Ne-.e ca-) (8) : /'a E/ce'+&% 'a- a*e(a- /' e,,) de *6!#(a (8) e(c)(.,ada
www.algaworks.com
61
P)de')- .,a.a, e-.e e,,) #(),'a(d) ) c=d#!) de&e (a .a! error-code 404 /404.html
A,+/#0)- WAR A #(.e!,a98) +/e ) Ec*-e a4 c)' ) T)'ca. ac#.a ba-.a(.e ) de-e(0)&0#'e(.) de -#-.e'a- 'a- 0)c; (8) .e,6 ) Ec*-e () -e,0#d), de *,)d/98) +/e e2ec/.a,6 aa*ca9?e- Pa,a 0)c; d#-.,#b/#, -/a- a*ca9?e- de ),'a e&e!a(.e e de 6c#& #'*&a(.a98) 0)c; de0e !e,a, /' *ac).e @(#c) +/e c)(.:' ./d) +/e : (ece--6,#) *a,a ) /(c#)(a'e(.) -e' c)'*ca9?e- E--e *ac).e : c"a'ad) de WAR Web A''#ca+&% A)ch-e U' a,+/#0) WAR (ada 'a#- : +/e /' a,+/#0) 6!a) ()'ead) c)' a e2.e(-8) 6.a) O Ec*-e *)--/# /'a e,,a'e(.a *a,a !e,a, a,+/#0)- WAR C+/e c)' ) b).8) d#,e#.) () *,)$e.) -e&ec#)(e ) 'e(/ E.'&(* e c+/e (a )*98) WAR 5#e I(),'e ) de-.#() )(de ) a,+/#0) -e,6 c,#ad) e c+/e e' F%)h
www.algaworks.com
62
C)' /' a,+/#0) WAR .e),#ca'e(.e *)de')- #(-.a&a, ()--a a*ca98) 1eb e' +/a&+/e, Se,0&e. C)(.a#(e, )/ -e,0#d), de a*ca98) N) ca-) d) T)'ca. ba-.a c)*#a, ) a,+/#0) *a,a a *a-.a .eba''* d) -e,0#d), Pa,a .e-.a,')- *)de')- #(#c#a, ) T)'ca. *), ),a d) Ec*-e De*)#- +/e ) T)'ca. e-.#0e, () a, *)de')- c)*#a, ) a,+/#0) E*+&(,eWeb6.a) *a,a a *a-.a .eba''* e a a*ca98) -e,6 #'*&a(.ada a/.)'a.#ca'e(.e
www.algaworks.com
63
E--e *,)ce--) de #'*&a(.a98) : c"a'ad) de de'#&0$e%+ e ) de'#&0 e' /' a'b#e(.e e' e2ec/98) : c"a'ad) de h&+ de'#&0$e%+ )/ $'#a%+a21& a (,e%+e
www.algaworks.com
64
Ca*<./&)
Ja0aSe,0e, Pa!e O +/e : JSP E' -e,0&e. c=d#!)- HTML -e '#-./,a' c)' c=d#!)- Ja0a d#c/&.a(d) a 'a(/.e(98) e &e!#b#dade A- *6!#(a- JSP Ja-aSe)-e) Page* ),a' c,#ada- *a,a c)(.),(a, a&!/'ade--a- '#.a9?e- P6!#(a- JSP -8) ),'ada- *,#(c#*a&'e(.e *), .a!- HTML *)de(d) .e, .,ec")- de c=d#!) Ja0a +/e *)de' e2ec/.a, +/a&+/e, c)#-a da API Pa,a c,#a, ()--a *,#'e#,a *6!#(a JSP cca')- c)' ) b).8) d#,e#.) () *,)$e.) Ne- JSP F#e De*)#- d#!#.a')- ) ()'e d) a,+/#0) c)') DgaO#a6!*' e a&.e,a')- ) c)(.e@d) d) a,+/#0) *a,a
Olá!
E-.e : /' a,+/#0) JSP 06d) Ve$a +/e ) e2e'*&) 'a#- -#'*&e- e' JSP -e *a,ece c)' /' a,+/#0) HTML A @(#ca d#e,e(9a )# a e2.e(-8) d) a,+/#0) +/e c)&)ca')- 6!*' E'b),a *a,e9a a*e(a- /' HTML /' a,+/#0) c)' e2.e(-8) 6!*' : .,a.ad) de ),'a d#e,e(.e *e&) c&%+a%e) Va')- #(c&/#, c)'*),.a'e(.)- d#(7'#c)- 5 ()--a *6!#(a JSP Recebe,e')- ) ()'e d) /-/6,#) c)') *a,7'e.,) .,a(-),'a,e')- *a,a 'a#@-c/&) e d#,e')- O&6 <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%-- JSP que diz "Olá" --%>
www.algaworks.com
65
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8" > <%
String nome = request.getParameter("nome"); if (nome == null) {
nome = "desconhecido"; } nome = nome.toUpperCase(); %>
Olá <% out.print(nome); %> !
Na *,#'e#,a ("a /-a')- a d(e*,a page *a,a dec&a,a, ) c&%+e%+ +0'e e c)d#ca98) de ()--a *6!#(a U'a d#,e.#0a .e' a -#(.a2e <%@ nome-da-diretiva %> <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
Pa,a e-c,e0e, c=d#!) Ja0a e' /'a *6!#(a JSP ba-.a ab,#,')- /' )c('*#e* a.,a0:- da -#(.a2e <% codigoJavaAqui(); %> U-a')- d/a- 0a,#60e#- #'*&
String nome = request.getParameter("nome"); %> <% out.print(nome); %>
P)de')- /-a, /'a 0a,#a98) de *c)'+#e+* c)("ec#da c)') e.'(e))4e) *a,a #'*,#'#, /' 0a&), (a -a<%= nome %> !
U'a e2*,e--8) c)(0e,.e ) 0a&), ,eceb#d) *a,a String *), #--) (8) *)de,
www.algaworks.com
66
P)de,<%= nome.toUpperCase() %> !
C)'e(.6,#)U-a')- d)#- .#*)- de c)'e(.6,#)- (a *6!#(a JSP O *,#'e#,) : c"a'ad) de C&$e%*1(& JSP e (8) : e(0#ad) *a,a a -a
O -e!/(d) : /' c)'e(.6,#) HTML (),'a& e c&a,) : e(0#ad) *a,a a -a
P)de')-
ace--a,
*6!#(a JSP *e&a URL h++'599#&ca#h&*+5=<=<9E*+&(,e9 DgaO#a6!*'8%&$e>Thag& e 0e, ) c=d#!))(.e HTML e(0#ad) *a,a ) (a0e!ad),
www.algaworks.com
a
67
F/(c#)(a'e(.) #(.e,() P), #(c,<0e& +/e *a,e9a a- *6!#(a- JSP -8) e2ec/.ada- c)') -e,0&e.- Na 0e,dade e&a-e .,a(-),'a' e' -e,0&e.- Q/a(d) /'a ,e+/#-#98) *a,a /'a *6!#(a JSP : e(0#ada *a,a ) c&%+a%e) e&e 0e,#ca -e a @&.#'a 0e,-8) da *6!#(a JSP $6 )# .,a(-),'ada e' /' -e,0&e. e ca-) a#(da (8) .e("a -#d) .,ad/4 ) c=d#!) e' JSP *a,a /'a -e,0&e. e c)'*#&a a c&a--e De0#d) a .)d) e--e *,)ce--) .,ad/98) e c)'*#&a98) 0)c; *)de,6 )b-e,0a, +/e ) *,#'e#,) ace--) a*=- a c,#a98) )/ ')d#ca98) de /'a *6!#(a JSP : -e'*,e 'a#- &e(.) +/e )- ace--)- *)-.e,#),e- P)de')- 0e, ) c=d#!) da -e,0&e. !e,ada *e&) c&%+a%e) *a,a ) a,+/#0) DgaO#a6!*' (a *a-.a .&)"9Ca+a#%a9#&ca#h&*+9E*+&(,e9&)g9a'ache9!*' d) T)'ca.
Ab,a ) a,+/#0) DgaO#a;!*'6!a-a e' /' ed#.), de .e2.) e 0e$a ) c=d#!) da -e,0&e.
www.algaworks.com
68
JSP +/e c)(-/&.a *,)d/.)Se *)de')- e-c,e0e, c=d#!) Ja0a e' a,+/#0)- JSP ca 6c#& #'*&e'e(.a,')- a c)(-/&.a de *,)d/.)- e' /'a *6!#(a c"a'ada c&%*,#+a7')&d,+&*6!*' Ba-.a ab,#, a&!/(- *c)'+#e+* e e2*,e--?e- e c)&)ca, ()--) c=d#!) Ja0a <%@ page <%@ page <%@ page <%@ page <%@ page
import="java.util.List, javax.persistence.EntityManager" %> import="com.algaworks.estoque.util.JpaUtil" %> import="com.algaworks.estoque.repository.Produtos" %> import="com.algaworks.estoque.model.Produto" %> contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%
EntityManager manager = JpaUtil.getEntityManager(); List todosProdutos = null; try {
Produtos produtos = new Produtos(manager); String nome = request.getParameter("nome"); todosProdutos = produtos.porNomeNaoExato(nome); if (todosProdutos.isEmpty()) {
response.sendRedirect("nenhum-produto-encontrado.html"); return; } www.algaworks.com
69
} finally { manager.close(); } %> <meta http-equiv="Content-Type"
content="text/html; charset=UTF-8" > Nome | Preço | Quantidade |
<% for (Produto produto : todosProdutos) { %> <%= produto.getNome() %> | <%= produto.getPrecoCusto() %> | <%= produto.getQuantidadeEstoque() %> |
<% } %>
A @(#ca ()0#dade (e-.e a,+/#0) ),a' )- $'&)+* (a d#,e.#0a page <%@ page import="java.util.List, javax.persistence.EntityManager" %> <%@ page import="com.algaworks.estoque.util.JpaUtil" %>
Pa,a /-a, a- c&a--e- +/e de-e(0)&0e')- )/ de a&!/'a )/.,a API *,ec#-a')- #'*),.6 &a- O a.,#b/.) import da d#,e.#0a *a!e ace#.a /'a ,e&a98) de c&a--e- -e*a,ada- *), 0<,!/&a )/ a#(da *)de')- #'*),.a, c&a--e *), c&a--e c,#a(d) /'a d#,e.#0a page *a,a cada $'&)+ A!),a #(c&/#,e')- ) ),'/&6,#) de *e-+/#-a de(.,) da *,=*,#a *6!#(a +/e e2#be ) ,e-/&.ad) 'a- a(.e- ,e')0e,e')- ) c=d#!) +/e ,ed#,ec#)(a ) /-/6,#) *a,a )/.,a *6!#(a +/a(d) a c)(-/&.a (8) ,e.),(a *,)d/.)- // removemos ou comentamos esse trecho de código
if (todosProdutos.isEmpty()) {
response.sendRedirect("nenhum-produto-encontrado.html"); return; }
Fe#.) #--) a&.e,a')- ) c),*) da *6!#(a JSP #(c&/#(d) ) ),'/&6,#) de *e-+/#-a e /'a c)(d#98) +/e 0e,#ca -e a c)(-/&.a .,)/2e a&!/' ,e-/&.ad) www.algaworks.com
70
Consulta de produtos
<% if (todosProdutos.isEmpty()) { %> Nenhum produto encontrado. <% } else { %> Nome | Preço | Quantidade |
<% for (Produto produto : todosProdutos) { %> <%= produto.getNome() %> | <%= produto.getPrecoCusto() %> | <%= produto.getQuantidadeEstoque() %> |
<% } %>
<% } %>
De-*ac") de ,e+/#-#9?eSe c)&)ca, c=d#!) HTML de(.,) de c=d#!) Ja0a : e#) e d#c/&.a a 'a(/.e(98) d) -).1a,e ) c)(.,6,#) .a'b:' (8) ca '/#.) #(.e,e--a(.e C=d#!) Ja0a de(.,) de c=d#!) HTML acaba -e .),(a(d) c)'*cad) de 'a(.e, E -e */d:--e')- /-a, ) +/e cada .ec()&)!#a .e' de b)' C=d#!) Ja0a e' -e,0&e.e HTML c)' a*e(a- a&!/'a- e2*,e--?e- e *c)'+#e+* -#'*&e- e' JSP Fa,e')- #--) a!),a /-a(d) )e(,e*+ d*'a+che) A&.e,a,e')- a c)(-/&.a de *,)d/.)- *a,a e2ec/.a, a &=!#ca e-c,#.a e' Ja0a *e&a -e,0&e. ConsultaProdutosServlet +/e de*)#- e(ca'#("a,6 a ,e+/#-#98) *a,a a *6!#(a c&%*,#+a7')&d,+&*6!*' +/e .e,6 c)') ,e-*)(-ab#dade a*e(a- e2#b#, )- dad)- $6 c)(-/&.ad)- E--e e(ca'#("a'e(.) : *)--<0e& a.,a0:- da API de -e,0&e.- P,ec#-a')- a*e(ac)("ece, ) ca'#(") d) a,+/#0) JSP e /-a, a #(.e,ace RequestDispatcher Ve$a c)') ca,6 ) c=d#!) de ()--a -e,0&e.
www.algaworks.com
71
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { EntityManager manager = JpaUtil.getEntityManager(); Produtos produtos = new Produtos(manager); String nome = request.getParameter("nome"); try {
List todosProdutos = produtos.porNomeNaoExato(nome); request.setAttribute ("produtos", todosProdutos); RequestDispatcher dispatcher = request.getRequestDispatcher( "/WEB-INF/paginas/consulta-produtos.jsp" ); dispatcher.forward(request, response); } finally { manager.close(); } }
A -e,0&e. ConsultaProdutosServlet (8) c)("ece 'a#- (ada de HTML E&a -abe c)') c)(-/&.a, *,)d/.)- () ,e*)-#.=,#) a.,a0:- de /' *a,7'e.,) d) /-/6,#) e e(ca'#("a, a ,e+/#-#98) *a,a /'a *6!#(a JSP A(.e- de e(ca'#("a, a ,e+/#-#98) *a,a a *6!#(a JSP de(#')- /' a.,#b/.) c)' ) ()'e *,)d/.)- e c)&)ca')- a -.a d)- *,)d/.)- c)(-/&.ad)- (e&e E-.e a.,#b/.) )# c,#ad) () e-c)*) da ,e+/#-#98) #--) +/e, d#4e, +/e e(+/a(.) a ,e+/#-#98) e2#-.#, a -.a *)de,6 -e, )b.#da *e&) a.,#b/.) request.setAttribute("produtos", todosProdutos);
O e(ca'#("a'e(.) : e#.) c)' ) c=d#!) a -e!/#, RequestDispatcher dispatcher = request.getRequestDispatcher( "/WEB-INF/paginas/consulta-produtos.jsp" ); dispatcher.forward(request, response);
M)0e,e')- ) a,+/#0) c&%*,#+a7')&d,+&*6!*' *a,a a *a-.a 9WEB7INF9'ag%a* I--) (8) : )b,#!a.=,#) 'a- (e-.e ca-) c)') (8) a,6 'a#- -e(.#d) ace--a, a *6!#(a JSP d#,e.a'e(.e *e&a URL : 'e&"), ')0e,')- *a,a WEB7INF +/e : /'a *a-.a *,).e!#da (8) : *)--<0e& ace--a, )- a,+/#0)- de&a 0#a URL A *6!#(a JSP (8) *,ec#-a c)("ece, (ada -)b,e c)(-/&.a de *,)d/.)- e ,e*)-#.=,#)- 'a- *,ec#-a')- *e!a, a -.a de *,)d/.)- c)(-/&.ad)- a.,a0:- d) a.,#b/.) *,)d/.)- () e-c)*) da ,e+/#-#98) P)de')- a4e, #--) c"a'a(d) ) ':.)d) request.getAttribute
www.algaworks.com
72
List todosProdutos = (List ) request.getAttribute("produtos");
Ve$a c)') c)/ ()--) JSP <%@ page import="java.util.List, com.algaworks.estoque.model.Produto" %> <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%
List todosProdutos = (List) request.getAttribute("produtos"); %> <meta http-equiv="Content-Type"
content="text/html; charset=UTF-8" > Consulta de produtos
<% if (todosProdutos.isEmpty()) { %> Nenhum produto encontrado. <% } else { %> Nome | Preço | Quantidade |
<% for (Produto produto : todosProdutos) { %> <%= produto.getNome() %> | <%= produto.getPrecoCusto() %> | <%= produto.getQuantidadeEstoque() %> |
<% } %>
<% } %>
E2*,e--#)( La(!/a!e E/')e**&% La%g,age EL .),(a *)--<0e& ) ace--) ,6*#d) a Ja0aBea(- O a0aad), de
e2*,e--?e- : ,e-*)(-60e& *), .,a.a, e2*,e--?e- EL +/e e-.8) e(.,e )- ca,ac.e,e- ${ } www.algaworks.com
73
P), e2e'*&) 0)c; *)de /-a, a e2*,e--8) ${nome} *a,a ace--a, /'a 0a,#60e& -#'*&ec"a'ada ()'e )/ ${cliente.endereco.bairro.nome} *a,a ace--a, ) ()'e d) ba#,,) d) e(de,e9) de /' ce(.e Pa,a a4e, /' .e-.e -#'*&e- 0a')- c,#a, /' ()0) a.,#b/.) () e-c)*) de ,e+/#-#98) e' ()--a -e,0&e. ConsultaProdutosServlet request.setAttribute("versaoSistema", "1.0-beta");
N) a,+/#0) c&%*,#+a7')&d,+&*6!*' ,ec/*e,a')- ) 0a&), d) a.,#b/.) a.,a0:- de /'a e2*,e--8) EL ... Versão do sistema: ${versaoSistema}