Java mais gil que nunca no desenvolvimento Web
Apache Wicket + MongoDB + Scala
Quem sou eu?
twitter: @brunoborges
[email protected]
Desenvolvimento Web gil?
Para a galera dessas tecnologias, sim
Para os web designers.... no!
Designers vs Developers
Tipo do Projeto
Pixel PerfectAplicao do jeito que o cliente desenhou
Um Web DesignerOu uma equipe exclusiva de designers
PrototipaoCliente envolvido no processo
Alteraes no prottipo refletir 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 ???NO
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 fazIsto o que o
usurio do siterecebe
E se...
Pudssemos ter uma
tecnologia que no altera
(quase nada)
o que o Web Designer fez?
Nome:
Nome:
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
Tipos de Marcao XHTML
Declarativa (Wicket, Tapestry e poucos outros)
Bom para o
Web Designer e
navegador!
Apache Wicket
Apache Wicket
Framework Web
HTML puroNo utiliza Taglibs
Java puroDesenvolvimento similar ao Swing
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.MyApplication
/MyApplication.java
package code;
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
Incluso dinmica de CSS e JavaScript
Console independente de navegador, para debug
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);
}
});
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: antes, 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);
}
}
Scala: depois, em Scala
/MyHomePage.scala
class MyHomePage extends WebPage {
add(new Label(msg, We Develop!))
object form extends Form(form) {
add(new TextField(nome))
add(new TextField(email))
override def onSubmit() = {
servico.salvar(getModelObject())
}
}
add(form)
}
Scala: Uma DSL para Wicket
/MyHomePage.scala
class MyHomePage extends WebPage with DSLWicket {
label(msg, We Develop!))
object form extends Form(form) with DSLWicket {
textField[String](nome))
textField[String](email))
override def onSubmit() = {
servico.salvar(getModelObject())
}
}
add(form)
}
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
MongoDB
MongoDB
Banco de dados NoSQL
Orientado a documentosBSON // representado no estilo JSON
Auto-sharding Escala automaticamente de forma horizontal
Map/Reduce
GridFSArmazenamento de arquivos de qualquer tamanho
Operaes Atmicas
MongoDB
O que significa NoSQL?No relacional
Foco em escalabilidade
Fcil modelagem e mudana de dadosNo exige definio de tabelas ou schemas
Sem sintaxe SQLmas tem gente construindo SQL para NoSQL
Sem joins e sem transaes complexas o que permite escalabilidade horizontal
Principal Vantagem
NOPRECISAMODELAGEMPRVIALeia-se: diagramas de tabelas, joins, constraints e o escambal
MongoDB
Quem utiliza?The New York Times
Business Insider
Foursquare
Sourceforge
Craigslist
Eletronic Arts
MongoDB: como por dentro?
$ mongo dbTeste
MongoDB shell version: 1.8.2
connecting to: dbTeste
> db.colecao.find();
> db.colecao.save({foo: "bar"});
> db.colecao.save({bar: "foo"});
> db.colecao.find();
{
"_id": ObjectId(4e4d11f9cc937416b0004469"),
"foo": "bar"
}
{"_id": ObjectId("4e4d128ecc937416b000446a"),
"bar": "foo"
}
MongoDB
Driver Java
E um pacote para ScalaCasbah
val newObj = MongoDBObject("foo" "bar", "x" "y", "pie" 3.14, "spam" "eggs")// newObj: com.mongodb.casbah.Imports.DBObject// { "foo" : "bar" , "x" : "y" , "pie" : 3.14 , "spam" : "eggs"}
Juntando os 3
Apache Wicket
+ Scala
+ MongoDB
_________________
Projeto Gamboa
www.gamboa-project.org
Obrigado
Bruno [email protected]
www.cursodewicket.com
9/10/11
Click to edit the outline text formatSecond Outline LevelThird Outline LevelFourth Outline LevelFifth Outline LevelSixth Outline Level
Click to edit the outline text formatSecond Outline LevelThird Outline LevelFourth Outline LevelFifth Outline LevelSixth Outline Level