Apps Web em Wicket e Scala no GlassFish Java EE 6
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Apps Web em Wicket e Scala no GlassFish Java EE 6

on

  • 2,736 views

Palestra apresentada no JavaOne LA 2011

Palestra apresentada no JavaOne LA 2011

Statistics

Views

Total Views
2,736
Views on SlideShare
2,734
Embed Views
2

Actions

Likes
0
Downloads
13
Comments
0

2 Embeds 2

http://www.linkedin.com 1
https://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Apps Web em Wicket e Scala no GlassFish Java EE 6 Presentation Transcript

  • 1. Apps Web em Wicket e Scala no GlassFish JEE 6 Apache Wicket + Scala + Java EE 6
  • 2. Quem sou eu? twitter: @brunoborges www.brunoborges.com [email_address]
  • 3. Agenda
    • Desenvolvimento Web
    • 4. Apache Wicket
    • 5. Scala
    • 6. GlassFish Java EE 6
    • 7. Projeto Gamboa
  • 8. Desenvolvimento Web é ágil?
    • Para a galera dessas tecnologias, sim
  • 9. Designers vs Developers
  • 10. De quais projetos estamos falando?
    • “Pixel Perfect”
      • Aplicação do jeito que o cliente desenhou
    • Um Web Designer
      • Ou uma equipe só de designers
    • Prototipação
    • 11. Alterações no protótipo refletem na aplicação
  • 12. O que ajuda o designer?
  • 13. Isso ajuda também... e MUITO PREVIEW NO BROWSER
  • 14. Fazemos isso?
      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()); } }
    Struts Consulta JDBC ???
  • 15. Separação de Camadas
  • 16. Interface do Usuário
    • Esta camada também pode ser quebrada em subcamadas
      • Uma para o web designer
      • 17. Outra para o web developer
  • 18. É preciso uma melhor marcação HTML
      < 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 >
    Isto é o que o Web Designer faz Também é o que o usuário recebe no browser
  • 19. E se...
      Pudéssemos ter uma tecnologia que não altera (em “quase” nada) o que o Web Designer fez?
  • 20.
      < 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 >
  • 21.
      < 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 >
  • 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. 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. Apache Wicket
  • 25. Apache Wicket
    • Framework Web
    • 26. Nasceu em 2005
    • 27. Desde 2008 sob a gerência da Apache Software Foundation
    • 28. HTML puro
      • Não utiliza Taglibs
    • Java puro
      • Desenvolvimento similar ao Swing (calma! Não tem GridBagLayout)
    • Orientado a Componentes
  • 29. Java + HTML
      <span wicket:id = ” msg ” > msg de sistema </span> + new Label( “ msg ” , “ We Develop ”); = <span> We Develop </span>
  • 30. HTML protótipo
      /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>
  • 31. Marcação não intrusiva
      /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>
  • 32. Toda a lógica da UI: em Java
      /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); } }
    Puro Java e Orientação a Objetos. Sem mágica
  • 33. O mínimo de configuração
      <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; } }
  • 34. Extensível Gmap2 gmap = new Gmap2(“map”); page.add(gmap); <div wicket:id=”map”> Google Maps </div>
  • 35. Ajax
    • Suporte nativo
    • 36. Diversos componentes prontos
      • Alguns com “ Fallback ” quando não há suporte Ajax ou total ausência de JavaScript
    • Inclusão automática e dinâmica de CSS e JavaScript dependidos de componentes
    • 37. Um console para debug de requisições Ajax
  • 38. Ajax
      // 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 ); } });
  • 39. Composição de Páginas: por herança
    • Base.html
      • Layout.html
        • Login.html
    • Base.java
      • Layout.java
        • Login.java
  • 40. Composição de Páginas: por herança
    • Base.html <html> <head> … </head> <body> <wicket:child /> </body> </html>
    • 41. Base.java class Base extends WebPage
  • 42. Composição de Páginas: por herança
    • 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. Layout.java class Layout extends Base
  • 44. Composição de Páginas: por herança
    • 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. Login.java class Login extends Layout
  • 46. Scala
  • 47. Scala
    • Linguagem Orientada a Objetos
      • E no fundo, é Java
    • Linguagem funcional
    • 48. Estaticamente tipada
    • 49. É extensível
      • Permite facilmente desenvolver DSLs
      var foo = 8 foo = “bar”
      Type mismatch; found: String(“bar”) required: Int
  • 50. Scala: Funções
    • São representadas como valores também, como objetos val func = () ⇒ { println(“functional programming”) } def chamaFuncao(paramFuncao: () ⇒ Unit) ={ paramFuncao() } chamaFuncao(func)
  • 51. Scala: Construções inteligentes
    • 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) = “!”
  • 52. Scala: Construções inteligentes
      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)
  • 53. Scala: Construções inteligentes
      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”
  • 54. Wicket+Scala: antes, em Java
      /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); } }
  • 55. Depois, em Scala
      /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) }
  • 56. Scala: Uma DSL para Wicket
      /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 ”) }
  • 57. GlassFish JavaEE 6
  • 58. GlassFish
    • Java EE 6
    • 59. CDI
    • 60. Maven Embedded Plugin
    • 61. Derby
  • 62. Java EE 6 + Wicket
    • Usar @Inject ao invés de @EJB
    • 63. Validação de forms com Bean Validation
    • 64. JSR303 Validation
      • http://www.java.net/blogs/jjviana
    • Não precisa de web.xml
  • 65. Java EE 6 + Wicket + Scala
    • Sem mais web.xml
    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. Scala e Entity Beans JEE6
    • Usar a anotação @BeanProperty para gerar getters/setters
    package code.data import scala.reflect.BeanProperty import javax.persistence.{ Id, GeneratedValue } trait Identifiable extends Serializable { @Id @GeneratedValue @BeanProperty var id: String = _ }
  • 67. Outros links
    • http://bit.ly/jee6wicketprezi (via @jjviana J1 US)
    • 68. http://wicket.apache.org
    • 69. http://github.com/42Lines/wicket-cdi
    • 70. http://www.gamboa-project.org
  • 71. Juntando os 3 Apache Wicket + Scala + JavaEE 6 _________________ Projeto Gamboa www.gamboa-project.org
  • 72. Obrigado Bruno Borges [email_address] www.cursodewicket.com