Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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

3,208 views

Published on

Palestra apresentada no JavaOne LA 2011

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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

×