Java para Web
231 pág.

Java para Web


DisciplinaOrientação A Objetos170 materiais1.088 seguidores
Pré-visualização45 páginas
- Página 176
Material do Treinamento Java para Desenvolvimento Web
Usando o Criteria, como no listaTudo anteriormente, isso é bastante simples. Nosso método página fica
assim:
public List<Produto> pagina (int inicio, int quantia) {
return this.session.createCriteria(Produto.class)
.setMaxResults(quantia).setFirstResult(inicio).list();
}
O método setMaxResults determina o tamanho da lista (resultados por página) e o método setFirstResult
determina em que ponto a listagem deve ter início. Por fim, basta chamar o método list() e a listagem devolvida
será apenas daquela página!
E vamos adicionar também o método listaAPartirDoTerceiro:
public List<Produto> listaAPartirDoTerceiro (){
return this.session.createQuery(&quot;from Produto where id > 2&quot;).list();
}
Poderíamos passar alguns parâmetros para essa busca, mas isso só será visto no cursos de Web Avançado.
16.22 - Exercícios
1) Modifique a sua classe ProdutoDAO e acrescente os métodos listaTudo() e pagina()
public List<Produto> listaTudo() {
return this.session.createCriteria(Produto.class).list();
}
public List<Produto> pagina (int inicio, int quantia) {
return this.session.createCriteria(Produto.class)
.setMaxResults(quantia).setFirstResult(inicio).list();
}
public List<Produto> listaAParitrDoTerceiro (){
return this.session.createQuery(&quot;from Produto where id > 2&quot;).list();
}
2) Crie uma classe chamada TestaBuscas:
public class TestaBuscas {
public static void main(String [] args){
Session session = new HibernateUtil().getSession();
ProdutoDAO produtoDao = new ProdutoDAO(session);
System.out.println(&quot;*****Listando Tudo*******&quot;);
for(Produto p : produtoDao.listaTudo()) {
System.out.println(p.getNome());
}
System.out.println(&quot;*****Listando Paginado*******&quot;);
for(Produto p : produtoDao.pagina(2,3)) {
Capítulo 16 - Hibernate - Exercícios - Página 177
Material do Treinamento Java para Desenvolvimento Web
System.out.println(p.getNome());
}
System.out.println(&quot;*****Listando a partir do terceiro*******&quot;);
for(Produto p : produtoDao.listaAPartirDoTerceiro()) {
System.out.println(p.getNome());
}
}
}
16.23 - Exercícios para o preguiçoso
1) Mude a propriedade hibernate.show_sql para true no arquivo hibernate.properties e rode a classe acima.
2) Teste um programa que faz somente o seguinte: busca um produto por id. O código deve somente buscar o
produto e não imprimir nada! Qual o resultado?
Session session = new HibernateUtil().getSession();
Produto encontrado = (Produto) session.load(Produto.class, 1L);
3) Tente imprimir o nome do produto do teste anterior, o que acontece?
Session session = new HibernateUtil().getSession();
Produto encontrado = (Produto) session.load(Produto.class, 1L);
System.out.println(encontrado.getNome());
4) Antes de imprimir o nome do produto, tente imprmir uma mensagem qualquer, do tipo: \u201cO select já foi feito\u201d.
E agora? Como isso é possível?
Session session = new HibernateUtil().getSession();
Produto encontrado = (Produto) session.load(Produto.class, 1L);
System.out.println(&quot;O select já foi feito&quot;);
System.out.println(encontrado.getNome());
Então, onde está o código do select? Ele deve estar no método getNome(), certo?
5) Imprima o nome da classe do objeto referenciado pela variável encontrado:
Session session = new HibernateUtil().getSession();
Produto encontrado = (Produto) session.load(Produto.class, 1L);
System.out.println(&quot;O select já foi feito&quot;);
System.out.println(encontrado.getNome());
System.out.println(encontrado.getClass().getName());
O Hibernate retorna um objeto cujo tipo estende Produto: ele não deixa de ser um Produto mas não é
somente um Produto.
O método getNome foi sobrescrito nessa classe para fazer a busca na primeira vez que é chamado, economi-
zando tempo de processamento.
É claro que para fazer o fine-tuning do Hibernate é interessante conhecer muito mais a fundo o que o
Hibernate faz e como ele faz isso.
Capítulo 16 - Hibernate - Exercícios para o preguiçoso - Página 178
Material do Treinamento Java para Desenvolvimento Web
16.24 - Exercício opcional
1) Crie um sistema para cadastro e listagem de produtos usando o struts. Siga o padrão que utilizamos para
cadastro e listagem de contatos.
Capítulo 16 - Hibernate - Exercício opcional - Página 179
CAPÍTULO 17
VRaptor
\u201cAquele que castiga quando está irritado, não corrige, vinga-se\u201d
\u2013 Michel de Montaigne
Neste capítulo, você aprenderá:
\u2022 O que é Inversão de Controle, Injeção de Dependências e Convention over Configuration;
\u2022 Como utilizar um framework MVC baseado em tais idéias;
\u2022 Como abstrair a camada HTTP da sua lógica de negócios;
\u2022 Como não utilizar arquivos XML para configuração da sua aplicação.
17.1 - Eu não quero o que eu não conheço
No mundo Java para a web, vamos lembrar como fica um código utilizando um controlador MVC simples
para acessar os parâmetros enviados pelo cliente.
É fácil notar como as classes, interfaces e apetrechos daquele controlador infectam o nosso código e come-
çamos a programar voltado a tal framework. O código a seguir mostra uma ação que utiliza um DAO para incluir
um contato no banco de dados.
public class AdicionaContato implements Action {
public String executa(HttpServletRequest req, HttpServletResponse res) throws Exception{
Contato contato = new Contato();
contato.setNome(req.getParameter(&quot;nome&quot;));
contato.setEndereco(req.getParameter(&quot;endereco&quot;));
contato.setEmail(req.getParameter(&quot;email&quot;));
ContatoDAO dao = new ContatoDAO();
dao.adiciona(contato);
return &quot;/ok.jsp&quot;;
}
}
Baseado no código acima, percebemos que estamos fortemente atrelados a HttpServletRequest e
seu método getParameter. Fora isso, usamos diversas classes estranhas ao nosso projeto: Action,
HttpServletRequest e HttpServletResponse. Se estivéssemos controlando melhor a conexão, seria neces-
sário importar Connection também! Nenhuma dessas classes e interfaces citadas faz parte do nosso projeto!
Não é o código que modela minha lógica!
180
Material do Treinamento Java para Desenvolvimento Web
É muito chato, e nada prático, repetir isso em toda a sua aplicação. Sendo assim, visando facilitar esse tipo
de trabalho, vimos que o Struts Action, por exemplo, utiliza alguns recursos que facilitam o nosso trabalho:
public class AdicionaContato extends Action {
public ActionForward execute(ActionMapping map, ActionForm form,
HttpServletRequest req, HttpServletResponse res)
throws Exception {
Contato contato = ((ContatoForm) form).getContato();
ContatoDAO dao = new ContatoDAO();
dao.adiciona(contato);
return map.findForward(&quot;ok&quot;);
}
}
Mas, mesmo assim, imagine os limites de tal código:
\u2022 Você não pode receber mais de um action form;
\u2022 Sua classe deve estender ActionForm. Se você queria estender outra, azar;
\u2022 Você deve receber todos esses argumentos que não foi você quem criou;
\u2022 Você deve retornar esse tipo que não foi você quem criou;
\u2022 Você deve trabalhar com Strings ou tipos muito pobres. O sistema de conversão é complexo para inician-
tes;
\u2022 O código fica muito alienado: ele é escrito de tal forma que o programador precisa agradar o framework e
não o framework para agradar o programador;
\u2022 Você acaba criando classes repetidas: deve criar dois beans repetidos ou parecidos, ou ainda escrever
muito código xml para substituir um deles.
De tais problemas surgiram diversos outros frameworks, inclusive diversos patterns novos, entre eles, In-
jeção de Dependências (Dependency Injection), Inversão de Controle (Inversion of Control \u2013 IoC) e prefira
convenções em vez de configuração (Convention over Configuration \u2013 CoC).
Imagine deixar de estender Action:
public class AdicionaContato {
public ActionForward execute(ActionMapping map, ActionForm form,
HttpServletRequest req, HttpServletResponse res)
throws Exception {
Contato contato = ((ContatoForm) form).getContato();