JavaEE + Wicket: o que eu estava esperando?
Este blog deixou de ser mantido, mas o autor continua escrevendo aqui. Não deixe de assinar o novo feed!
Já faz algum tempo que o framework Wicket agora se chama Apache Wicket. Esse processo todo de “graduação” do projeto Wicket para um projeto top level Apache demorou, mas o Wicket agora ocupa lugar de destaque junto a outros projetos importantes (como o Tapestry, Turbine, Struts, entre outros).
Já havia lido um pouco a respeito do Wicket por aí e confesso ter achado muito bom, principalmente comparado com algumas nojeiras que somos forçados a usar por aí. Mas, mesmo assim, eu nunca havia tentado criar um projeto qualquer para testar o Wicket.
Por esse motivo, essa semana eu montei uma aplicaçãozinha bem simples para tentar entender como o framework funciona. Adivinha o que fiz? Isso mesmo, um guestbook (meu hello world “web” favorito!).
Devo dizer que não fiquei nem um pouco surpreso com o resultado da experiência, pois, como já imaginava, encontrei um framework simples e intuitivo. A aplicação que estarei explicando neste post está disponível para download através da página de aplicações aqui do blog.
Infraestrutura
Este é um projeto Java EE 5 composto pelos seguintes componentes:
- guestbook-ear
- guestbook-ejb
- Message: entidade persistente que representa as mensagens;
- EJB MessageRepository: stateless session bean que serve para persistir e retornar mensagens do meio persistente;
- guestbook-web
- AddMessage: página para inclusão de mensagens;
- MessageList: página que mostra a lista de mensagens cadastradas.
- guestbook-ejb
Utilizei o servidor de aplicações Glassfish v2-b58c e a implementação JPA Toplink. O banco de dados utilizado foi o MySQL 5.0.45. Tudo rodando em cima do SO Slackware 12 com Java 1.6.0u2. Utilizei também o Maven 2 para organizar a estrutura do projeto e, claro, o Wicket (versão 1.2.6).
Organizando o projeto
Embora o Maven tenha lá seus problemas, ainda é minha ferramenta preferida para criação e manutenção de um projeto Java qualquer. Em alguns minutos eu montei — usando alguns archetypes — a estrutura do projeto:
Back-end
Não irei colar nenhum código relacionado ao back-end da aplicação pois isso pode ser facilmente encontrado em qualquer tutorial que ensine o básico sobre Java EE 5. Vamos focar na parte web!
Configurando o Wicket
Uma vez adicionado o Wicket como dependência no módulo guestbook-web, precisamos fazer algumas configurações para que o Wicket funcione.
Primeiramente, precisamos criar a classe de configuração:
-
-
package com.danielfmartins.guestbook;
-
-
// imports…
-
-
public class GuestbookApplication extends WebApplication {
-
-
public Class getHomePage() {
-
return MessageList.class;
-
}
-
-
@Override
-
protected void init() {
-
// algumas opções não muito "necessárias" aqui
-
}
-
}
-
Em seguida, devemos alterar o arquivo web.xml:
-
-
<web-app>
-
<!– … –>
-
-
<servlet>
-
<servlet-name>HelloWorldApplication</servlet-name>
-
<servlet-class>
-
wicket.protocol.http.WicketServlet
-
</servlet-class>
-
<init-param>
-
<param-name>applicationClassName</param-name>
-
<param-value>
-
com.danielfmartins.guestbook.GuestbookApplication
-
</param-value>
-
</init-param>
-
<load-on-startup>1</load-on-startup>
-
</servlet>
-
<servlet-mapping>
-
<servlet-name>HelloWorldApplication</servlet-name>
-
<url-pattern>/app/*</url-pattern>
-
</servlet-mapping>
-
-
<!– … –>
-
</web-app>
-
Feito isso, o Wicket já está configurado para interceptar e tratar corretamente as requisições.
Página de listagem
A seguir podemos ver um exemplo de página Wicket. Qualquer semelhança com programação desktop não é mera coincidência:
-
-
package com.danielfmartins.guestbook.page;
-
-
// imports…
-
-
public class MessageList extends WebPage {
-
-
@EJB(name="MessageRepositoryBean")
-
private MessageRepositoryRemote repository;
-
-
public MessageList() {
-
List<Message> list = repository.getAll();
-
-
add(new FeedbackPanel("feedback"));
-
add(new PageLink("addLink", AddMessage.class));
-
-
WebMarkupContainer table = new WebMarkupContainer("table");
-
add(table);
-
table.setVisible(list.size() > 0);
-
-
@Override
-
protected void populateItem(ListItem item) {
-
Message msg = (Message) item.getModelObject();
-
-
item.add(new ExternalLink("email", "mailto:" + msg.getEmail(),
-
msg.getEmail()).setVisible(msg.getEmail() != null));
-
item.add(new ExternalLink("url", msg.getUrl(), msg.getUrl())
-
.setVisible(msg.getUrl() != null));
-
}
-
});
-
}
-
}
-
Não irei explicar tudo linha-a-linha. A idéia aqui é mostrar o quanto o modelo de desenvolvimento do Wicket é intuitivo, principalmente àqueles que já sabem desenvolver para desktop. Aqui, conseguimos criar páginas cuja lógica de apresentação fica totalmente isolada do template HTML, e, além disso, a página ganha uma característica mais “OO”.
Abaixo segue um trecho do template HTML dessa página:
-
-
<html>
-
<body>
-
<span wicket:id="feedback">
-
Feedback messages
-
</span>
-
-
<table border="1" wicket:id="table">
-
<tr>
-
<th>When</th>
-
<th>From</th>
-
<!– … –>
-
</tr>
-
<tr wicket:id="messages">
-
<td><span wicket:id="date">5 seconds</span></td>
-
<td><span wicket:id="name">Somebody’s name</span></td>
-
<!– … –>
-
</tr>
-
</table>
-
<p>
-
<a href="#" wicket:id="addLink">New message</a>
-
</p>
-
</body>
-
</html>
-
Note que os atributos wicket:id referenciam os componentes instanciados na página mostrada anteriormente.
Quem já usou o Tapestry alguma vez na vida deve ter ficado desapontado ao usar frameworks como o Struts e JSF, principalmente pelo fato de que os templates Tapestry são visíveis em qualquer navegador e editor WYSIWYG; não é preciso nenhum editor especial para se conseguir ver como a página se parecerá. Bem, o Wicket nos dá essa facilidade.
Integrando o Wicket com o back-end
Para que o lookup do EJB com o uso das anotações do Java EE 5 funcione, precisamos instalar uma extensão especial. Infelizmente, não a encontrei pronta para download a partir de um repositório Maven e, por este motivo, foi preciso baixar o JAR do site e fazer a instalação manualmente no repositório local:
-
-
public class GuestbookApplication extends WebApplication {
-
-
// …
-
-
@Override
-
protected void init() {
-
addComponentInstantiationListener(new JavaEEComponentInjector(this));
-
}
-
}
-
Página de inclusão
Aqui temos um formulário que serve para registrar uma mensagem digitada pelo usuário. O formulário possui algumas regras de validação, fazendo uso inclusive de um validador customizado que montei para validar o campo URL:
-
-
package com.danielfmartins.guestbook.page;
-
-
// imports…
-
-
public class AddMessage extends WebPage {
-
-
@EJB(name="MessageRepositoryBean")
-
private MessageRepositoryRemote repository;
-
-
public AddMessage() {
-
add(new FeedbackPanel("feedback"));
-
add(new MessageForm("form"));
-
add(new PageLink("listLink", MessageList.class));
-
}
-
-
private class MessageForm extends Form {
-
private Message msg = new Message();
-
-
super(id);
-
setModel(new CompoundPropertyModel(msg));
-
add(new RequiredTextField("name"));
-
}
-
-
@Override
-
protected void onSubmit() {
-
repository.add(new Message(msg));
-
getSession().info("Message added"); // flash-scoped feedback message
-
setResponsePage(MessageList.class); // redirect-after-post
-
}
-
}
-
}
-
O validador URLPatternValidator usado no código não existe no Wicket, mas sua criação é bem trivial. Não mostrarei o código aqui, portanto, se houver interesse, baixe o projeto e veja como tudo foi feito e estruturado.
Resultado
Algumas screenshots da aplicação em execução:
Conclusão
Num mundo ideal, eu utilizaria o Grails sempre que possível. No entanto, atualmente isso significa nunca (a não ser em projetos pessoais). Mas nem tudo está perdido, pois o Wicket é uma excelente alternativa de framework web, principalmente quando o comparamos com frameworks mainstream como o Struts e… aquele que você sabe qual.
Para quem pensa que o Wicket é ruim em termos de comunidade, em setembro de 2006 foi publicado o livro Pro Wicket. As mailing lists do projeto são movimentadas e os usuários (e desenvolvedores) do Wicket são muito prestativos. Agora que a Apache promoveu o framework como top level project, é possível que esteja rolando um esforço maior na parte de documentação do projeto, que está bem melhor do que da última vez que vi.
Não há motivos para não dar uma experimentada no Wicket… vai que você gosta? ![]()


31 de agosto de 2007 às 3:51 pm
Heey!
Porque tanto ódio contra o JSF nesse coração?
31 de agosto de 2007 às 4:10 pm
auhauhauha… o caso aqui é sério mesmo!
Eu acho que eu irei para o túmulo sem conseguir esquecer de como foi difícil mostrar uma lista de objetos
Pessoaem um ComboBox, usando JSF. E depois que consegui, ver aquele código cheio de objetos jogados em umMapou envelopados emSelectItems me deu vontade de vomitar.Como se não bastasse, tem também a dificuldade em se criar aplicações “favoritáveis” e “indexáveis” por bots, navegação Struts-like, a falta de controle sobre os RenderKits/códigos HTML inválidos, o ciclo de vida ultra-complexo (que alguns chamam de 7-layer burrito)
e muitas outras coisas que simplesmente não entram na minha cabeça. Já sei, acho que sou burro demais pra usar JSF! Só pode. hehehe
23 de outubro de 2007 às 9:50 pm
Muito bom o Wicket…
Nossa, eu uso Strutas 1.x no trabalho.
E em casa uso o Mentawai, gosto muito!
Vi o Wicket e achei um espetaculo,show!
16 de dezembro de 2007 às 1:40 am
Eu como “swingueiro” (não é putaria, eu participei do projeto IRPF Java, no Serpro), fiquei apaixonado pelo Wicket.
Até agora não encontrei nada que não pudesse ser resolvido com ele.
Tudo de maneira muito eleante, simples, robusta, TESTÁVEL, bem diferente do JSF…
Fazemos testes unitários das páginas!!! isso é maravilhoso!!!
Estava tentando usar o JSF para fazer uma tela simples de listagem, com scrolling etc.
Me deparei com 200 mil problemas, commandlink que nao funciona dentro de datatables, scroller que noa ta na especificacao mas implementado com os dados TODO EM MEMORIA no tomahawk e richfaces…putz
Tomei nojo do JFS, me soa como a velha lorota do EJB Entity, a qual o Hibernate veio com tudo e destruiu…tanto que o EJB 3.0 é uma cópia deslavada do hibernate.
Usem, usem wicket.
Faz bem pra cabeça, faz bem pro seu negócio!
16 de dezembro de 2007 às 11:55 am
Pelo visto, você odeia o JSF tanto quanto eu! Agora posso dizer que o problema não é comigo.
[]s!
31 de janeiro de 2008 às 7:49 am
Eu vi agora falar do Wicket, achei seu artigo em uma procura no google, achei legal o Wicket, gosto muito do JSF e uso no dia a dia, não tenho problemas com ele, vou colocar em pratica Wicket para ter uma opinião melhor.
31 de janeiro de 2008 às 8:11 am
Olá Rodolpho,
Eu queria não ter tido problemas com o JSF… mas ele foi cruel comigo.
Valeu pelo comentário!
27 de março de 2008 às 12:50 am
Sou colega de trabalho do Joselito e coincidentemente achei esse artigo no Google (não sabia q ele tinha postado esse comentário).
Eu e ele estamos trabalhando em um projeto em uma equipe de 4 pessoas desde outubro/2007. Ele servirá de referência para futuros projetos na empresa em que trabalhamos. Por isso, é muito importante acertarmos.
A coisa começou com JSF… nessa época eu não estava no projeto mas mantinha contato direto. Bem, não preciso dizer que todos os dias a equipe enfrentava um problema diferente. O pior é que aparentemente era difícil fazer coisas básicas funcionarem. A equipe estava desmotivada depois de pouco tempo.
Em um momento alguém sugeriu reavaliarmos a decisão sobre JSF. A princípio não sabíamos o que poderia substituí-lo, até que alguém lembrou do Wicket. Estudamos rapidamente e nossa vida mudou.
Hoje o projeto está em uma fase bem mais avançada e estamos satisfeitíssimos com o Wicket. É um framework muito elegante e cai como uma luva onde trabalhamos. Aproveitamos como nunca antes as HTMLs criados pelos designers.
Geralmente quando falo sobre o Wicket com alguém, digo o seguinte: não julgue precipitadamente o framework sem usá-lo antes. A princípio, quando vc vê a implementação de uma página em Java, pode ficar assustado. Mas não fique: use-o, faça um projetinho, umas duas ou três páginas mais complicadas. Você verá que a coisa simplesmente funciona, e geralmente de primeira. Continue usando e terá constantemente surpresas positivas. Aos poucos verá, entre muitas outras coisas, a simplicidade quase ridícula de uso de Ajax, os avisos amigáveis em modo de desenvolvimento, o excelente desempenho, as telas de erro com bom nível de detalhes e a simplicidade de criação de novos componentes.
[]’s a todos
27 de março de 2008 às 8:24 am
Excelente Cristiano, muito obrigado por dividir conosco suas experiências!
Abraços.
23 de julho de 2008 às 4:33 pm
Wicket seria adequado a um inciante em java? Ainda não consigo entender claramente Java e OO.
Venho do suporte e atualmente trabalho com código CSP que é convertido para COBOL/CICS.
23 de julho de 2008 às 4:38 pm
Olá Ricardo,
Eu diria que o Wicket é mais “intuitivo” para quem já tem uma base mais forte de Java e de OO. Algo que facilita bastante na hora de entender o funcionamento do Wicket é conhecer um pouco de Swing.
Abraços!
23 de julho de 2008 às 5:10 pm
Obrigado Daniel.
Finalmente terminei a graduação e vou ter tempo de me dedicar ao “novo mundo” da programação.