Apps Web em Wicket e Scala no GlassFish Java EE 6

Embed Size (px)

Citation preview

Apps Web em Wicket e Scala no GlassFish JEE 6

Apache Wicket + Scala + Java EE 6

Quem sou eu?

twitter: @brunoborges
[email protected]

Agenda

Desenvolvimento Web

Apache Wicket

Scala

GlassFish Java EE 6

Projeto Gamboa

Desenvolvimento Web gil?

Para a galera dessas tecnologias, sim

Designers vs Developers

De quais projetos estamos falando?

Pixel PerfectAplicao do jeito que o cliente desenhou

Um Web DesignerOu uma equipe s de designers

Prototipao

Alteraes no prottipo refletem na aplicao

O que ajuda o designer?

Isso ajuda tambm... e MUITO

PREVIEW

NO

BROWSER

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());
}

}

StrutsConsulta JDBC ???

Separao de Camadas

Interface do Usurio

Esta camada tambm pode ser quebrada em subcamadasUma para o web designer

Outra para o web developer

preciso uma melhor marcao HTML


Nome:

Isto o que o
Web Designer fazTambm o que o
usurio recebeno browser

E se...

Pudssemos ter uma

tecnologia que no altera

(em quase nada)

o que o Web Designer fez?


Nome:


Nome:

Tipos de Marcao XHTML

Declarativa (Wicket, Tapestry e poucos outros)





Bom para o
Web Designer e
navegador!

Tipos de Marcao XHTML

Imperativa (JSF, Struts, SpringMVC, Play!, Ruby on Rails, PHP, Python ...)





O ser humano no
nasceu para fazer
isso :-(E nenhum navegador
nasceu para
renderizar isso

Apache Wicket

Apache Wicket

Framework Web

Nasceu em 2005

Desde 2008 sob a gerncia da Apache Software Foundation

HTML puroNo utiliza Taglibs

Java puroDesenvolvimento similar ao Swing (calma! No tem GridBagLayout)

Orientado a Componentes

Java + HTML



msg de sistema

+

new Label(msg, We Develop);

=

We Develop

HTML prottipo

/MyHomePage.html


Apache Wicket


msg dinamica


Nome: Email:





Marcao no intrusiva

/MyHomePage.html


Apache Wicket


msg dinamica


Nome: Email:





Toda a lgica 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
Orientao a Objetos.
Sem mgica

O mnimo de configurao


wicket.app

org.apache.wicket.protocol.http.WicketFilter


applicationClassName
code.webapp.MyApplication



/MyApplication.java

package code.webapp;
public class MyApplication extends WebApplication {

public Class getHomePage() {
return MyHomePage.class;
}
}

Extensvel

Gmap2 gmap = new Gmap2(map);
page.add(gmap);


Google Maps

Ajax

Suporte nativo

Diversos componentes prontosAlguns com Fallback quando no h suporte Ajax ou total ausncia de JavaScript

Incluso automtica e dinmica de CSS e JavaScript dependidos de componentes

Um console para debug de requisies Ajax

Ajax

// HTML
contagem

incrementar



// 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);
}
});

Composio de Pginas: por herana

Base.htmlLayout.htmlLogin.html

Base.javaLayout.javaLogin.java

Composio de Pginas: por herana

Base.html







Base.java
class Base extends WebPage

Composio de Pginas: por herana

Layout.html











Layout.java
class Layout extends Base

Composio de Pginas: por herana

Login.html













Login.java
class Login extends Layout

Scala

Scala

Linguagem Orientada a ObjetosE no fundo, Java

Linguagem funcional

Estaticamente tipada



extensvelPermite facilmente desenvolver DSLs

var foo = 8foo = bar

Type mismatch;
found: String(bar)
required: Int

Scala: Funes

So representadas como valores tambm, como objetos

val func = () {
println(functional programming)
}

def chamaFuncao(paramFuncao: () Unit) ={
paramFuncao()
}

chamaFuncao(func)

Scala: Construes inteligentes

A linguagem rica em construes 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) = !

Scala: Construes 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)

Scala: Construes inteligentes

val map = new HashMap[Int, String]
treasureMap += 1 "Numero 1"
treasureMap += 2 "Numero 2"
treasureMap += 3 "Numero 3"

println(map(2))
// '2' a key, no o indice
// saida: Numero 2

val romanos = Map(1 "I", 2 "II", 3 "III", 4 "IV", 5 "V")
println(romanNumeral(4))
// saida: IV

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);
}
}

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)
}

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)

}

GlassFish JavaEE 6

GlassFish

Java EE 6

CDI

Maven Embedded Plugin

Derby

Java EE 6 + Wicket

Usar @Inject ao invs de @EJB

Validao de forms com Bean Validation

JSR303 Validationhttp://www.java.net/blogs/jjviana

No precisa de web.xml

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("/*"),
initParams = Array( new WebInitParam(name = "applicationClassName",
value = "code.webapp.MyApplication"), new WebInitParam(name = "filterMappingUrlPattern", value = "/*")))class MyAppFilter extends WicketFilter

Scala e Entity Beans JEE6

Usar a anotao @BeanProperty para gerar getters/setters

package code.data

import scala.reflect.BeanPropertyimport javax.persistence.{ Id, GeneratedValue }

trait Identifiable extends Serializable {

@Id @GeneratedValue @BeanProperty var id: String = _

}

Outros links

http://bit.ly/jee6wicketprezi (via @jjviana J1 US)

http://wicket.apache.org

http://github.com/42Lines/wicket-cdi

http://www.gamboa-project.org

Juntando os 3

Apache Wicket
+ Scala
+ JavaEE 6
_________________

Projeto Gamboa

www.gamboa-project.org

Obrigado

Bruno [email protected]

www.cursodewicket.com

Click to edit the outline text formatSecond Outline LevelThird Outline LevelFourth Outline LevelFifth Outline LevelSixth Outline Level