Prévia do material em texto
1 Programação em Java para Web JavaBeans Prof. Razer Anthom Nizer Rojas Montaño 2012 Prof. Razer A N R Montaño Java Web - JavaBeans 2/33 Introdução � JavaBean é uma classe Java com uma padronização nos nomes dos métodos � Também conhecidos como Beans � Há o conceito de propriedade que são acessadas por estes métodos padronizados � São componentes de software � Componentes encapsulados � Seus atributos só podem ser acessados via métodos � Propriedades (Atributos) privados � Métodos acessadores públicos 2 Prof. Razer A N R Montaño Java Web - JavaBeans 3/33 Padrão � Padrão de métodos acessadores getXxx isXxx (quando a propriedade é booleana) setXxx (opcional) Onde Xxx é o nome do atributo da classe � Construtor � Deve ser sem parâmetros � JavaBeans devem implementar a interface Serializable � Pode conter métodos diversos para realizar outras tarefas Prof. Razer A N R Montaño Java Web - JavaBeans 4/33 Exemplo import java.io.Serializable; public class Aluno implements Serializable { private int idade; private boolean matriculado; public Aluno() { } public int getIdade() { return this.idade; } public void setIdade(int idade) { this.idade = idade; } public boolean isMatriculado() { return this.matriculado; } public void setMatriculado(boolean matriculado) { this.matriculado = matriculado; } } 3 Prof. Razer A N R Montaño Java Web - JavaBeans 5/33 Persistência � Porque implementar a interface Serializable? � Para que o Bean seja persistente � Implementando esta interface pode-se serializar um objeto � Serialização � Salvar o objeto em um stream para posterior recuperação � Quando houver recuperação, o objeto se comporta como antes de ser salvo � O objeto é recuperado no mesmo estado em que foi salvo Prof. Razer A N R Montaño Java Web - JavaBeans 6/33 Propriedades � 4 tipos � Simples: alteram a aparência ou comportamento do bean e são acessados pelos seus métodos � Ligadas: quando a alteração da propriedade provova uma notificação a um outro bean � Reprimidas: a alteração pode ser vetada pelo próprio bean ou por objetos externos � Indexadas: propriedades acessadas via índice, como arrays. 4 Prof. Razer A N R Montaño Java Web - JavaBeans 7/33 Propriedades Indexadas � Propriedades Indexadas - Vetores: private int[] numeros; � Acesso ao vetor inteiro: public int[] getNumeros(); public void setNumeros(int[] value); � Acesso a um elemento específico: public int getNumeros(int index); public void setNumeros(int index, int value); Prof. Razer A N R Montaño Java Web - JavaBeans 8/33 Exemplo import java.io.Serializable; public class Teste implements Serializable { private int[] numeros; public Teste() { } public int[] getNumeros() { return numeros; } public void setNumeros(int[] numeros) { this.numeros = numeros; } public int getNumeros(int index) { return this.numeros[index]; } public void setNumeros(int index, int value) { this.numeros[index] = value; } } 5 Prof. Razer A N R Montaño Java Web - JavaBeans 9/33 IDEs x JavaBeans � Beans podem ser lidos por ferramentas IDEs � Ferramentas disponibilizam o Bean para o programador � Como uma ferramenta consegue ler, genericamente, as propriedades de um Bean? � Java Reflection API � A ferramenta procura os métodos públicos e liga-os com as propriedades � Após ter o catálogo de propriedades, disponibiliza para uso � Introspecção � Processo automatizado de leitura um bean para a descoberta de suas propriedades, métodos e eventos Prof. Razer A N R Montaño Java Web - JavaBeans 10/33 Servlets + JavaBeans � Usar um Bean em um Servlet é muito natural � Como um Bean é uma classe, seu pacote pode ser importado e objetos podem ser criados normalmente � O acesso às propriedades se dá pelos métodos setters/getters � Uso normal, como uma classe qualquer 6 Prof. Razer A N R Montaño Java Web - JavaBeans 11/33 Exemplo Bean: Aluno package com.cursojava.beans; import java.io.Serializable; public class Aluno implements Serializable { private int idade; private String nome; public Aluno() { } public int getIdade() { return this.idade; } public void setIdade(int idade) { this.idade = idade; } public String getNome() { return this.nome; } public void setNome(String nome) { this.nome = nome; } } beans#1 Prof. Razer A N R Montaño Java Web - JavaBeans 12/33 Exemplo: Uso do Bean Aluno import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import com.cursojava.beans.Aluno; public class Teste extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Aluno a = new Aluno(); a.setNome("Razer"); PrintWriter out = resp.getWriter(); resp.setContentType("text/html"); out.println("<html><head><title>Teste</title></head><body>"); out.println("Teste de JavaBeans: " + a.getNome()); out.println("</body></html>"); out.flush(); } } beans#1 7 Prof. Razer A N R Montaño Java Web - JavaBeans 13/33 JSP + JavaBeans � Uso em JSP através de tags <jsp:useBean id="nome" class="pacote.Classe" /> � Onde � id: identificador da variável que irá referenciar o Bean � class: é o nome da classe, contendo nome do pacote � Se o bean já existir, referencia-o para uso � Se o bean não existir, cria-o Prof. Razer A N R Montaño Java Web - JavaBeans 14/33 JSP + JavaBeans � Para setar uma propriedade de um Bean: <jsp:useBean id="aluno" class="com.cursojava.Aluno" /> <jsp:setProperty name="aluno" property="nome" value="Razer" /> � Onde � name: identificador do Bean � property: é o nome da propriedade a ser setada � value: valor que a propriedade receberá. Os dados são automaticamente convertidos � Comportamento � Colocará o valor �Razer� na propriedade �nome� do Bean �aluno� (com.cursojava.Aluno) � Equivale a: aluno.setNome("Razer"); 8 Prof. Razer A N R Montaño Java Web - JavaBeans 15/33 JSP + JavaBeans � Se quiser que o setProperty seja condicional � Se o bean já existir, não sobrescrever a propriedade � Se o bean não existir, cria e inicializa a propriedade � Use-se useBean com corpo <jsp:useBean id="aluno" class="com.cursojava.Aluno" > <jsp:setProperty name="aluno" property="nome" value="Razer" /> </jsp:useBean> Prof. Razer A N R Montaño Java Web - JavaBeans 16/33 JSP + JavaBeans � Para obter o valor de uma propriedade de um Bean: <jsp:useBean id="aluno" class="com.cursojava.Aluno" /> <jsp:getProperty name="aluno" property="nome" /> � Onde � name: identificador do Bean � property: é o nome da propriedade a ser lida � Comportamento � Na posição em que for colocado, a tag será substituída pelo valor da propriedade �nome� do Bean �aluno� � Equivale a: out.println( aluno.getNome() ); 9 Prof. Razer A N R Montaño Java Web - JavaBeans 17/33 Exemplo Bean: Aluno package com.cursojava.beans; import java.io.Serializable; public class Aluno implements Serializable { private int idade; private String nome; public Aluno() { } public int getIdade() { return this.idade; } public void setIdade(int idade) { this.idade = idade; } public String getNome() { return this.nome; } public void setNome(String nome) { this.nome = nome; } } beans#2 Prof. Razer A N R Montaño Java Web - JavaBeans 18/33 Exemplo: JSP <html> <head><title>Teste de Bean</title></head> <body> <jsp:useBean id="aluno" class="com.cursojava.beans.Aluno" /> <jsp:setProperty name="aluno" property="nome" value="Razer" /> <h1>Nome do aluno:</h1> <h2><jsp:getProperty name="aluno" property="nome" /></h2> </body> </html> beans#2 10 Prof. Razer A N R Montaño Java Web - JavaBeans 19/33 Preenchimento através dos Parâmetros � Se o JSP é invocado diretamente, sem passar por um Servlet <html> <head><title>Teste</title></head> <body> <form action=�teste.jsp�> Nome: <input type=�text� name=�usuario�/> <input type=�submit�value=�Enviar�/> </form> </body> </html> Prof. Razer A N R Montaño Java Web - JavaBeans 20/33 Preenchimento através dos Parâmetros � Para se obter os dados passados em teste.jsp, pode-se (PODE, MAS NÃO DEVE) usar Scriptlet para setar uma propriedade: <jsp:useBean id="p" class="pacote.Pessoa" /> <% p.setNome(request.getParameter(�usuario�)); %> 11 Prof. Razer A N R Montaño Java Web - JavaBeans 21/33 Preenchimento através dos Parâmetros � Ou pode-se usar setProperty com scriptlet (Argh!) <jsp:useBean id="p" class="pacote.Pessoa" /> <jsp:setProperty name="p" property="nome" value="<%=request.getParameter("usuario") %>" /> Prof. Razer A N R Montaño Java Web - JavaBeans 22/33 Preenchimento através dos Parâmetros � Melhor Solução!!! � Usar atributo param no setProperty � O seguinte trecho de código <jsp:useBean id="p" class="pacote.Pessoa" /> <jsp:setProperty name="p" property="nome" param="usuario" /> � Colocará o parâmetro �usuário� passado do formulário como valor da propriedade �nome� de 'p' 12 Prof. Razer A N R Montaño Java Web - JavaBeans 23/33 Preenchimento através dos Parâmetros � MELHOR AINDA!!!!!!!!! � Alterar o formulário para que o nome dos campos seja igual ao nome das propriedades do bean <html> <head><title>Teste</title></head> <body> <form action=�teste.jsp�> Nome: <input type=�text� name=�nome�/> <input type=�submit� value=�Enviar�/> </form> </body> </html> Prof. Razer A N R Montaño Java Web - JavaBeans 24/33 Preenchimento através dos Parâmetros � Então usa-se <jsp:useBean id="p" class="pacote.Pessoa" /> <jsp:setProperty name="p" property="nome" /> � Colocará o parâmetro passado do formulário �nome� como valor da propriedade �nome� de 'p' 13 Prof. Razer A N R Montaño Java Web - JavaBeans 25/33 Preenchimento através dos Parâmetros � ESPETACULAR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! � Fazer todos os campos do formulário terem nomes iguais às propriedades do bean sendo preenchido � Então usa-se a propriedade '* <jsp:useBean id="p" class="pacote.Pessoa" /> <jsp:setProperty name="p" property="*" /> � Varre os parâmetros da requisição � Encontra os que coincidem com propriedades do bean � Seta o valor da propriedade com o valor do parâmetro Prof. Razer A N R Montaño Java Web - JavaBeans 26/33 Preenchimento através dos Parâmetros � Por exemplo: � Seja um formulário com NOME e ENDEREÇO � Seja um bean com as propriedades Nome e Endereço 14 Prof. Razer A N R Montaño Java Web - JavaBeans 27/33 Bean package com.cursojava.beans; import java.io.Serializable; public class Pessoa implements Serializable { private String nome; private String endereco; public Pessoa() { } public String getNome() { return this.nome; } public void setNome(String nome) { this.nome = nome; } public String getEndereco() { return this.endereco; } public void setEndereco(String endereco) { this.endereco = endereco; } } beans#3 Prof. Razer A N R Montaño Java Web - JavaBeans 28/33 JSP <html> <head><title>Teste de Bean</title></head> <body> <jsp:useBean id="p" class="com.cursojava.beans.Pessoa" /> <jsp:setProperty name="p" property="*" /> <form method=�POST�> Nome: <input type=�text� name=�nome� /><br/> Endereco: <input type=�text� name=�endereco� /><br/> <input type=�submit� name=�Ok� /><br/> </form> <br/><h1>Processado</h1> Nome: <jsp:getProperty name=�p� property=�nome� /><br/> Endereco: <jsp:getProperty name=�p� property=�endereco� /><br/> </body> </html> beans#3 15 Prof. Razer A N R Montaño Java Web - JavaBeans 29/33 Escopo dos Objetos � Quatro tipos � page: Página (default) - Válidos somente na página em que estão declarados - Referenciados por: pageContext � request: Requisição - Válidos durante a requisição - Referenciados por: request � session: Sessão - Válidos durante o uso de sessão - Referenciados por: session � application: Aplicação - Válidas em páginas no mesmo servidor de aplicação - Referenciados por: application Prof. Razer A N R Montaño Java Web - JavaBeans 30/33 Escopo dos Objetos <jsp:useBean id="p" scope="session" class="com.cursojava.beans.Pessoa" /> � Primeiro verifica se existe um bean no escopo definido com aquele nome � Se existe: retorna o bean encontrado � Se não existe: cria um novo bean e insere-o no escopo beans#4 16 Prof. Razer A N R Montaño Java Web - JavaBeans 31/33 Escopo dos Objetos <html> <head><title>Teste Scope Session</title></head> <body> <form action="login.jsp" method="POST"> Nome: <input type="text" name="nome"/> <br /> Endereço: <input type="text" name="endereco"/> <br /> <input type="submit" value="OK"/> </form> </body> </html> beans#4 Prof. Razer A N R Montaño Java Web - JavaBeans 32/33 Escopo dos Objetos <html> <head><title>Teste de Bean</title></head> <body> <jsp:useBean id="p" class="com.cursojava.beans.Pessoa" scope="session"/> <jsp:setProperty name="p" property="*" /> <h2>Sessao armazenada</h2> <a href="listar.jsp">Ver Sessão</a> </body> </html> beans#4 17 Prof. Razer A N R Montaño Java Web - JavaBeans 33/33 Escopo dos Objetos <html> <head><title>Teste de Bean</title></head> <body> <jsp:useBean id="p" class="com.cursojava.beans.Pessoa" scope="session"/> <h2>Dados da Sessão</h2> Nome: <jsp:getProperty name="p" property="nome" /><br /> Endereço: <jsp:getProperty name="p" property="endereco" /><br /> </body> </html> beans#4