1) O documento discute a simplificação do desenvolvimento Java/Java EE através da criação de frameworks como o Spring. 2) O Spring cria um container de inversão de controle e abstrações para bancos de dados e transações para tornar o desenvolvimento mais fácil. 3) O Spring MVC simplifica o desenvolvimento web, fornecendo mapeadores de URL, resoluções de visualização e controladores para lidar com requisições.
10. O que é?
¡ Umesqueleto semi-pronto para ser
estendido;
¡ Contém implementações genéricas;
¡ Deve
tornar o difícil fácil e o
impossível possível;
12. E qual é a missão dele?
¡ Desenvolver aplicações Java EE tem
que ser mais fácil;
¡ Programar para interfaces é melhor
do que programar para classes
concretas;
¡ Desenvolvimento orientado a
objetos é mais importante do que a
tecnologia utilizada;
13. O que ele oferece pra isso?
¡ Um container de Inversão de
Controle;
¡ Abstração para o controle de
transações;
¡ Abstração para bancos de dados;
¡ Programação Orientada a Aspectos;
¡ Integração com vários outros
projetos;
14. E quem
disse que eu
sei o que é
essa tal de
Inversão de
Controle?
15. A Inversão de Controle
redefine...
...dois princípios da
Orientação a Objetos
19. Objetos devem informar os
contratos que eles precisam
implementar
Trabalhando com contratos (ou
interfaces) as intimidades deles não
vão interessar a ninguém
20. Os objetos devem dizer de
quais objetos eles dependem
Pra que alguém possa fornecer essas
dependências
23. Os dois princípios foram
realmente redefinidos?
O que?
Quando?
Porque?
Onde está Wally?
24. Existem dois tipos de inversão
¡ Injeção de dependências;
¡ Busca por dependências;
25. Busca por dependências
¡ Quem precisa, tem que correr
atrás;
¡ As dependências ficam em um
contexto geral do sistema, ou não;
¡ Costumam ser disponibilizadas em
eventos específicos;
26. Injeção de dependências
¡ Quem precisa, diz que precisa e
recebe na mão;
¡ As dependências ficam onde elas
quiserem ficar;
¡ Podem ser disponibilizadas a
qualquer momento, depende de
quem precisa;
27. Voltando ao nosso assunto...
... Vejamos como é
possível acessar o Spring
28. Acessando o Spring
¡ Configurado com (mais um) arquivo
XML;
¡ Os objetos ficam no
ApplicationContext;
¡ Os objetos não podem depender de
objetos que não estejam no
ApplicationContext;
29. Um ApplicationContext pode ser criado
pelas seguintes classes:
¡ FileSystemXmlApplicationContext
¡ ClassPathXmlApplicationContext
¡ Emuma aplicação web o contexto
normalmente é carregado por um
ServletContextListener específico do
Spring
31. Como ficam os objetos
¡ Todos são singletons por default;
¡ Cada um deve ter o seu próprio
id ;
¡ Podem ser referenciados em um
arquivo e utilizados em outro;
¡ As dependências só são inseridas
uma única vez;
¡ Não é possível acessar objetos que
não tem um contrutor público;
36. São transformados de String
para os seus objetos
usando PropertyEditors
customizados
37. Como eu crio um PropertyEditor?
¡ Extendendo a classe
PropertyEditorSupport;
¡ Implementando os métodos
setAsText() e getAsText();
¡ E basta registrar ele no
ApplicationContext;
¡ 99% das vezes isso não é
necessário;
44. Implementando a interface
FactoryBean
¡ O método getObject() retorna o
objeto que essa fábrica deve
produzir;
¡ O método isSingleton() avisa se o
objeto produzido é um singleton ou
não;
¡ O método getObjectType() deve
retonar o tipo (Class) do objeto que
esta fábrica produz;
45. Como implementar o acesso ao
banco de dados no nosso
sistema?
Por que não deixar as classes
acessarem a classe utilitária
diretamente?
52. Como é o nosso repositório?
public interface Repositorio {
public void adicionar(Persistivel objeto);
public void atualizar(Persistivel objeto);
public void remover (Persistivel objeto);
public Persistivel pegarPeloId(Long id);
public List pegarTodos(Class clazz);
}
55. O método getContainer() é
abstrato
Então nós temos que
encontrar uma maneira de
oferecer os ObjectContaners
da nossa fábrica
56. Mas ainda existe outro
problema
O Repositório é um singleton, mas
tem que receber novos
ObjectContainers a cada chamada do
método getContainer()
57. Como resolver isso?
¡ Criar uma classe que estenda a
RepositorioDoDb4o;
¡ Implementar a interface
ApplicationContextAware;
¡ Pegar o ApplicationContext e pegar
os ObjectContainers diretamente;
58. Em código....
public class RepositorioSpring extends RepositorioDoDb4o
implements ApplicationContextAware {
private ApplicationContext context;
public ObjectContainer getContainer() {
return context.getBean( objectContainerFactory );
}
public void setApplicationContext(ApplicationContext
context) {
this.context = context;
}
}
68. Todo o código está livre da
interação com o banco
O Spring provê mecanismos mais
simples de se utilizar para os
frameworks mais conhecidos, como o
Hibernate
70. Peraí!
É necessário adicionar o Servlet que
vai responder as requisições do
Spring no web.xml com um
mapeamento
Sem o Servlet do Spring ele não pode
responder a requisições feitas ao
servidor
71. Características
¡ Várias classes de suporte para formulários
e requisições normais;
¡ Transformação automática de valores do
request para objetos;
¡ Suporte transparente a vários
mecanismos de visualização;
¡ Totalmente configurado dentro do próprio
Spring
¡ Os controladores não são thread-safe;
72. Mapeadores de URL
Existem várias estratégias
disponíveis, mas os mais utilizados
são BeanNameUrlHandlerMapping e o
SimpleUrlHandlerMapping
79. A interface Controller
¡ É a interface base para a parte web
do Spring;
¡ Define um único método,
handleRequest() que deve
retornar um objeto ModelAndView;
¡ Esse é o método chamado quando
uma dessas classes recebe uma
requisição HTTP;
80. Os objetos ModelAndView
¡ Servem como abstração para
colocação de objetos que devem
aparecer na visualização;
¡ Também recebe o nome lógico pelo
qual a view responsável vai ser
encontrada;
¡ Não é necessário indicar qual o tipo
da view que vai gerar a resposta;
81. Controlador AbstractController
¡ Classe simples para a resposta a
requisições diretas;
¡ Não é indicada para o uso de
formulários;
¡ Pode responder a qualquer método
HTTP;
¡ Não tem suporte a validação;
¡ O método que deve ser sobrescrito
é o handleRequestInternal()
82. Criando o ListarAction
¡ Umobjeto que lista todos os
objetos de uma certa classe;
¡ Faz
uma busca utilizando o
repositório;
83. Propriedades do nosso objeto
private Class classe;
private String view;
private Repositorio repositorio;
85. O Controlador SimpleFormController
¡ É utilizado para lidar com
formulários;
¡ Faz a conversão automática de tipos
primitivos e também pode registrar
seus próprios PropertyEditors;
¡ Tem suporte a validação;
¡ Os objetos podem ficar na sessão
ou podem ser recriados a cada
requisição
87. É o mesmo objeto para o GET e o
POST
¡ NoGET ele carrega o objeto e
coloca ele para ser visualizado no
método formBackingObject();
¡ No
POST ele faz a validação do
formulário e se não tiver nenhum
erro chama o método onSubmit();
88. Criando o FormAction
¡ É responsável por inserir e editar os
objetos no banco de dados;
¡ É capaz de tranformar todas as
propriedades simples;
¡ Pode ser extendido para lidar com
propriedades complexas;
89. Quando ele recebe um GET
String id = request.getParameter("chave");
if ( id != null ) {
Persistivel objeto
=repositorio.pegarPeloId( new Long(id) );
return objeto;
}
return super.formBackingObject(request);
90. Quando ele recebe um POST
this.getRepositorio().adicionar
( (Persistivel) command);
return new ModelAndView
( this.getSuccessView() );
93. A validação é feita pela
interface Validator
Basta implementar os métodos
supports() e validate(). Quando
ocorrer um erro, chama-se o método
reject() no objeto Errors, o Spring
retorna a requisição e mostra o erro
automaticamente.
94. Em código...
public void validate(Object obj, Errors
errors) {
Pessoa pessoa = (Pessoa) obj;
if (pessoa.getNome() == null) {
errors.rejectValue( nome , obrigatorio ,
Este campo é obrigatório );
}
}
104. O que é o Velocity?
É uma ferramenta de geração texto
dinamicamente, para aplicações
desktop ou web
105. Como ele funciona?
¡ Você escreve um arquivo de texto
qualquer com as diretivas da
Velocity Template Language (VTL);
¡ Manda o Velocity carregar o
arquivo;
¡ Cria um conjunto de objetos que vai
ser utilizado para gerar o resultado;
¡ E recebe um String com o que for
criado;
106. VelocityEngine
¡ É a classe que é utilizada para se
acessar o Velocity;
¡ Faz o carregamento dos Templates;
¡ Uma mesma VelocityEngine pode
ser reutilizada por toda a aplicação;
107. Configurando uma VelocityEngine
engine = new VelocityEngine();
Properties props = new Properties();
props.put("resource.loader", "class");
props.put("class.resource.loader.class",
ClasspathResourceLoader.class.getName());
props.put("class.resource.loader.cache",
"false");
engine.init(props);
108. Criando e executando um template
Template template =
engine.getTemplate("org/maujr/
velocity/noticias.html");
Context context = new VelocityContext
();
List<Noticia> noticias = new
ArrayList<Noticia>();
//criando as notícias
context.put("objetos", noticias);
Writer writer = new StringWriter();
template.merge(context, writer);
System.out.println(writer.toString());
109. O que é a VTL?
É uma linguagem simples para o
tratamento dos templates
113. Tem alguma diferença?
<a href= /verArtigo/$command.id.do >
Ver artigo
</a>
<a href= /verArtigo/${command.id}.do >
Ver artigo
</a>
114. Como criar uma variável no
template?
Usando #set:
#set( $nome = Maurício )
115. Execução Condicional - #if
¡ Operador para tratar condições
¡ Recebe um boolean
¡ Se o valor retornar null ele
interpreta como false
¡ Pode conter uma condição #else
¡ Pode conter várias condições #elseif
para funcionar como um switch
¡ Pode conter os operadores ==, >=,
<= e !=
117. Em código com #else e #elseif
#if (${command.id})
<input type="hidden"
name="chave" value="$!
{command.id}"/>
#elseif (${command.id} == 10)
O valor do id é 10
#else
Caiu no Else
#end
118. Passeando pelas coleções com
#foreach
¡ Faz a iteração dentro de todas as
coleções do Java
¡ Não tem controle nativo do
tamanho do loop
¡ O contador pode ser acessado pela
variável ${velocityCounter}
119. Em código...
#foreach($noticia in ${objetos})
<tr>
<td>${noticia.titulo}</td>
<td>${noticia.texto}</td>
<td>
<a href="noticia.html?chave=$
{noticia.id}">
Editar
</a>
</td>
</tr>
#end
121. É um #macro!
Um macro é uma função que pode
ser reutilizada em vários templates
diferentes
122. Como se define isso?
#macro (nomeDoMacro $variavel
$outraVariavel $maisOutra)
escreve qualquer coisa
#end
123. Onde colocar isso?
¡ Macros devem ser colocados em
arquivos separados
¡ Eles são carregados pelo próprio
Velocity quando uma VelocityEngine
é criada, através da propriedade
velocimacro.library
129. Agora eu vou
colocar em
prática o
meu plano
maligno!
130. A aplicação de exemplo precisa de
novas funcionalidades
¡ Cadastrar, editar e listar usuários
¡ Montar
as mensagens de e-mail que
vão ser enviadas para cada
endereço