Apps Web em Wicket e Scala no GlassFish JEE 6 Apache Wicket + Scala + Java EE 6
Quem sou eu? twitter: @brunoborges www.brunoborges.com [email_address]
Agenda <ul><li>Desenvolvimento Web
Apache Wicket
Scala
GlassFish Java EE 6
Projeto Gamboa </li></ul>
Desenvolvimento Web é ágil? <ul><li>Para a galera dessas tecnologias, sim </li></ul>
Designers vs Developers
De quais projetos estamos falando? <ul><li>“Pixel Perfect” </li><ul><li>Aplicação do jeito que o cliente desenhou </li></u...
Alterações no protótipo refletem na aplicação </li></ul>
O que ajuda o designer?
Isso ajuda também... e MUITO PREVIEW NO BROWSER
Fazemos isso? <ul>public class LoginAction    extends ActionSupport {   public void login() {   Connection c = getConnecti...
Separação de Camadas
Interface do Usuário <ul><li>Esta camada também pode ser quebrada em subcamadas </li><ul><li>Uma para o web designer
Outra para o web developer </li></ul></ul>
É preciso uma melhor marcação HTML <ul>< html  xmlns=&quot;http://www.w3.org/1999/xhtml&quot;> <head><title></title></head...
E se... <ul>Pudéssemos ter uma tecnologia que não altera  (em “quase” nada)  o que o Web Designer fez? </ul>
<ul>< html  xmlns=&quot;http://www.w3.org/1999/xhtml&quot;> <head><title></title></head> < body > < form > <span>Nome:</sp...
<ul>< html  xmlns=&quot;http://www.w3.org/1999/xhtml&quot;> <head><title></title></head> < body > < form  wicket:id=&quot;...
Tipos de Marcação XHTML Declarativa   (Wicket, Tapestry e poucos outros) <form action=”salvar”>   <input type=”text” name=...
Tipos de Marcação XHTML Imperativa   (JSF, Struts, SpringMVC, Play!, Ruby on Rails, PHP, Python ...) <form action=”salvar”...
Apache Wicket
Apache Wicket <ul><li>Framework Web
Nasceu em 2005
Desde 2008 sob a gerência da Apache Software Foundation
HTML puro </li><ul><li>Não utiliza  Taglibs </li></ul><li>Java puro </li><ul><li>Desenvolvimento similar ao Swing  (calma!...
Java + HTML <ul><span  wicket:id = ” msg ” > msg de sistema </span> + new  Label( “ msg ” , “ We Develop ”); = <span> We D...
HTML protótipo <ul>/MyHomePage.html <html>   <head><title>Apache Wicket</title></head>   <body>   <span>msg dinamica</span...
Marcação não intrusiva <ul>/MyHomePage.html <html>   <head><title>Apache Wicket</title></head>   <body>   <span  wicket:id...
Toda a lógica da UI: em Java <ul>/MyHomePage.java public class  MyHomePage  extends  WebPage  {   public HomePage() {   ad...
O mínimo de configuração <ul><filter>   <filter-name>wicket.app</filter-name>   <filter-class>   org.apache.wicket.protoco...
Extensível Gmap2 gmap = new Gmap2(“map”); page.add(gmap); <div wicket:id=”map”>   Google Maps </div>
Ajax <ul><li>Suporte nativo
Diversos componentes prontos </li><ul><li>Alguns com “ Fallback ” quando não há suporte Ajax ou total ausência de JavaScri...
Um console para debug de requisições Ajax </li></ul>
Ajax <ul>// HTML < span  wicket:id=”counter”>contagem</span> < a href =”#” wicket:id=”counterLink”>   incrementar </ a > /...
Composição de Páginas: por herança <ul><li>Base.html </li><ul><li>Layout.html </li><ul><li>Login.html </li></ul></ul><li>B...
Composição de Páginas: por herança <ul><li>Base.html <html>   <head> … </head>   <body>    <wicket:child />   </body> </ht...
Base.java class  Base  extends  WebPage </li></ul>
Composição de Páginas: por herança <ul><li>Layout.html <html>   <head> … </head>   <body>    <wicket:extend>   <div id=”he...
Layout.java class  Layout  extends  Base </li></ul>
Composição de Páginas: por herança <ul><li>Login.html <html>   <head> … </head>   <body>    <div id=”header”> … </div>   <...
Login.java class  Login  extends  Layout </li></ul>
Scala
Scala <ul><li>Linguagem Orientada a Objetos </li><ul><li>E no fundo, é Java </li></ul><li>Linguagem funcional
Estaticamente tipada
Upcoming SlideShare
Loading in...5
×

Apps Web em Wicket e Scala no GlassFish Java EE 6

2,582

Published on

Palestra apresentada no JavaOne LA 2011

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,582
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Apps Web em Wicket e Scala no GlassFish Java EE 6

  1. 1. Apps Web em Wicket e Scala no GlassFish JEE 6 Apache Wicket + Scala + Java EE 6
  2. 2. Quem sou eu? twitter: @brunoborges www.brunoborges.com [email_address]
  3. 3. Agenda <ul><li>Desenvolvimento Web
  4. 4. Apache Wicket
  5. 5. Scala
  6. 6. GlassFish Java EE 6
  7. 7. Projeto Gamboa </li></ul>
  8. 8. Desenvolvimento Web é ágil? <ul><li>Para a galera dessas tecnologias, sim </li></ul>
  9. 9. Designers vs Developers
  10. 10. De quais projetos estamos falando? <ul><li>“Pixel Perfect” </li><ul><li>Aplicação do jeito que o cliente desenhou </li></ul></ul><ul><li>Um Web Designer </li><ul><li>Ou uma equipe só de designers </li></ul><li>Prototipação
  11. 11. Alterações no protótipo refletem na aplicação </li></ul>
  12. 12. O que ajuda o designer?
  13. 13. Isso ajuda também... e MUITO PREVIEW NO BROWSER
  14. 14. Fazemos isso? <ul>public class LoginAction extends ActionSupport { public void login() { Connection c = getConnection(); Statement st = c.createStatement(); ResultSet rs = st.executeQuery(“SELECT * FROM USUARIO WHERE ID = “+usuario); setAutenticado(rs.hasNext()); } } </ul>Struts Consulta JDBC ???
  15. 15. Separação de Camadas
  16. 16. Interface do Usuário <ul><li>Esta camada também pode ser quebrada em subcamadas </li><ul><li>Uma para o web designer
  17. 17. Outra para o web developer </li></ul></ul>
  18. 18. É preciso uma melhor marcação HTML <ul>< html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;> <head><title></title></head> < body > < form > <span>Nome:</span> <input type=&quot;text&quot; /> <input type=&quot;submit&quot; value=&quot;Submit&quot; /> </ form > </ body > </ html > </ul>Isto é o que o Web Designer faz Também é o que o usuário recebe no browser
  19. 19. E se... <ul>Pudéssemos ter uma tecnologia que não altera (em “quase” nada) o que o Web Designer fez? </ul>
  20. 20. <ul>< html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;> <head><title></title></head> < body > < form > <span>Nome:</span> <input type=&quot;text&quot; /> <input type=&quot;submit&quot; value=&quot;Submit&quot; /> </ form > </ body > </ html > </ul>
  21. 21. <ul>< html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;> <head><title></title></head> < body > < form wicket:id=&quot;form&quot; > <span>Nome:</span> <input wicket:id=&quot;nome&quot; type=&quot;text&quot; /> <input type=&quot;submit&quot; value=&quot;Submit&quot; /> </ form > </ body > </ html > </ul>
  22. 22. Tipos de Marcação XHTML Declarativa (Wicket, Tapestry e poucos outros) <form action=”salvar”> <input type=”text” name=”nome” /> <input type=”submit” value=”Salvar” /> </form> <form wicket:id=”form” > <input type=”text” wicket:id=”nome” /> <input type=”submit” wicket:id=”salvar” /> </form> Bom para o Web Designer e navegador!
  23. 23. Tipos de Marcação XHTML Imperativa (JSF, Struts, SpringMVC, Play!, Ruby on Rails, PHP, Python ...) <form action=”salvar”> <input type=”text” name=”nome” /> <input type=”submit” value=”Salvar” /> </form> < s:form action=”salvar”> < s:input property=”nome” /> < s:submit value=”Salvar” /> </ s:form > O ser humano não nasceu para fazer isso … :-( E nenhum navegador nasceu para renderizar isso …
  24. 24. Apache Wicket
  25. 25. Apache Wicket <ul><li>Framework Web
  26. 26. Nasceu em 2005
  27. 27. Desde 2008 sob a gerência da Apache Software Foundation
  28. 28. HTML puro </li><ul><li>Não utiliza Taglibs </li></ul><li>Java puro </li><ul><li>Desenvolvimento similar ao Swing (calma! Não tem GridBagLayout) </li></ul><li>Orientado a Componentes </li></ul>
  29. 29. Java + HTML <ul><span wicket:id = ” msg ” > msg de sistema </span> + new Label( “ msg ” , “ We Develop ”); = <span> We Develop </span> </ul>
  30. 30. HTML protótipo <ul>/MyHomePage.html <html> <head><title>Apache Wicket</title></head> <body> <span>msg dinamica</span> <form> Nome: <input type=”text” /> Email: <input type=”text” /> <input type=”submit” value=”Enviar” /> </form> </body> </html> </ul>
  31. 31. Marcação não intrusiva <ul>/MyHomePage.html <html> <head><title>Apache Wicket</title></head> <body> <span wicket:id=” msg ” >msg dinamica</span> <form wicket:id=” form ” > Nome: <input type=”text” wicket:id=” nome ” /> Email: <input type=”text” wicket:id=” email ” /> <input type=”submit” value=”Enviar” /> </form> </body> </html> </ul>
  32. 32. Toda a lógica da UI: em Java <ul>/MyHomePage.java public class MyHomePage extends WebPage { public HomePage() { add(new Label ( “msg” , “We Develop!” )); Form form = new Form(“ form ”) { public void onSubmit() { servico.salvar(getModelObject()); } }; form.add(new TextField(“ nome ”)); form.add(new TextField(“ email ”)); add(form); } } </ul>Puro Java e Orientação a Objetos. Sem mágica
  33. 33. O mínimo de configuração <ul><filter> <filter-name>wicket.app</filter-name> <filter-class> org.apache.wicket.protocol.http.WicketFilter </filter-class> <init-param> <param-name>applicationClassName</param-name> <param-value>code.webapp.MyApplication</param-value> </init-param> </filter> /MyApplication.java package code.webapp; public class MyApplication extends WebApplication { public Class< MyHomePage > getHomePage() { return MyHomePage .class; } } </ul>
  34. 34. Extensível Gmap2 gmap = new Gmap2(“map”); page.add(gmap); <div wicket:id=”map”> Google Maps </div>
  35. 35. Ajax <ul><li>Suporte nativo
  36. 36. Diversos componentes prontos </li><ul><li>Alguns com “ Fallback ” quando não há suporte Ajax ou total ausência de JavaScript </li></ul><li>Inclusão automática e dinâmica de CSS e JavaScript dependidos de componentes
  37. 37. Um console para debug de requisições Ajax </li></ul>
  38. 38. Ajax <ul>// HTML < span wicket:id=”counter”>contagem</span> < a href =”#” wicket:id=”counterLink”> incrementar </ a > // JAVA int counter = 0; Label counterLabel = new Label(“ counter ”); add(counterLabel); add(new AjaxLink(“counterLink”) { public vond onClick(AjaxRequestTarget target) { counter++ ; counterLabel .setModelObject( counter ); target.addComponent( counterLabel ); } }); </ul>
  39. 39. Composição de Páginas: por herança <ul><li>Base.html </li><ul><li>Layout.html </li><ul><li>Login.html </li></ul></ul><li>Base.java </li><ul><li>Layout.java </li><ul><li>Login.java </li></ul></ul></ul>
  40. 40. Composição de Páginas: por herança <ul><li>Base.html <html> <head> … </head> <body> <wicket:child /> </body> </html>
  41. 41. Base.java class Base extends WebPage </li></ul>
  42. 42. Composição de Páginas: por herança <ul><li>Layout.html <html> <head> … </head> <body> <wicket:extend> <div id=”header”> … </div> <div id=”content”> <wicket:child /> </div> <div id=”footer”> … </div> </wicket:extend> </body> </html>
  43. 43. Layout.java class Layout extends Base </li></ul>
  44. 44. Composição de Páginas: por herança <ul><li>Login.html <html> <head> … </head> <body> <div id=”header”> … </div> <div id=”content”> <wicket:extend> <form wicket:id=”loginForm”> … </form> </wicket:extend> </div> <div id=”footer”> … </div> </body> </html>
  45. 45. Login.java class Login extends Layout </li></ul>
  46. 46. Scala
  47. 47. Scala <ul><li>Linguagem Orientada a Objetos </li><ul><li>E no fundo, é Java </li></ul><li>Linguagem funcional
  48. 48. Estaticamente tipada
  49. 49. É extensível </li><ul><li>Permite facilmente desenvolver DSLs </li></ul></ul><ul>var foo = 8 foo = “bar” </ul><ul>Type mismatch; found: String(“bar”) required: Int </ul>
  50. 50. Scala: Funções <ul><li>São representadas como valores também, como objetos val func = () ⇒ { println(“functional programming”) } def chamaFuncao(paramFuncao: () ⇒ Unit) ={ paramFuncao() } chamaFuncao(func) </li></ul>
  51. 51. Scala: Construções inteligentes <ul><li>A linguagem é rica em construções inteligentes val lista1a9 = 1 to 9 toList lista1a9 .foreach (i ⇒ print(i)) for (i ← lista1a9) { print(i) } val strings = new Array[String](3) strings(0) = “Hello” strings(1) = “World” strings(3) = “!” </li></ul>
  52. 52. Scala: Construções inteligentes <ul>val listaA = List(1, 2) val listaB = List(3, 4) val listaC = listaA :: listaB // listaC é uma nova List val listaD = listaC :: 5 print(listaD) // saida: List(1,2,3,4,5) </ul>
  53. 53. Scala: Construções inteligentes <ul>val map = new HashMap[Int, String] treasureMap += 1 -> &quot;Numero 1&quot; treasureMap += 2 -> &quot;Numero 2&quot; treasureMap += 3 -> &quot;Numero 3&quot; println(map(2)) // '2' é a key , não o indice // saida: “Numero 2” val romanos = Map(1 -> &quot;I&quot;, 2 -> &quot;II&quot;, 3 -> &quot;III&quot;, 4 -> &quot;IV&quot;, 5 -> &quot;V&quot;) println(romanNumeral(4)) // saida: “IV” </ul>
  54. 54. Wicket+Scala: antes, em Java <ul>/MyHomePage.java public class MyHomePage extends WebPage { @Inject private Servico servico; public HomePage() { add(new Label ( “msg” , “We Develop!” )); Form form = new Form(“ form ”) { public void onSubmit() { servico.salvar(getModelObject()); } }; form.add(new TextField(“ nome ”)); form.add(new TextField(“ email ”)); add(form); } } </ul>
  55. 55. Depois, em Scala <ul>/MyHomePage.scala class MyHomePage extends WebPage { @Inject var servico = _ add(new Label ( “msg” , “We Develop!” )) object form extends Form(“ form ”) { add(new TextField(“ nome ”)) add(new TextField(“ email ”)) override def onSubmit() = { servico.atualizar() } } add(form) } </ul>
  56. 56. Scala: Uma DSL para Wicket <ul>/MyHomePage.scala class MyHomePage extends WebPage with DSLWicket { @Inject var servico = _ label( “msg” , “We Develop!” ) val onsubmit = () ⇒ servico.atualizar() val f = form(“ form ”, onsubmit) f.textField[String](“ nome ”) f.textField[String](“ email ”) } </ul>
  57. 57. GlassFish JavaEE 6
  58. 58. GlassFish <ul><li>Java EE 6
  59. 59. CDI
  60. 60. Maven Embedded Plugin
  61. 61. Derby </li></ul>
  62. 62. Java EE 6 + Wicket <ul><li>Usar @Inject ao invés de @EJB
  63. 63. Validação de forms com Bean Validation
  64. 64. JSR303 Validation </li><ul><li>http://www.java.net/blogs/jjviana </li></ul><li>Não precisa de web.xml </li></ul>
  65. 65. Java EE 6 + Wicket + Scala <ul><li>Sem mais web.xml </li></ul>package code.webapp import javax.servlet.annotation.{ WebFilter, WebInitParam } import org.apache.wicket.protocol.http.WicketFilter @WebFilter(value = Array(&quot;/*&quot;), initParams = Array( new WebInitParam(name = &quot;applicationClassName&quot;, value = &quot;code.webapp.MyApplication&quot;), new WebInitParam(name = &quot;filterMappingUrlPattern&quot;, value = &quot;/*&quot;) )) class MyAppFilter extends WicketFilter
  66. 66. Scala e Entity Beans JEE6 <ul><li>Usar a anotação @BeanProperty para gerar getters/setters </li></ul>package code.data import scala.reflect.BeanProperty import javax.persistence.{ Id, GeneratedValue } trait Identifiable extends Serializable { @Id @GeneratedValue @BeanProperty var id: String = _ }
  67. 67. Outros links <ul><li>http://bit.ly/jee6wicketprezi (via @jjviana J1 US)
  68. 68. http://wicket.apache.org
  69. 69. http://github.com/42Lines/wicket-cdi
  70. 70. http://www.gamboa-project.org </li></ul>
  71. 71. Juntando os 3 Apache Wicket + Scala + JavaEE 6 _________________ Projeto Gamboa www.gamboa-project.org
  72. 72. Obrigado Bruno Borges [email_address] www.cursodewicket.com
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×