Eu acho que a melhor comparação a ser feita é a comparação do Rodrigo Yoshima no tópico “JSF é o futuro nas empresas???”. Recomendo dar uma passada por lá, especialmente a página 11.
Eis o post do Rodrigo:
[quote=rodrigoy]Olá Amigos… discussãozinha acirrada. Bem, posso estar completamente maluco e falando a maior besteira da minha vida, mas vocês não acham que a discussão toda roda em cima de framework web component-based vs action-based?
Vamos lá… desenvolví várias aplicações em Struts 1, ainda não conhecí Struts 2, ví exemplos do WebWork e do Mentawai, ainda não ví do VRaptor… Basicamente Action Frameworks trabalham de maneira similiar e abstrações parecidas. Não vou citar Rails pois não conheço tanto para fazer comparações.
O que quero colocar aqui é que JSF, ou qualquer framework component based, trabalha com uma abstração melhor que frameworks action-based, e melhores abstrações são mais fáceis de serem construídas e mantidas. Deixa eu pegar um exemplo Mentawai vs SEAM:
package org.helloworld.action;
import java.util.Collection;
import org.helloworld.entity.User;
import org.helloworld.service.UserService;
import org.mentawai.core.BaseAction;
import org.mentawai.filter.ModelDriven;
public class UserAction extends BaseAction implements ModelDriven {
private UserService userService = new UserService();
public Object getModel() {
return userService;
}
public String add() {
if (isPost()) { // POST
String name = input.getStringValue("name");
if (name == null || name.trim().equals("")) {
addError("Por favor digite um nome!");
return ERROR;
}
User u = input.getObject(User.class);
userService.add(u);
return SUCCESS;
} else { // GET
return JSP;
}
}
public String list() {
Collection<User> users = userService.getUsers();
output.setValue("users", users);
return SUCCESS;
}
}
Usando o SEAM, essa Action poderia ser um Application Facade:
package application;
import java.util.List;
import domain.User;
import domain.UserRepository
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
@Name("usuarioFacade")
public class UsuarioFacade {
@In
UserRepository repository;
@In
User user;
public void add() {
repository.add(user);
}
public List<User> getUsers() {
return repository.getAll();
}
}
Os dois exemplos acima fazem a mesma coisa. Antes de comentar vamos às páginas:
Primeiro no Mentawai (partes não interessantes foram cortadas):
<h3>Please enter you name:</h3>
<mtw:outError><font color="red"><mtw:out /></font><br /><br /></mtw:outError>
<form action="<mtw:contextPath />/UserAction.add.mtw" method="post">
<mtw:input name="name" type="text" size="20" /> <br /><br />
<input type="submit" value="Say Hello" />
</form>
<h2>The following persons have said "hello" to Mentawai:</h2>
<mtw:list value="users">
<mtw:isEmpty>
<h4>Nobody has said so yet!</h4>
</mtw:isEmpty>
<mtw:loop var="user">
<mtw:out value="user.name" /><br />
</mtw:loop>
</mtw:list>
No SEAM:
<h:messages globalOnly="true" styleClass="message"/>
<h:form>
Please enter your name:
<h:inputText value="#{user.name}"/>
<h:commandButton action="#{usuarioFacade.add}"/>
</h:form>
<h2>The following persons have said "hello" to SEAM:</h2>
<h4><h:outputText value="Nobody has said so yet!" rendered="#{usuarioFacade.users is null}"/></h4>
<ui:repeat value="#{usuarioFacade.users}" var="usr">
<h:outputText value="#{usr.name}"/>
</ui:repeat>
Queria destacar alguns pontos para demonstrar essa questão de “abstrações melhores”. Primeiramente, leia a action do Mentawai (pode ser qualquer outro action-framework) e leia a Facade do Seam. Qual lhes parece mais focada na solução do problema? A página inclui um usuário e lista usuários. Qual é mais concisa nesses dois pontos?
E as páginas? O fato de você poder usar a própria entidade na página não é relevante? Não fica mais claro a indicação da ação ficar diretamente no botão?
Minha defesa sobre JSF não é necessariamente para “JSF”, mas sim para abstrações melhores. Action Frameworks possuem abstrações fracas. Sempre preciso de alguma coisa que represente um HTML Form (coisas como input.getStringValue(“name”)). Isso é uma abstração fraca, é algo que não precisaria me preocupar. Pior ainda quando tenho que ter uma classe que represente uma ação como Actions do Struts.
Bem, quero que vocês entendam que não estou criticando Mentawai aqui. Poderia ser qualquer Action Framework e os exemplos seriam parecidos. Na sinceridade? Passei a gostar de fazer sistemas Web em Java quando o SEAM trouxe essa idéia de “Contextual Components”. Não é a bala de prata, pode dificultar a escalabilidade, mas simplesmente é uma abstração melhor. Como estou fazendo sistemas hoje que pretendo viver deles nos próximos 10 anos, quero boas abstrações.
Até!!!
[/quote]