Tatanka.com.br: Sérgio Lopes

Dite as regras na sua aplicação:
Web MVC com IoC e Reflection

Essa palestra foi apresentada como Tutorial no Conexão Java 2005. O conteúdo abaixo contém mais explicações que os slides exibidos, assim todos podem acompanhar melhor. Os códigos também estão disponíveis em links. (no final da página estão todos os códigos juntos)

Sérgio L. Lopes Jr. (sergio arroba caelum.com.br)

Caelum - www.caelum.com.br

A Palestra

Problemas

MVC, uma solução

Dividir tudo em camadas

MVC, uma solução

As camadas:

Qual o papel de um controlador?

  1. Recebe a requisição
  2. Decide o que executar
  3. Executa!
  4. Redireciona pra View

Onde ficam as ações?

Ações são o que está no "switch"... Mas:

Command Pattern

public interface Action {
  void execute(
    HttpServletRequest request, HttpServletResponse response
  );
}
	

Separando as ações

HTML no código Java?

Executar e Visualizar

controller.properties

this.properties = new Properties();
this.properties.load(getClass().getClassLoader().
	getResourceAsStream("controller.properties"));
	

Ainda temos um switch

O que é Reflection?

Instanciar a Action

Independência

Passando Atributos

Nosso MVC Pull

Mudanças no Controller

Mais Independência

Pegar parâmetros

Inversão de Controle

IoC: Setter Injection

Setter Injection

paraCada (metodo nos metodosDaAction) {
   se (é um setter) {
      procura um parametro com esse nome;
      chama o setter passando o valor do parametro;
   }
}
	
for (Method method : action.getClass().getMethods()) {
	String m = method.getName(); 
	if (m.startsWith("set")) {
		String p = request.getParameter(m.substring(3,4).toLowerCase() + m.substring(4));
		if (p != null) {
			method.invoke(action, p);
		}
	}
}
	

Independentes!

Muita independência?

IoC: Constructor Injection

Diferentes injeções

Constructor Injection: Exemplo

public class Login implements Action {
  private HttpServletRequest request;
  private String nome;
  public Login(HttpServletRequest r) {
    request = r;
  }
  public void execute() {
    this.request.getSession().
	setAttribute("usuario", this.nome);
  }
  //setter para o campo nome
}
	

Constructor Injection: Implementando

construtor := o construtor da Action;
paraCada (parametro nos parametrosDoConstrutor) {
  acha um objeto que satisfaça o tipo do parametro;
}
chama o construtor passando os objetos encontrados;
	

Constructor Injection: O contexto

Código final:

Como está o framework?

Sugestões: Algumas melhorias no nosso framework

Sugestões: Alguns links legais

Achou algum erro? Tem alguma sugestão ou dúvida? Escreva pra mim em sergio arroba caelum.com.br

Tatanka.com.br: Sérgio Lopes