Ola pessoal,
Estou iniciando um projeto usando GWT + Spring + Hibernate e estou tentando fazer uma arquitetura extremamente componentizada levando em conta o cliente. Nao vou entrar em detalhes como estou configurando e cmponentizando o Spring e o Hibernate por que nao vem ao caso, mas o importante e que componentes GWT acessam o Spring e o Hibernate para buscar seus dados e chamadas a sevicos.
Dito isso, comecei o systema criando 4 projetos:
Client - Projeto de client onde os componentes criados em components vao ser utilizados
Components - Onde os componentes GWT estarao implementados, ou pelo menos os componentes que me interessam para reuso
Service - Spring beans e aquela koizarada
Common - Objetos de Transferencia (VO, DTO), classes utilitarias entre as camadas, excecoes e coisas assim.
Bom, o assunto q eu quero levantar e o projeto de Components. Eu estou criando classes de client que extendem de Composite, como o proprio GWT recomenda e criando servlets com RPC quando o componente precisa de acessos a servicos. Parece bem legal, vou mostrar aqui um pedaco de como esta ficando o codigo:
Classe de Login component:
package com.eventtouch.web.components.composite.login.client;
import com.eventtouch.web.core.util.AsyncUtil;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Widget;
import com.gwtext.client.widgets.MessageBox;
import com.gwtext.client.widgets.MessageBoxConfig;
import com.gwtext.client.widgets.Window;
import com.gwtext.client.widgets.form.FormPanel;
import com.gwtext.client.widgets.form.Label;
import com.gwtext.client.widgets.form.TextField;
public class LoginComposite extends Composite {
Window window = new Window("Restricted Area");
FormPanel loginPanel = new FormPanel();
TextField email = new TextField("Email", "email");
TextField password = new TextField("Password", "password");
Label loginMessage = new Label();
Button button = new Button("login");
public LoginComposite() {
window.setBodyBorder(false);
window.setBorder(false);
window.setPaddings(5);
window.setPlain(false);
window.setClosable(false);
window.setModal(true);
email.setAllowBlank(false);
password.setAllowBlank(false);
password.setPassword(true);
button.addClickListener(new ClickListener() {
public void onClick(Widget arg0) {
LoginCompositeServletAsync async = (LoginCompositeServletAsync) AsyncUtil
.getAsyncServlet(LoginCompositeServlet.class,
"loginComposite");
MessageBox.show(new MessageBoxConfig() {
{
setTitle("Please wait...");
setMsg("Logging in...");
setWidth(200);
setModal(true);
setClosable(false);
}
});
async.login(email.getText(), password.getText(), new AsyncCallback() {
public void onSuccess(Object arg0) {
MessageBox.hide();
window.close();
}
public void onFailure(Throwable arg0) {
MessageBox.hide();
loginMessage
.setText("Invalid user. Check you login and password and try again");
}
});
}
});
loginPanel.add(email);
loginPanel.add(password);
loginPanel.setBorder(false);
loginPanel.setPaddings(10, 10, 30, 10);
window.add(loginMessage);
window.add(loginPanel);
window.add(button);
initWidget(window);
}
}
Esta classe eh o proprio componente de login, sendo agora um GWT component generico que pode ser acessado via um client por pura instanciacao:
package com.eventtouch.web.core.base.client;
import com.eventtouch.web.components.composite.login.client.LoginComposite;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.RootPanel;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.layout.BorderLayout;
public class BeConnectedEntryPoint implements EntryPoint {
Boolean loginResult;
public void onModuleLoad() {
Panel homePanel = new Panel();
homePanel.setBorder(false);
LoginComposite loginComposite = new LoginComposite();
homePanel.setLayout(new BorderLayout());
homePanel.add(loginComposite);
RootPanel.get("loginPlaceHolder").add(homePanel);
}
}
A abordagem parece boa, os componentes parecem legais e usaveis, mas aih me veio uma pulga atras da orelha ontem. Estava conversando com um amigo sobre o projeto e ele tambem esta trabalhando com GWT. A grande diferenca eh que ele fez os componentes dele extender de EntryPoint em vez de fazer Composites. Assim cada vez que ele precisa de um componente, ele extende uma super classe de entry point com os componentes configurados ow configura no gwt.xml um "inherits" pra usar. E uma alternativa, mas nao tenho certeza se eh uma boa idea.
Gostaria de ter a opiniao de voces, que boas praticas voces estao usando com GWT, abordagens, vantagens, desvantagens. Eu gosto da minha ideia de componentes, mas nao estou seguro em seguir com ela na maneira q eu implementei, entao se voces tem ideias sao muito bem vindas.
Abraco
Gabriel Thiesen