Escolar Documentos
Profissional Documentos
Cultura Documentos
JAVA
Cludio M. N. A. Pereira
Sumrio
CONCEITOS INTRODUTRIOS...........................................................................................................................3 INTRODUO PROGRAMAO ORIENTADA A OBJETOS....................................................................................3 INTRODUO LINGUAGEM JAVA..................................................................................................................... 5 ALGUMAS CARACTERSTICAS DA LINGUAGEM JAVA...........................................................................................5 INDEPENDENCIA DE PLATAFORMA..................................................................................................................... 6 PLATAFORMAS DE DESENVOLVIMENTO JAVA..................................................................................................... 7 PARA COMEAR: O CLSSICO HELLOWORLD!................................................................................................. 8 ESTRUTURA BSICA DA LINGUAGEM............................................................................................................9 TIPOS DE DADOS.............................................................................................................................................. 9 DECLARAES DE VARIVEIS E CONSTANTES.................................................................................................... 9 OPERADORES BSICOS.................................................................................................................................... 10 ESTRUTURAS DE CONTROLE DE FLUXO............................................................................................................ 10 FUNES........................................................................................................................................................ 13 MATRIZES (ARRANJOS).................................................................................................................................... 13 MANIPULAO DE CADEIAS DE CARACTERES (STRINGS)....................................................................................14 CLASSES NUMRICAS...................................................................................................................................... 15 ENTRADA E SADA PADRO (TECLADO E MONITOR).........................................................................................16 ORIENTAO OBJETOS EM JAVA..............................................................................................................18 INTRODUO A CLASSES E OBJETOS EM JAVA.................................................................................................. 18 CONSTRUTORES.............................................................................................................................................. 23 MATRIZES DE OBJETOS................................................................................................................................... 26 MTODOS E ATRIBUTOS DE CLASSE (STATIC)............................................................................................... 28 HERANA....................................................................................................................................................... 29 POLIMORFISMO NA HERANA........................................................................................................................... 35 CLASSES ABSTRATAS...................................................................................................................................... 40 INTERFACES.................................................................................................................................................... 43 PACOTES (PACKAGES)..................................................................................................................................... 46 GENERICS................................................................................................................................................................48 MTODOS GENRICOS..................................................................................................................................... 48 CLASSES GENRICAS....................................................................................................................................... 50 A CLASSE GENRICA ARRAYLIST.................................................................................................................... 51 BANCO DE DADOS.................................................................................................................................................54 JAVA DATABASE CONECTIVITY: JDBC............................................................................................................ 54 CONECTANDO AO BD..................................................................................................................................... 54 EXECUTANDO SENTENAS SQL....................................................................................................................... 57 DATA ACCESS OBJECT: DAO.......................................................................................................................... 59 JAVA ENTERPRISE EDITION.............................................................................................................................62 INTRODUO.................................................................................................................................................. 62 SERVLET CONTAINER...................................................................................................................................... 62 CRIANDO UM PROJETO WEB............................................................................................................................ 63 JAVA SERVER PAGES: JSP............................................................................................................................... 63 SERVLETS....................................................................................................................................................... 66
JAVA
Cludio M. N. A. Pereira
CAPTULO 1
CONCEITOS INTRODUTRIOS
Introduo Programao Orientada a Objetos
___________________________________________________________________________________ A constante busca por conceitos e tcnicas que permitam ao programador lidar cada vez melhor com a complexidade envolvida nos sistemas a serem desenvolvidos leva ao aprimoramento das linguagens e tcnicas de programao. Legibilidade, modularidade, confiabilidade, facilidade de manuteno e reusabilidade de cdigo so pontos que norteiam o surgimento dos novos conceitos em programao. Com esta mesma motivao, surgem os conceitos de Programao Orientada a Objetos (POO). A POO um paradigma de programao (uma forma de programar) que baseia-se na organizao dos programas atravs de entidades chamadas objetos, que encapsulam dados (que caracterizam o objeto) e funes (que definem seu comportamento). O encapsulamento possibilitado pela utilizao de objetos proporciona maior modularidade e maior confiabilidade no reaproveitamento de cdigo. Atravs do conceito de herana (carcterstica marcante da POO) a reutilizao de cdigo otimizada. O polimorfismo que a POO tambm nos permite, seja atravs de herana ou sobrecargas, que se escreva cdigos mais claros e legveis. Programao Orientada a Objetos (P.O.O.): um paradigma de programao (uma forma de prograr) que utiliza entidades/estruturas que encapsulam dados e funes, chamadas objetos. As 3 principais caractersticas da POO so: Encapsulamento Polimorfismo Herana
Encapsulamento: Os dados e as funes so encapsulados em uma entidade chamada objeto. Os dados representam as caractersticas do objeto enquanto as funes representam seu comportamento. Atravs do encapsulamento, as caractersticas dos objetos (dados) s podem ser acessadas atravs das funes. Os dados ficam escondidos (protegidos) do meio externo e s devem ser acessados atravs das funes (que determinam seu comportamento). As funes so a interface entre o objeto e o mundo externo (outros objetos) e podem controlar o fluxo de informaes, fazendo validaes de forma a proteger os dados de situaes indevidas. Objeto 1 Funes Dados Objeto 2 Funes Dados
Figura 3.1. Encapsulamento dos dados: comunicao dos objetos atravs de suas funes Polimorfismo: 3
JAVA
Cludio M. N. A. Pereira
a caracterstica que permite a utilizao de uma mesma referncia assumindo diversas formas (comportamento, contedo). Atravs do polimorfismo possvel escrever cdigos/programas de forma mais simplificada, clara e compacta. Herana: o mecanismo atravs do qual pode-se criar novas definies de objetos (classes) a partir de definies j existentes, sem a necessidade de reescrever o cdigo existente. Entre outras coisas, a herana permite um melhor reaproveitamento do cdigo. Objeto: uma entidade que encapsula que encapsulam dados (que caracterizamm o objeto) e funes (que definem seu comportamento). O objeto uma instncia (algo concreto), que interage no mundo Orientado a Objetos (OO). Na OO no mais existem mais funes ou dados soltos, ou seja, sem estarem relacionados a um determinado objeto. Classe: uma abstrao que caracteriza um conjunto de objetos. Toda a programao na OO escrita dentro de classes. ATENO: Classes NO so um conjunto de objetos. Criao de Objetos: Os objetos so uma instncia de uma classe. ATENO: De certa forma, pode-se entender a classe como sendo um tipo (meio metido a besta, por que alm de campos de dados possui funes associadas mesma), pois define o tipo de objeto. O objeto, por sua vez, pode ser entendido como uma varivel, pois ele possui valores associados aos seus campos de dados. Atributos e Mtodos: Aos campos de dados, definidos atravs de declarao de variveis, d-se o nome de atributos. As funes so denominadas mtodos. Atributos e mtodos so denominados membros de uma classe. Mensagem: a chamada a um mtodo de um objeto. Exemplo: Para ilustrar os conceitos de classe e objetos, veja,os o exemplo a seguir, onde se define uma classe, cria-se um objeto e acessa-se um de seus mtodos. - Definio de uma classe Pessoa com atributos: nome e identidade e mtodos: leDados e imprimeDados. Classe Pessoa nome, identidade leDados 4 imprimeDados
JAVA
Cludio M. N. A. Pereira
Atributos { Mtodos {
- Criao de um objeto p, da classe Pessoa: Pessoa p; Obs.: Note que seria similar declarao de uma varivel p do tipo Pessoa. - Acessando mtodos do objeto p (mensagem para p): p.leDados( ) p.imprimeDados( )
JAVA
Cludio M. N. A. Pereira
- uma linguagem que herdou muitas de suas caractersticas do C++, que uma linguagem extremamente poderosa, difundida e implementa o paradigma de Programao Orientada para Objetos (POO). - Como o C++ prope-se a manter compatibilidade com o C, que no implementa POO, este um ambiente hbrido, tornando necessrios cuidados na POO. No caso do Java, nenhuma compatibilidade foi requerida, o que fez da mesma uma linguagem puramente orientada para objetos, implicando em maiores facilidades para POO. - Apresenta melhoramentos gerais em relao ao C++, como por exemplo, no gerenciamento de memria, comumente problemtico no C++. Existem mecanismos de coleta de lixo (garbage collection) que cuidam da desalocao dinmica de memria, retirando esta tarefa do programador. - independente de plataforma, o que permite que o mesmo programa possa ser executado em qualquer mquina que possua seu interpretador.
Independencia de Plataforma
___________________________________________________________________________________ O fato de ser interpretada torna a linguagem Java independente de plataforma, o que viabiliza a execuo de um programa escrito em Java em diversas plataformas computacionais. Os compiladores Java no convertem o programa fonte em instrues de mquina especficas de um processador (chamada cdigo nativo), e sim em um conjunto intermedirio de instrues chamado bytecode, que independe de uma plataforma especfica. Para executar este bytecode, a linguagem Java necessita de um programa interpretador, chamado Java Virtual Machine (JVM), que capaz de interpret-lo, permitindo sua execuo em qualquer mquina. Existem compiladores e interpretadores Java para vrias plataformas e sistemas operacionais, como PC rodando Windows, UNIX, OS/2; Workstations rodando Unix, Macintoshes rodando MacOS, supercomputadores etc. Um programa compilado em linguagem Java pode ser executado (atravs do interpretador) em qualquer uma destas mquinas. A Figura 1 exemplifica a portabilidade e independncia de plataforma do Java, comparados com programas gerados por linguagens convencionais onde cdigo nativo de mquina gerado (ex.: Pascal, C, C++). Compilador Java (PC/Windows) Cdigo Fonte Java Compilador Java (Sun/Solaris) Compilador Java (PC/LINUX) Bytecode Java Interpretador Java (PC/Windows) Interpretador Java (Sun/Solaris) Interpretador Java (PC/LINUX)
(a)
JAVA
Cludio M. N. A. Pereira
(b) Figura 1 - Programas gerados em (a) Java, (b) Compiladores Convencionais (cdigo nativo)
Estas plataformas de desenvolvimento, no so amarradas a um ambiente integrado (IDE) especfico (para edio, compilao, execuo, depurao etc). Sua utilizao pode ser feita atravs de linha de comando do sistema operacional ou atravs de IDEs distribuidas no mercado, sendo algumas delas gratuitas (Eclipse, Netbeans, entre outras). Desenvolvimento sem uso de IDEs O procedimento bsico para desenvolvimento de um programa Java sem utilizao de IDE pode ser: - Edio do programa fonte: Abra um editor de textos e escreva o cdigo fonte Java e salve o texto como nome.java (onde nome pode ser qualquer nome dado ao seu programa). - Compilao do programa fonte: Na linha de comando do sistema operacional, execute o compilador java (javac.exe) que estar no diretrio bin, dentro da diretrio principal do Java, como exemplo abaixo. c:\> c:\<diretrio do java>\bin\javac nome.java Com este comando, sero gerados arquivos com extenso .class, com o nome de cada classe programada no fonte (nome.java). Este arquivo bytecode que pode ser executado em qualquer plataforma. - Execuo (aplicao fora de um navegador): Se o programa for uma aplicao fora da Internet, execute o interpretador java (java.exe) conforme exemplo a seguir. c:\> c:\ <diretrio do java>\bin\java nome_classe OBS: A interface com o usurio para programao, compilao e execuo utilizando-se alguma IDE pode variar de uma para outra, entretanto, aspectos bsicos como criao de projetos e insero das classes nos projetos costumam ser mantidos. Exemplos de IDEs bastante utilizados no mercado so o Eclipse e o NetBeans.
JAVA
Cludio M. N. A. Pereira
A respeito do primeiro programa, pode-se fazer as seguintes consideraes: 1) Assim como as linguagens C e o C++ a linguagem Java "case sensitive" (diferencia letras maisculas e minsculas); 2) A maneira de se definir uma classe em Java muito parecida com C++: class nome { ... } 3) Os comentrios em Java, como no C e no C++ so feitos com /* e */ para incio e trmino de comentrio, ou // para comentar a linha inteira. 4) Toda aplicao Java (fora de um navegador) deve conter um mtodo main que deve ser public e static. 5) O mtodo main recebe strings como argumentos String args[] que permite que o mesmo receba parmetros. 6) A instruo System.out.println (Hello World!); executa o mtodo println do objeto out do pacote System, que exibe um string (no caso Hello World!) na tela.
JAVA
Cludio M. N. A. Pereira
CAPTULO II
Tipos de Dados
___________________________________________________________________________________ Tabela 2.1 - Tipos da Linguagem Java Tipo byte short int long float double char boolean Descrio Inteiro de 8 bits Inteiro de 16 bits Inteiro de 32 bits Inteiro de 64 bits Real de preciso simples Real de preciso dupla Caracter simples Lgico ( veradeiro ou falso)
OBS: Ponteiros (*), struct e unions (do C e C++) NO so suportados pela linguagem Java.
Declarao de constantes: O modificador final utilizado para declarao de constantes, seguindo a seguinte sintaxe: Sintaxe: 9
JAVA
Cludio M. N. A. Pereira
Operadores Bsicos
___________________________________________________________________________________ Tabela 2.2 - Operadores Aritmticos Operador + (binrio) - (binrio) * / % + (unrio) - (unrio) ++ -Descrio Soma Subtrao Multiplicao Diviso Resto da diviso inteira Indica valor positivo Indica valor negativo Incremento (pr e ps-fixado) *ver exemplos Decremento (pr e ps-fixado) *ver exemplos
Tabela 2.3 - Operadores Relacionais e Lgicos Operador > >= < <= == != && || ! Descrio maior Maior ou igual menor Menor ou igual igual Diferente e ou Negao
Tabela 2.5 - Operadores de atribuio (alguns) Operador += -= *= /= Descrio a += b equivale a: a = a + b; a -= b equivale a: a = a - b; a *= b equivale a: a = a * b; a /= b equivale a: a = a / b;
10
JAVA
Cludio M. N. A. Pereira
A seguir so mostradas as sintaxes e exemplos simples dos comandos bsicos utilizados para controle de fluxo. O comando condicional if - else: Sintaxe:
if (condio) { instruo_1; ... } else { instruo_L; ... }
Exemplo:
if (a < b) { c=a; } else { c=b; }
Observaes: i) Se hover apenas uma instruo, as chaves podem ser omitidas. ii) A parte do else opcional O comando de mltipla escolha switch-case: Sintaxe:
switch(varivel) { case valor_1: instruo 1; break; ... case valor_n: instruo n; break; default: instrucao m; // Obs.: O caso default opcional }
Exemplo:
switch (a) { case 1: System.out.println("Pequeno"); break; case 2: System.out.println("Medio"); break; case 3: System.out.println("Grande"); break; default: System.out.println("Nenhuma das respostas anteriores"); }
Observaes: i) O comando break proporciona a sada do bloco switch. Se no fosse utilizado, as sentenas dos cases seguintes seriam executadas. Para verificar isto, teste o exemplo abaixo com e sem o comando break. 11
JAVA
Cludio M. N. A. Pereira
ii) A palavra default uma opo executada caso nenhum dos cases o seja. Sua utilizao opcional. O comando de repetio for: Sintaxe:
for(expressao_1; expressao_2; expressao_3) { instruo_1; ... instruo_N; }
Exemplo:
for (i=0; i<10; i++) System.out.println(i= + i);
Observaes: Se hover apenas uma instruo, as chaves podem ser abolidas. O comando de repetio while: Sintaxe:
while (condio) { instruo_1; ... instruo_N; }
Exemplo:
int i = 0; while (i<10) { System.out.println("i=" + i); i++; }
Exemplo:
int i; do { System.out.println("i=" + i); i++; } while ( i<10);
12
JAVA
Cludio M. N. A. Pereira
Funes
___________________________________________________________________________________ A declarao e implementao de funes (mtodos) feita como em C e C++, utilizando-se a seguinte sintaxe: Sintaxe:
tipo nome_da_funcao(parmetros) { comando_1; ... comando_N; }
Observaes: i) Como no C/C++ a distino entre o conceito de procedimentos e funes feita simplesmente atravs do tipo de retorno, onde tipo void caracteriza que a funo no retorna valor, sendo um puro procedimento. ii) O valor de retorno passado atravs do comando return (como no C/C++) que provoca a sada imediata da funo. Exemplo:
float Quadrado(float x) { return x*x; }
iii) Como no C++, parmetros de tipos basicos so passados por valor, enquanto matrizes so passadas por referncia. iv) Deve-se salientar que, como veremos mais frente, devido ao fato de Java ser uma linguagem puramente orientada a objetos, as funes estaro sempre dentro de uma classe.
Matrizes (arranjos)
___________________________________________________________________________________ Matrizes (ou arranjos) so estruturas de dados homogneas, ou seja, que permitem armazenar uma lista de itens de um mesmo tipo. Em Java, as matrizes devem ser alocadas dinamicamente, atravs do operador new, como na linguagem C++. No entanto, a desalocao fica por conta da linguagem, que oferece um servio de coleta de lixo (garbage collection) facilitando a programao.
Sintaxe:
tipo nome_da_matriz[]; ou
13
JAVA
Cludio M. N. A. Pereira
tipo[] nome_da_matriz;
Dimensionamento e alocao:
tipo nome_da_matriz[] = new tipo [dimenso]; ou tipo[] nome_da_matriz = new tipo [dimenso];
Exemplo:
int matInt [] = new int [10];
A propriedade length: A propriedade length retorna o nmero elementos da matriz (qual o tamanho da matriz). Exemplo:
... Tamanho = System.in.read(); int m[] = new int [Tamanho]; System.out.println(A dimensao de m e: +m.length;
OBS:A linguagem Java possui recursos mais avanados para manipulao de listas. Estes sero abordados mais tarde.
JAVA
Cludio M. N. A. Pereira
entre outros (vide documentao da linguagem). Programa Exemplo 2.1: Classe String
//----------------------------------------------------------------------------// Programa TesteString: // // Obs: Exemplifica a utilizao de metodos da classe String //----------------------------------------------------------------------------class TesteString { public static void main(String args[]) { String str = "Sou tricolor do coracao. Sou do time tantas vezes campeao."; System.out.println("Toda a string: " + str); System.out.println("Tamanho da string: " + str.length()); System.out.println("Char na posicao 7: " + str.charAt(7)); System.out.println("String: " + str.substring(25,57)); System.out.println("Posicao do primeiro d: " + str.indexOf('d')); System.out.println("Posicao da palavra tricolor: "+str.indexOf("tricolor")); System.out.println("Todas maiusculas: "+str.toUpperCase()); System.out.println("Todas minusculas: "+str.toLowerCase()); } }
Comparao de Strings: A comparao dos contedos de duas strings podem ser feitas atravs do mtodo equals ...
if (s1.equals(s2)) { System.out.println("Iguais"); }else { System.out.println("Diferentes"); }
... A classe "StringBuffer": uma classe que manipula strings variveis, e possui mtodos para sua manipulao, tais como: append() acrescenta string ou caracter no final; insert(pos) insere string ou caracter em dada posicao; replace(inco, fim , String) troca contedo entre incio e fim por um dado String; delete(inicio, fim) deleta caracteres de un StringBuffer; length() que retorna o comprimento da string; charAt(pos) que retorna o caracter em dada posio; reverse() inverte a ordem dos caracteres;
Classes Numricas
___________________________________________________________________________________ Na linguagem Java existem classes que permitem manipulao de objetos com caractersticas numricas, tais como Double, Integer, entre outros, permitindo converses entre tipos, converses para strings etc. 15
JAVA
Cludio M. N. A. Pereira
A classe Integer: A classe Integer possui vrios mtodos que permitem a manipulao de nmeros inteiros, dentre os quais pode-se destacar: toString(int i) que converte o nmero i para String;
Exemplo:
String Str; Str = Integer.toString(456); // Str receber a string 456
Exemplo:
String Str = 1234; int num = Integer.parseInt(Str); // num receber o nmero 1234
A classe Double: A classe Double possui vrios mtodos que permitem a manipulao de nmeros reais de dupla preciso, dentre os quais pode-se destacar: toString(double i) que converte o nmero i para String;
Exemplo:
String Str; Str = Double.toString(125.47); // Str receber a string 125.47
Exemplo:
String Str = 12.34; double num = Double.parseDouble(Str); // num receber o nmero 12.34
Observao: Como as classes Integer e Double, existem outras similares para manipulao de outros tipos de dados, por exemplo: Float, Long e Short.
JAVA
Cludio M. N. A. Pereira
int i = 10;
System.out.println("O valor de i e = " + i);
Leitura de teclado: A leitura de teclado pode ser feita de algumas formas diferentes. Um forma simples e prtica de faz-lo utilizando a classe Scanner, que por sua vez associado ao objeto de entrada padro System.in. O objeto scanner possui mtodos especficos para cada tipo de dado a ser lido. Exemplo:
Scanner teclado = new Scanner(System.in); String nome = teclado.nextLine(); // L uma string
Observao: Algumas classes da linguagem Java so encontradas em pacotes (como se fossem bibliotecas), que precisam ser importadas (atravs do comando import), como a classe Scanner.
17
JAVA
Cludio M. N. A. Pereira
CAPTULO III
Exemplo:
class Pessoa { private String nome; private long identidade; public void leDados() {...} public void imprimeDados() {...} }
} atributos } mtodos
Especificadores de acesso ao membros de uma classe: Os membros de uma classe podem ser declarados como: - private, que o torna acessvel apenas dentro da classe que o contm. 18
JAVA
Cludio M. N. A. Pereira
- protected, que o torna acessvel dentro da classe que o contm e nas suas classes derivadas (falaremos de classes derivadas mais frente no assunto Herana). - public, que o torna acessvel em qualquer parte do sistema. OBS: Se nada for dito, os membros so acessveis dentro do prprio pacote (fonte). Encapsulamento: obtido atravs da utilizao de atributos private de forma que os mesmos sejam acessados apenas atravs de mtodos (public) da classe, proporcionando maior segurana no acesso aos dados (os mtodos podem, por exemplo, fazer validaes, verificar excees etc). Sintaxe de criao de um objeto em Java: A criao de um objeto feita atravs da associao de um nome (nome do objeto) classe a que o mesmo deve poertencer. como se fossemos criar uma varivel do tipo da classe. No entanto sua alocao deve ser dinmica, atravs do operador new. Sintaxe: Nome_da_classe nome_do_objeto; // cria a referncia para o objeto Nome_do_objeto = new Nome_da_classe (); // aloca objeto ou Nome_da_classe nome_do_objeto = new Nome_da_classe (); // cria referncia e aloca objeto Exemplo: Pessoa p; // p uma referncia paraum objeto da classe Pessoa p = new Pessoa( ); // alocao do objeto ou Pessoa p = new Pessoa( ); OBS: Os parnteses aps o nome da classe sero explicados quando falarmos de construtor. Acesso aos mtodos de uma classe: O acesso a um mtodo da classe (tambm denominado mensagem para o objeto) feito da seguinte forma: Sintaxe: nome_do_objeto.metodo(); Exemplo:
p.leDados();
JAVA
Cludio M. N. A. Pereira
//----------------------------------------------------------------// Programa : TesteClasses.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------public class Pessoa { // Atributos private String nome; private long identidade; // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe TesteClasses //----------------------------------------------------------------public class TesteClasses { public static void main(String args[]) { // Criacao de objeto Pessoa p = new Pessoa(); // Utilizao do objeto p p.dados("Cludio", 1234); p.print(); } }
Exerccio: Altere o exemplo anterior de forma que o nome e a identidade sejam lidos via teclado. Atribuio entre objetos: A atribuio entre objetos, utilizando-se o operasdor = provoca uma cpia da referncia para o objeto (NO REPLICA SEU CONTEDO). ATENO: A alterao dos atributos de um objeto que recebeu outro implica na alterao dos atributos do objeto copiado. Exemplo:
Obj1 = Obj2; Obj1.X = 10; // Implica em Obj2.X = 10
20
JAVA
Cludio M. N. A. Pereira
21
JAVA
Cludio M. N. A. Pereira
} }
Sobrecarga de mtodos: o mecanismo atravs do qual se pode criar mais de 1 mtodo com o mesmo nome. As listas de parmetros, no entanto precisam ser diferentes. Programa Exemplo 3.3: Sobrecarga de mtodo
//----------------------------------------------------------------// Programa : TesteSobrecarga.java //----------------------------------------------------------------import Java.util.Scanner; //----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos private String nome; private long identidade; // Metodo para passagem de dados (sobrecarregado) public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para leitura de dados via teclado (sobrecarregado) public void dados () { Scanner t = new Scanner(System.in); System.out.println("Nome: "); nome = t.nextLine(); System.out.println("Identidade: "); identidade = t.nextLong(); } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe TesteSobrecarga //----------------------------------------------------------------class TesteSobrecarga { public static void main(String args[]) { // Criacao de objeto com construtor sem parmetros Pessoa p = new Pessoa(); p.dados("Cludio", 1234); // chama: dados(String n, long id) p.print();
22
JAVA
Cludio M. N. A. Pereira
O objeto this: A palavra reservada this se refere ao prprio objeto. Este recurso costuma ser utilizado para distinguir variveis com nomes iguais aos atributos. Exemplo:
class Pessoa { private String nome; private long identidade; public void dados (String nome, long identidade) { this.nome = nome; // o atributo nome recebe o parmetro nome this.identidade = identidade; // idem para identidade } ... }
Os modificadores public, abstract e final na declarao da classe: - public declara que a classe pode ser utilizada fora do pacote (package) onde se encontra. - abstract declara que a classe foi escrita apenas para derivar subclasses e no pode ser instanciada. - final daclara que a classe no pode possuir classes derivadas. Um dos principais motivos para se escrever classes final segurana. A ausncia de modificadores faz com que as classes possam ser utilizadas no pacote onde esto escritas.
Construtores
___________________________________________________________________________________ Construtores so mtodos especiais executados automaticamente quando um objeto criado. Os construtores devem possuir o mesmo nome da classe e no tem tipo de retorno. OBS: Se houver um construtor definido na classe, o mesmo ser obrigatoriamente executado. Caso no haja, um construtor default (que no recebe parmetros e no faz nada) utilizado (de forma transparente para o programador). Programa Exemplo 3.4: Construtor sem parmetros
//----------------------------------------------------------------// Programa : TesteConstrutor.java //-----------------------------------------------------------------
23
JAVA
Cludio M. N. A. Pereira
//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos private String nome; private long identidade; // Construtor public Pessoa() { System.out.println("Objeto criado"); } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe TesteConstrutor //----------------------------------------------------------------class TesteConstrutor { public static void main(String args[]) { // Criacao de objeto o construtor executado automaticamente Pessoa p = new Pessoa(); // Utilizao do objeto p p.dados(); p.print(); }
} OBS: Como outros mtodos, o construtor pode receber parmetros. Neste caso, os mesmos precisam ser passados no momento que o objeto instanciado (criado). Programa Exemplo 3.5: Construtor com parmetros
//----------------------------------------------------------------// Programa : TesteConstrutor.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos private String nome; private long identidade;
24
JAVA
Cludio M. N. A. Pereira
// Construtor public Pessoa(String n, long i) { dados(n, i); } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe TesteConstrutor //----------------------------------------------------------------class TesteConstrutor { public static void main(String args[]) { // Criacao de objeto passando parmetros para o construtor Pessoa p = new Pessoa("Cludio", 1234); // Utilizao do objeto p p.print(); }
} Sobrecarga de construtor: Como os mtodos comuns, o construtor tambm pode ser sobrecarregado, ou seja uma classe pode ter quantos construtores forem necessrios. Observe o que aconteceria no Programa Exemplo 3.2b, se tentssemos criar um objeto sem passar os parmetros do construtor. Tente isto: Pessoa p = new Pessoa(); No compila, pois o construtor definido precisa de parmetros, ou seja no existe um construtor com lista de parmetros vazia. Se necessitssemos criar objetos, ora passando os parmetros, ora sem passar parmetros, poderamos criar um outro construtor, com a lista de pametros vazia, mantendo o anterior. Programa Exemplo 3.6: Sobrecarga de construtor
//----------------------------------------------------------------// Programa : TesteSobrecarga.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //-----------------------------------------------------------------
25
JAVA
Cludio M. N. A. Pereira
class Pessoa { // Atributos private String nome; private long identidade; // Construtor 1 public Pessoa(String n, long i) { dados(n, i); } // Construtor 2 // no faz nada, mas permite a criao de objetos sem passagem de parmetros public Pessoa() { } // Poderia haver outros construtores // ... // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe TesteSobrecarga //----------------------------------------------------------------class TesteSobrecarga { public static void main(String args[]) { // Criacao de objeto com construtor sem parmetros Pessoa p = new Pessoa(); p.dados("Cludio", 1234); p.print(); Pessoa p1 = new Pessoa(Claudio, 123); P1.print(); } }
Matrizes de Objetos
___________________________________________________________________________________ Para utilizarmos matrizes para objetos, precisamos, primeiramente alocar a matriz com as referncias para os objetos. Ex.: Pessoa pessoa[] = new Pessoa[3]; 26
JAVA
Cludio M. N. A. Pereira
Ainda no podemos utilizar os objetos, pois os mesmos ainda no esto alocados (instanciados). Precisamos ento aloc-los. Ex.: for (int i=0; i<3; i++) { pessoa[i] = new Pessoa(); }
public class MatrizObjetos { public static void main(String[] args) { // Cria uma matriz com as referncias para os objetos Pessoa pessoa[] = new Pessoa[3]; // Cada objeto precisa ser alocado. for (int i=0; i<3; i++) { pessoa[i] = new Pessoa(); } // Agora a matriz de objetos pode ser utilizada pessoa[0].dados("Cludio", 123); pessoa[1].dados("Jose", 321); pessoa[2].dados("Ana", 567); for (int i=0; i<3; i++) { pessoa[i].print(); } } }
A estrutura de controle For-Each (ou Enhanced For): Permite acessar cada elemento de uma matriz ou lista, do primeiro ao ltimo. Sintaxe: ... for (Pessoa p : pessoa) { p.print(); } ... OBS: L-se: Para toda Pessoa p na matriz ou lista pessoa, execute p.print.
27
JAVA
Cludio M. N. A. Pereira
Exerccio: Faa um programa para manipulao de uma lista de contatos telefnicos, com as seguintes caractersticas: a) Apresente um menu para o usurio de forma que ele possa realizar operaes abaixo repetidas vezes, at que deseje sair: - Inserir: armazenar um novo contato na lista, com os dados lidos via teclado; - Excluir: o usurio pode escolher entrar com a identidade ou com o nome para excluir o objeto da lista; - Editar: o usurio pode escolher entrar com a identidade ou com o nome para alterar dados do contato; - Consultar: o usurio pode escolher entrar com a identidade ou com o nome para ver os dados do contato na tela; - Listar todos: imprime todos os contatos armazenados. b) Crie uma classe Contato com nome, identidade e telefone e os mtodos que julgar necessrio. c) Crie uma classe ListaDePessoas que ter como atributo principal uma MATRIZ de objetos da classe pessoa e os mtodos para sua manipulao. d) Cuide dos encapsulamentos e explore a utilizao de construtores e sobrecarga de mtodos.
28
JAVA
Cludio M. N. A. Pereira
CLS x1 = new CLS(); CLS x2 = new CLS(); x1.print(); x2.print(); // Usando incrementa atravs de x1, x2 tambm modificado x1.incrementa(); x1.print(); x2.print(); } }
Exerccio: Altere a classe Pessoa (qualquer uma dos exemplos anteriores) criando um mtodo e o que mais for necessrio para se saber quantos objetos da mesma j foram criados. Ex.: .... ... main(...) { Pessoa p1 = new ..... p1.ContaObjetos(); // diria que tem 1 objeto criado
Herana
___________________________________________________________________________________ Herana o mecanismo atravs do qual se pode criar novas classes (classes derivadas) a partir de classes existentes (classes-base) herdando suas caractersticas. Dentre as grandes implicaes da herana, podemos destacar: a reutilizao de cdigo e o polimorfismo. Sintaxe: class nome_da_classe_derivada extends nome_da_classe_base { ... } Exemplo:
// Criao da classe Aluno que derivada da classe Pessoa (classe-base) class Aluno extends Pessoa { ... }
OBS: Em Java, no h herana mltipla, ou seja a classe derivada s pode ter uma classe-base. O exemplo a seguir ilustra o processo de herana. 29
JAVA
Cludio M. N. A. Pereira
30
JAVA
Cludio M. N. A. Pereira
Aluno a = new Aluno(); a.dados(Claudio, 123); a.setNotas(9.0, 8.0); a.print(); // usa metodo da classe base a.printSituacaoAluno (); } }
Atributos protected na classe-base: Os atributos declarados como protected so visveis na classe derivada. No processo de herana, todos os membros declarados como protected e public so visveis (podem ser acessados) dentro classe derivada (o que for private NO pode fica visvel). Construtor da classe derivada: Quando um objeto criado, o construtor da classe base executado. Em seguida executado o construtor da prpria classe.
//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------import java.util.Scanner; public class Pessoa { protected String nome; protected long identidade; public Pessoa() { System.out.println("Construtor da classe Pessoa executado."); } public void dados (String nome, long identidade) { this.nome = nome; this.identidade = identidade; } public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------public class Aluno extends Pessoa {
31
JAVA
Cludio M. N. A. Pereira
private long matricula; private double a1, a2; public Aluno() { System.out.println("Construtor da classe Aluno executado."); } // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; } // Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir notas public void printSituacaoAluno () { System.out.println("Nome: " + nome); System.out.println("Matricula: " + matricula); System.out.println("A1=" + a1 + " A2=" + a2 + " } } //----------------------------------------------------------------// Classe TesteHeranca //----------------------------------------------------------------public class Teste { public static void main(String[] args) { Aluno a = new Aluno(); } }
Media=" + media());
O construtor da classe derivada pode acessar o construtor da classe base utilizando super, que refere-se superclasse (classe-base), de forma a passar seus atributos; Programa Exemplo 3.5c: Herana (construtor na classe derivada)
//----------------------------------------------------------------// Programa : TesteHeranca.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos protected (para serem visveis na classe derivada) protected String nome; protected long identidade; // Construtor public Pessoa(String n, long i) {
32
JAVA
Cludio M. N. A. Pereira
dados(n, i); } // Construtor 2 public Pessoa() { } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------class Aluno extends Pessoa { // Atributos private long matricula; private double a1, a2; // Construtor public Aluno (String n, long id, long m) { super(n, id); //passa parmetros para o construtor da classe-base matricula = m; } // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; } // Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir notas public void printSituacaoAluno () { System.out.println("Nome: " + nome);
//----------------------------------------------------------------// Classe TesteHeranca //----------------------------------------------------------------class TesteHeranca { public static void main(String args[]) { Aluno a = new Aluno("Cludio", 1234, 2009001001); a.setNotas(9.0, 8.0);
33
JAVA
Cludio M. N. A. Pereira
Sobrescrevendo mtodos da classe-base: A classe Aluno poderia ter um mtodo print() idntico ao de sua classe-base. Neste caso, a chamada ao mtodo print() atravs de um objeto da classe Aluno invocaria o mtodo print() da classe aluno (e no mais o de sua classe-base). Programa Exemplo 3.6: Sobreescrita de mtodos da classe-base
//----------------------------------------------------------------// Programa : TesteHerancaSobrescritaMetodo.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos protected (para serem herdados) protected String nome; protected long identidade; // Construtor public Pessoa(String n, long i) { dados(n, i); } // Construtor 2 public Pessoa() { } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } } //----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------class Aluno extends Pessoa { // Atributos private long matricula; private double a1, a2;
34
JAVA
Cludio M. N. A. Pereira
// Construtor public Aluno (String n, long id, long m) { super(n, id); //passa parmetros para o construtor da classe-base matricula = m; } // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; } // Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir dados do aluno public void print() { super.print(); // chama print da classe-base System.out.println("Matricula: " + matricula); System.out.println("A1=" + a1 + " A2=" + a2 + " } } //----------------------------------------------------------------// Classe TesteSobrescritaMetodo //----------------------------------------------------------------class TesteSobrescritaMetodo { public static void main(String args[]) { Aluno a = new Aluno("Cludio", 1234, 2009001001); a.setNotas(9.0, 8.0); a.print(); // metodo da classe Aluno } }
Media=" + media());
Exerccio: Escreva uma classe Funcionario, derivada da classe Pessoa acrescentando os atributos: - registro, - salarioBase, - cargo, - faltas. e os mtodos: - construtor: que receba nome, identidade, registro, salrioBase e cargo; - dados: para receber nome, identidade, registro, salrioBase e cargo; - dados: que leia do teclado nome, identidade, registro, salrioBase e cargo; - print: que imprima nome, identidade, registro, salrio e cargo. - setFaltas: para lanar as faltas do funcionarios - salarioLiquido: calcula e imprime (salarioBase - faltas*salarioBase/30) * 0.8
Polimorfismo na herana
___________________________________________________________________________________ 35
JAVA
Cludio M. N. A. Pereira
Polimorfismo a utilizao de uma mesma referncia (mesmo nome) podendo assumir vrios significados (ou formas). Quando criamos a classe Aluno como sendo uma extenso da classe Pessoa (atravs do processo de herana), podemos dizer que Aluno UMa Pessoa. Considere o objeto p da classe pessoa: Pessoa p; Note p uma referncia para uma Pessoa e por isso pode conter uma Pessoa. Bom, mas como Aluno UMa Pessoa, ento, p tambm pode conter um Aluno. Assim sendo, pode-se instanciar atravs de p, um objeto da classe Aluno: p = new Aluno(); E se houvessem outras classes derivadas de Pessoa, como por exemplo Funcionario, poderiamos fazer: p = new Funcionario(); Ou seja p pode assumir vrios significados (formas). Isso polimorfismo! O exemplo a seguir ilustra o polimorfismo atravs de herana. Programa Exemplo 3.7: Polimorfismo atravs de herana
//----------------------------------------------------------------// Programa : TestePolimorfismoHerana.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos protected (para serem herdados) protected String nome; protected long identidade; // Construtor public Pessoa(String n, long i) { dados(n, i); } // Construtor 2 public Pessoa() { } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } }
36
JAVA
Cludio M. N. A. Pereira
//----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------class Aluno extends Pessoa { // Atributos private long matricula; private double a1, a2; // Construtor public Aluno (String n, long id, long m) { super(n, id); //passa parmetros para o construtor da classe-base matricula = m; } // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; } // Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir dados do aluno public void print() { super.print(); // chama print da classe-base System.out.println("Matricula: " + matricula); System.out.println("A1=" + a1 + " A2=" + a2 + " } } //----------------------------------------------------------------// Classe Funcionario (derivada de Pessoa) //----------------------------------------------------------------class Funcionario extends Pessoa { // Atributos private String cargo; private long registro; private double salario; // Construtor public Funcionario (String n, String c, long r, double s) { nome = n; cargo = c; registro = r; salario = s; } // Mtodo para imprimir dados do aluno public void print() { System.out.println("Nome: " + nome); System.out.println("Cargo: " + cargo); System.out.println("Registro: " + registro); System.out.println("Salario: " + salario); } } //----------------------------------------------------------------// Classe TesteSobrescritaMetodo
Media=" + media());
37
JAVA
Cludio M. N. A. Pereira
//----------------------------------------------------------------class TestePolimorfismoHerana { public static void main(String args[]) { Pessoa p; Aluno a = new Aluno("Cludio", 1234, 2009001001); a.setNotas(9.0, 8.0); // p recebe um Aluno p = a; p.print(); // metodo da classe Aluno System.out.println(); // p recebe um Funcionario p = new Funcionario("Ana", "Gerente", 12345, 3000); p.print(); // metodo da classe Funcionario } }
Este tipo de polimorfismo muito utilizado para passagem de objetos como argumentos de mtodos, conforme ilustrado no exemplo a seguir, onde o mtodo imprimir da classe Relatrio possui
como parmetro uma Pessoa. Entretanto, na sua chamada (no main), ora recebe um Aluno ora recebe um Funcionrio.
Programa Exemplo 3.8: Polimorfismo atravs de herana (passagem de objetos por parmetros)
//----------------------------------------------------------------// Programa : TestePolimorfismoHeranaParametros.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------class Pessoa { // Atributos protected (para serem herdados) protected String nome; protected long identidade; // Construtor public Pessoa(String n, long i) { dados(n, i); } // Construtor 2 public Pessoa() { } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); }
38
JAVA
Cludio M. N. A. Pereira
} //----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------class Aluno extends Pessoa { // Atributos private long matricula; private double a1, a2; // Construtor public Aluno (String n, long id, long m) { super(n, id); //passa parmetros para o construtor da classe-base matricula = m; } // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; } // Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir dados do aluno public void print() { super.print(); // chama print da classe-base System.out.println("Matricula: " + matricula); System.out.println("A1=" + a1 + " A2=" + a2 + " } } //----------------------------------------------------------------// Classe Funcionario (derivada de Pessoa) //----------------------------------------------------------------class Funcionario extends Pessoa { // Atributos private String cargo; private long registro; private double salario; // Construtor public Funcionario (String n, String c, long r, double s) { nome = n; cargo = c; registro = r; salario = s; } // Mtodo para imprimir dados do aluno public void print() { System.out.println("Nome: " + nome); System.out.println("Cargo: " + cargo); System.out.println("Registro: " + registro); System.out.println("Salario: " + salario); } } //-----------------------------------------------------------------
Media=" + media());
39
JAVA
Cludio M. N. A. Pereira
// Classe Relatorio //----------------------------------------------------------------class Relatorio { public void imprimir(Pessoa p) { p.print(); } } //----------------------------------------------------------------// Classe TestePolimorfismoHeranaParametros //----------------------------------------------------------------class TestePolimorfismoHeranaParametros { public static void main(String args[]) { Aluno a = new Aluno("Cludio", 1234, 2009001001); a.setNotas(9.0, 8.0); Funcionario f = new Funcionario("Ana", "Gerente", 12345, 3000); Relatorio relatorio = new Relatorio(); System.out.println(); System.out.println("Relatorio de aluno:"); relatorio.imprimir(a); System.out.println(); System.out.println("Relatorio de funcionario:"); relatorio.imprimir(f); } }
Classes Abstratas
___________________________________________________________________________________ So classes atravs das quais NO se pode criar objetos. So feitas apenas para criao de classes derivadas das mesmas. Observando nosso exemplo anterior, podemos observar que no so utilizados objetos da classe Pessoa. Alm disso, nosso programa se utiliza de polimorfismo atravs de herana. Neste caso, a classe Pessoa uma forte candidata a ser uma classe abrtrata (evidentement, no contexto deste programa). Para que uma classe seja abstrata basta que se inclua o especificador abstract antes da palavra class, como se segue: Sintaxe: abstract class nome_da_classe { ... } Mtodos abstratos:
40
JAVA
Cludio M. N. A. Pereira
So mtodos onde apenas as assinaturas (prottipos) so definidos na classe-base, sendo obrigatria a implementao destes por parte de suas subclasses (classes derivadas). Com isso, possvel garantir que tal mtodo estar sempre disponvel nas subclasses. No exemplo anterior, observe-se que o mtodo imprimir da classe Relatrio chama o mtodo print. Assim sendo, para que qualquer objeto de uma subclasse de Pessoa possa ser passado para o mtodo imprimir, necessrio que o mesmo implemente o mtodo print. Sendo assim, o mesmo um forte candidato mtodo abstrato, pois assim, garantiramos que objetos de qualquer subclasse de Pessoa pudesse ser passado para o mtodo. Programa Exemplo 3.9: Classe Abstrata
//----------------------------------------------------------------// Programa : TesteClasseAbstrata.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------abstract class Pessoa { // Atributos protected (para serem herdados) protected String nome; protected long identidade; // Construtor public Pessoa(String n, long i) { dados(n, i); } // Construtor 2 public Pessoa() { } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo abstrato para impressao de dados public abstract void print (); } //----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------class Aluno extends Pessoa { // Atributos private long matricula; private double a1, a2; // Construtor public Aluno (String n, long id, long m) { nome = n; identidade = id; matricula = m; } // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; }
41
JAVA
Cludio M. N. A. Pereira
// Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir dados do aluno public void print() { System.out.println("Nome: " + nome); System.out.println("Matricula: " + matricula); System.out.println("A1=" + a1 + " A2=" + a2 + " } } //----------------------------------------------------------------// Classe Funcionario (derivada de Pessoa) //----------------------------------------------------------------class Funcionario extends Pessoa { // Atributos private String cargo; private long registro; private double salario; // Construtor public Funcionario (String n, String c, long r, double s) { nome = n; cargo = c; registro = r; salario = s; } // Mtodo para imprimir dados do aluno public void print() { System.out.println("Nome: " + nome); System.out.println("Cargo: " + cargo); System.out.println("Registro: " + registro); System.out.println("Salario: " + salario); } } //----------------------------------------------------------------// Classe Relatorio //----------------------------------------------------------------class Relatorio { public void imprimir(Pessoa p) { p.print(); } } //----------------------------------------------------------------// Classe TesteClasseAbstrata //----------------------------------------------------------------class TesteClasseAbstrata { public static void main(String args[]) { Aluno a = new Aluno("Cludio", 1234, 2009001001); a.setNotas(9.0, 8.0);
Media=" + media());
42
JAVA
Cludio M. N. A. Pereira
Funcionario f = new Funcionario("Ana", "Gerente", 12345, 3000); Relatorio relatorio = new Relatorio(); System.out.println(); System.out.println("Relatorio de aluno:"); relatorio.imprimir(a); System.out.println(); System.out.println("Relatorio de funcionario:"); relatorio.imprimir(f); } }
Interfaces
___________________________________________________________________________________ uma forma de se definir comportamentos em comum a objetos de diferentes classes. Bom... Isso pode ser feito atravs de herana! De fato, pode sim! Entretanto, h situaes onde a herana no natural. Considere, por exemplo, se nosso negcio envolvesse, alm de Alunos e Funcionrios, uma classe Departamento, que necessitasse tambm ser impressa por um gerador de relatrios (ex. classe Relatorio). Se Departamento fosse derivada de Pessoa, o problema seria resolvido. Mas Departamento NO Pessoa! Para resolver este tipo de conflito, pode-se criar uma Interface, que defina o comportamento de objetos imprimveis (ou printable para ficar mais imponente). Vamos ento criar a interface Printable para resolver este problema. Criao de uma interface: Sintaxe: interface nome_da_interface { tipo metodo1(...); tipo metodo2(...); } A interface define um contrato que assinado pelas classes que forem utiliz-la. Estas (as classes) devem implementar os mtodos da interface. A interface contm apenas as assinaturas dos mtodos. Os mesmos devem possuir sua implementao nas classes que implementam a interface. Implementado mtodos de uma interface: Isso feito atravs da palavra reservada implements. Uma classe pode implementar vrias interfaces. Sintaxe: class nome_da_classe implements nome_da_interface { ... } Polimorfismo atravs da interface: 43
JAVA
Cludio M. N. A. Pereira
Agora que temos uma interface, o mtodo imprimir, da classe relatrio pode receber como parmetro, ao invs de uma Pessoa, um Printable. Programa Exemplo 3.11: Interface
//----------------------------------------------------------------// Programa : TesteInterface.java //----------------------------------------------------------------//----------------------------------------------------------------// Interface Printable //----------------------------------------------------------------interface Printable { // Metodo para impressao de dados public void print (); } //----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------abstract class Pessoa { // Atributos protected (para serem herdados) protected String nome; protected long identidade; // Construtor public Pessoa(String n, long i) { dados(n, i); } // Construtor 2 public Pessoa() { } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } } //----------------------------------------------------------------// Classe Aluno (derivada de Pessoa) //----------------------------------------------------------------class Aluno extends Pessoa implements Printable { // Atributos private long matricula; private double a1, a2; // Construtor public Aluno (String n, long id, long m) { nome = n; identidade = id; matricula = m; } // Mtodo para receber notas public void setNotas(double n1, double n2) { a1 = n1; a2 = n2; }
44
JAVA
Cludio M. N. A. Pereira
// Mtodo para calcular e retornar a mdia public double media() { return (a1+a2)/2; } // Mtodo para imprimir dados do aluno public void print() { System.out.println("Nome: " + nome); System.out.println("Matricula: " + matricula); System.out.println("A1=" + a1 + " A2=" + a2 + " } } //----------------------------------------------------------------// Classe Funcionario (derivada de Pessoa) //----------------------------------------------------------------class Funcionario extends Pessoa implements Printable { // Atributos private String cargo; private long registro; private double salario; // Construtor public Funcionario (String n, String c, long r, double s) { nome = n; cargo = c; registro = r; salario = s; } // Mtodo para imprimir dados do aluno public void print() { System.out.println("Nome: " + nome); System.out.println("Cargo: " + cargo); System.out.println("Registro: " + registro); System.out.println("Salario: " + salario); } } //----------------------------------------------------------------// Classe Departamento //----------------------------------------------------------------class Departamento implements Printable { // Atributos private String nome; private String chefe; private int numFuncionarios; // Construtor public Departamento (String n, String c, int f) { nome = n; chefe = c; numFuncionarios = f; } // Mtodo para imprimir dados do aluno public void print() { System.out.println("Nome: " + nome); System.out.println("Chefe: " + chefe); System.out.println("Nmero de Funcionrios: " + numFuncionarios);
Media=" + media());
45
JAVA
Cludio M. N. A. Pereira
} } //----------------------------------------------------------------// Classe Relatorio //----------------------------------------------------------------class Relatorio { public void imprimir(Printable p) { p.print(); } } //----------------------------------------------------------------// Classe TesteInterface //----------------------------------------------------------------class TesteInterface { public static void main(String args[]) { Aluno a = new Aluno("Cludio", 1234, 2009001001); a.setNotas(9.0, 8.0); Funcionario f = new Funcionario("Ana", "Gerente", 12345, 3000); Departamento d = new Departamento("Recursos Humanos", "Jose", 12); Relatorio relatorio = new Relatorio(); System.out.println(); System.out.println("Relatorio de aluno:"); relatorio.imprimir(a); System.out.println(); System.out.println("Relatorio de funcionario:"); relatorio.imprimir(f); System.out.println(); System.out.println("Relatorio de departamento:"); relatorio.imprimir(d); } }
Pacotes (Packages)
___________________________________________________________________________________ Pacotes so unidades de compilao independentes, que podem possuir um nome para referncia por parte de outras unidades de compilao. Sintaxe: package <nome do pacote>; <definio das classes do pacote> .... Programa Exemplo 3.12: Pacotes (criao) 46
JAVA
Cludio M. N. A. Pereira
//-------------------------------------------------------------------// Definio do pacote MeuPacote e suas classes (no caso apenas XPTO) //-------------------------------------------------------------------package meuPacote; public class Xpto { private int x; public void setX(int x) { this.x = x; // this.x refere-se ao atributo x do prprio objeto } public void Print() { System.out.println("x=" + x); } }
OBS: As classes, mtodos e atributos do pacote que precisam ser acessados a partir de outros pacotes devem ser pblicas As classes do pacote devem estar num diretrio contendo o nome do prprio pacote, que deve estar referenciado no CLASSPATH do sistema operacional, ou deve ser criado a partir do diretrio atual.
47
JAVA
Cludio M. N. A. Pereira
CAPTULO IV
GENERICS
Genrics um recurso lanado no J2SE 5.0 que fornece uma forma de generalizar mtodos e classes, permitindo que os mesmos possam trabalhar com parmetros genricos.
Mtodos Genricos
___________________________________________________________________________________ Mtodos genricos permitem especificar, em uma nica declarao de mtodo, um conjunto de mtodos relacionados. Programa Exemplo 4.1: Mtodos genricos (retirado de Deitel e Deitel, Java Como Programar)
//---------------------------------------------------------// GENERICS // // Exemplo 1 //---------------------------------------------------------public class GenericMethodTest { public static <E> void printArray (E inputArray[]) { for (E element : inputArray) System.out.print(" " + element); System.out.println(); } public static void main(String[] args) { Integer iArray[] = {1, 2, 3}; Double dArray[] = {1.1, 2.2, 3.3}; String sArray[] = {"aaa", "bbb", "ccc"}; printArray(iArray); printArray(dArray); printArray(sArray); } }
OBS: O parmetro genrico de tipo E (poderia ser utilizado outro nome como identificador), declarado antes do mtodo entre < > pode representar qualquer tipo. Onde este parmetro for utilizado dentro do mtodo, o tipo ser moldado em tempo de execuo.
48
JAVA
Cludio M. N. A. Pereira
Programa Exemplo 4.2: Restringindo o parmetro de tipo genrico para se efetuar a comparao entre objetos de tipos genricos. (retirado de Deitel e Deitel, Java Como Programar)
//---------------------------------------------------------// GENERICS // // Exemplo 2 - Comparando genricos //---------------------------------------------------------public class MaxTest { // // // // // // // // // O mtodo maior_v01 no funciona pois o operador ">" no est definido para QUALQUER tipo T public static <T> T maior_v01(T x, T y, T z) { T m = x; if(y > m) m = y; if(z > m) m = z; return m; }
// necessrio que se restrinja o tipo T a tipos que possam // ser COMPARVEIS // // // // Para se comparar objetos, pode-se utilizar o mtodo compareTo da interface genrica Comparable<T>, como a seguir Neste caso, restringimos o tipo T a tipos que implementem tal interface
public static < T extends Comparable<T> > T maior(T x, T y, T z) { T m = x; if(y.compareTo(m)>0) m = y; if(z.compareTo(m)>0) m = z; return m; } public static void main(String[] args) { int m = maior(12, 30, 10); System.out.println("Maior = " + m); String s = maior("ccc", "aaa", "bbb"); System.out.println("Maior = " + s); } }
Programa Exemplo 4.3: Sobrecarga de mtodos genrico. (retirado de Deitel e Deitel, Java Como Programar)
//---------------------------------------------------------// GENERICS // // Exemplo 3 - Sobrecarga de mtodos genricos //---------------------------------------------------------public class SobrecargaGenerics { public static < T extends Comparable<T> > T maior(T x, T y, T z) {
49
JAVA
Cludio M. N. A. Pereira
T m = x; if(y.compareTo(m)>0) m = y; if(z.compareTo(m)>0) m = z; return m; } // Sobrecarga com outro mtodo genrico com nmero // diferente de parmetros public static < T extends Comparable<T> > T maior(T x, T y) { T m = x; if(y.compareTo(m)>0) m = y; return m; } // Sobrecarga com outro mtodo NO-genrico com mesmo // nmero de parmetros public static int maior(int x, int y) { int m = x; if(y>m) m = y; return m; } public static void main(String[] args) { int m = maior(12, 30, 10); System.out.println("Maior = " + m); String s = maior("ccc", "aaa", "bbb"); System.out.println("Maior = " + s); } }
OBS: Se houver mtodo especfico que atenda uma chamada, o mesmo tem prioridade sobre o genrico.
Classes Genricas
___________________________________________________________________________________ Classes genricas permitem especificar, em uma nica declarao de classe, um conjunto de classes relacionadas. Programa Exemplo 4.4: Classes genricas.
//---------------------------------------------------------// GENERICS // // Exemplo 4 - Classes genricas //---------------------------------------------------------class Pilha <E> { private final int maxElementos = 10; private int topo; private E[] elemento; public Pilha() { topo = -1;
50
JAVA
Cludio M. N. A. Pereira
elemento = (E[]) new Object[maxElementos]; } public void empilhar(E valor) { if(topo == maxElementos-1) System.out.println("Pilha cheia!"); else elemento[++topo] = valor; } public E desempilhar() { if(topo == -1) { System.out.println("Pilha vazia!"); return null; } else return elemento[topo--]; } } //---------------------------------------------------------public class GenericClass { public static void main(String[] args) { // Pilha de Integer Pilha<Integer> pI = new Pilha<Integer>(); pI.empilhar(10); pI.empilhar(20); System.out.println("Pilha de Integer"); System.out.println("Desempilhado = " + pI.desempilhar()); System.out.println("Desempilhado = " + pI.desempilhar()); System.out.println(); // Pilha de String Pilha<String> pS = new Pilha<String>(); System.out.println("Pilha de String"); pS.empilhar("aaaa"); pS.empilhar("bbbb"); System.out.println("Desempilhado = " + pS.desempilhar()); System.out.println("Desempilhado = " + pS.desempilhar()); System.out.println(); // Pilha mista Pilha p = new Pilha(); p.empilhar(30); p.empilhar("cccc"); System.out.println("Pilha mista"); System.out.println("Desempilhado = " + p.desempilhar()); System.out.println("Desempilhado = " + p.desempilhar()); } }
JAVA
Cludio M. N. A. Pereira
uma das mais utilizadas. A classe ArrayList utiliza um array como estrutura de dados para armazenamento. Entretando, o mesmo fica encapsulado e vrios mtodos para manipulao so implementados. Alguns mtodos de ArrayList: add(elemento) adiciona um elemento no fim da lista; add(i, elemento) adiciona um elemento na posio i; contains(objeto) retorna true se a lista contm o objeto; get(i) retorna o elemento na posio i; set(elemento, i) atribui elemento ao elemento de ndice i; size() retorna o nmero de elementos da lista; remove(i) remove elemento de ndice i; remove(objeto_x) remove a primeira ocorrncia de objeto_x; (ver outros mtodos na documentao da API, em java.sun.com) Por ser uma classe genrica, a ArrayList pode armazenar objetos, independentemente de sua classe, por exemplo uma String, um objeto da classe Pessoa, etc. Ex: ArrayList lista = new ArrayList(); lista.add(Maria); lista.add(new Pessoa(Claudio, 1234)); ou, se for o caso, o tipo a ser utilizado pode ser indicado entre < >, ou seja: ArrayList<Pessoa> lista = new ArrayList<Pessoa>(); Agora, lista s pode conter objetos da classe Pessoa. Percorrendo a lista com o Enhanced For (foreach): Ex: for (Pessoa p: lista) { p.print(); } Programa Exemplo 4.1: Array List
//----------------------------------------------------------------// Programa : TesteList.java //----------------------------------------------------------------//----------------------------------------------------------------// Classe Pessoa //----------------------------------------------------------------public class Pessoa { // Atributos protected (para serem herdados) private String nome;
52
JAVA
Cludio M. N. A. Pereira
private long identidade; // Getters e Setters public String getNome() {return nome; } public long getIdentidade() {return identidade; } public void setNome(String n) {nome = n; } public void setIdentidade(long id) {identidade = id; } // Construtor public Pessoa(String n, long i) { dados(n, i); } // Construtor 2 public Pessoa() { } // Metodo para passagem de dados public void dados (String n, long id) { nome = n; identidade = id; } // Metodo para impressao de dados public void print () { System.out.println("Nome: " + nome); System.out.println("Identidade: " + identidade); } }
//----------------------------------------------------------------// classe TesteList //----------------------------------------------------------------import java.util.ArrayList; public class TesteList { public static void main(String args[]) { ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>(); pessoas.add(new pessoas.add(new pessoas.add(new pessoas.add(new Pessoa("Ana", 111)); Pessoa("Cludio", 222)); Pessoa("Jos", 333)); Pessoa("Gabriel", 444));
53
JAVA
Cludio M. N. A. Pereira
CAPTULO V
Banco de Dados
Java Database Conectivity: JDBC
___________________________________________________________________________________ O Java Database Connectivity (JDBC) uma interface para bancos de dados SQL, que comunica-se com o driver do BD, como na Figura 3. A vantagem de se utilizar JDBC ao invs de acessar diretamente o driver o fato de desacoplar a aplicao do BD. Assim, se o BD for trocado, basta que se substitua o driver. A aplicao permanece inalterada.
Aplicao Cliente
JDBC (java.sql)
BD
Conectando ao BD
___________________________________________________________________________________ URL de BD: A origem dos dados deve ser informada em forma de URL da forma: Exemplo: "jdbc:mysql://localhost/nome_BD"; Criando a Conexo: 54
JAVA
Cludio M. N. A. Pereira
A conexo feita atravs de um objeto da classe Connection. Exemplo: Connection con = DriverManager.getConnection("jdbc:mysql://localhost/teste", user, pass); Carregando o driver: O driver do BD precisa ser carregado e isso feito da seguinte forma: Class.forName("com.mysql.jdbc.Driver"); Fbrica de Conexes: A Fbrica de Conexes (ou ConnectionFactory) um padro de projeto (desing pattern) bastante utilizado quando necessita-se construir objetos complexos. Assim, essa tarefa fica independente e no precisa ser executada pelo construtor. Ex: public class ConnectionFactory { public static Connection getConnection() throws SQLException { try { Class.forName("com.mysql.jdbc.Driver"); return DriverManager.getConnection("jdbc:mysql://localhost/teste","root",""); } catch (ClassNotFoundException e) { throw new SQLException(e.getMessage()); } } } ... em algum lugar de seu programa: Connection con = ConnectionFactory.getConnection(); OBS: Nota-se no cdigo acima o tratamento de excees com os comandos throws e try-catch. Em Javas, este procedimento obrigatrio em vrias situaes onde alguma exceo pode ser reconhecida. No caso da conexo com BD, uma SQLException deve ser tratada, enquanto ao tentar carregar o driver, deve-se tratar ClassNotFoundException. Entretanto no entraremos em detalhes sobre tratamento de excees nesta seo.
55
JAVA
Cludio M. N. A. Pereira
ii)
Copie o arquivo do driver (mysql-connector) para o seu workspace (basta copiar e colar no diretrio do workspace. Adicione ao classpath:
Clique de direita: Build Path -> Add to Build Path
iii)
iv)
//----------------------------------------------------------------// Classe ConnectionFactory //----------------------------------------------------------------import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class ConnectionFactory { public static Connection getConnection() throws SQLException { try { Class.forName("com.mysql.jdbc.Driver"); System.out.println("Conectando ao banco"); return DriverManager.getConnection("jdbc:mysql://localhost/teste", "root",""); } catch (ClassNotFoundException e) { throw new SQLException(e.getMessage()); } } }
v)
//----------------------------------------------------------------// Classe TestaConexao //----------------------------------------------------------------import java.sql.Connection; import java.sql.SQLException; public class TestaConexao { public static void main(String[] args) throws SQLException { Connection connection = ConnectionFactory.getConnection(); connection.close(); } }
56
JAVA
Cludio M. N. A. Pereira
ii)
//----------------------------------------------------------------// Classe TesteAdiciona //----------------------------------------------------------------public class TesteAdiciona { public static void main(String[] args) throws SQLException { // Conectando Connection con = ConnectionFactory.getConnection(); // Cria sentena preparada SQL String sql = "insert into pessoas (nome,identidade) values (?,?)"; PreparedStatement stmt = con.prepareStatement(sql); // Preenche os valores stmt.setString(1, "Claudio"); stmt.setLong(2, 111);
57
JAVA
Cludio M. N. A. Pereira
// Executa sentena stmt.execute(); // Fecha sentena stmt.close(); System.out.println("Gravado!"); // Fecha conexo con.close(); } }
iii)
Deletando do BD: Ex: // Criando a String da sentena String sql = "delete from pessoas where identidade=?"; // Criando o objeto PreparedStatement PreparedStatement stmt = con.prepareStatement(sql); // Preenchendo os valores (onde esto as interrogaes) stmt.setLong(1, 111); // Executando sentena stmt.execute(); Atualizando o BD: Ex: // Criando a String da sentena String sql = "update pessoas set nome=?, identidade=? where identidade=?"; // Criando o objeto PreparedStatement PreparedStatement stmt = con.prepareStatement(sql); // Preenchendo os valores (onde esto as interrogaes) stmt.setString(1, "Ana"); stmt.setLong(2, 444); // Executando sentena stmt.execute(); Pesquisando no BD: A pesquisa do BD feita atravs do mtodo executeQuery(), que retorna um objeto da classe ResultSet, de onde poderemos extrair o contedo consultado. 58
JAVA
Cludio M. N. A. Pereira
// Criando a String da sentena String sql = "select * from pessoas"; // Criando o objeto PreparedStatement PreparedStatement stmt = con.prepareStatement(sql); // Executa o select ResultSet rs = stmt.executeQuery(); // Varre o ResultSet while (rs.next()) { System.out.println(rs.getString("nome") + " " + rs.getLong("identidade")); } stmt.close(); con.close(); Exerccio 5.1: Implemente um programa onde se possa: inserir, deletar, atualizar e pesquisar Pessoas em um BD. Leia os dados necessrios via teclado.
import java.sql.Connection;
59
JAVA
Cludio M. N. A. Pereira
public class PessoaDAO { private Connection connection; // Coneco public PessoaDAO() throws SQLException { this.connection = ConnectionFactory.getConnection(); } // Adiciona public void adiciona(Pessoa pessoa) throws SQLException { String sql = "insert into pessoas (nome,identidade) values (?,?)"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1,pessoa.getNome()); stmt.setLong(2,pessoa.getIdentidade()); stmt.execute(); stmt.close(); } // Listando os dados do BD public List<Pessoa> getLista() throws SQLException { PreparedStatement stmt = connection.prepareStatement("select * from pessoas"); ResultSet rs = stmt.executeQuery(); List<Pessoa> pessoas = new ArrayList<Pessoa>(); while (rs.next()) { Pessoa pessoa = new Pessoa(); pessoa.setNome(rs.getString("nome")); pessoa.setIdentidade(rs.getLong("identidade")); pessoas.add(pessoa); } rs.close(); stmt.close(); return pessoas; } }
iii)
60
JAVA
Cludio M. N. A. Pereira
public static void main(String[] args) throws SQLException { PessoaDAO dao = new PessoaDAO(); Pessoa p = new Pessoa(Joo, 345); dao.adiciona(p); List<Pessoa> pessoas = dao.getLista(); for (Pessoa pessoa : pessoas) { System.out.println("Nome: " + pessoa.getNome()); System.out.println("Identidade: " + pessoa.getIdentidade()); System.out.println(); } } }
61
JAVA
Cludio M. N. A. Pereira
CAPTULO VI
entre muitas outras. Dentre as implementaes compatveis com a especificao Java EE podemos citar: RedHat/Jboss, JBoss Application Server, gratuito, Java EE 5; Sun, GlassFish, gratuito, Java EE 5. Apache, Apache Geronimo, gratuito, Java EE 5; Oracle/BEA, WebLogic Application Server, Java EE 5; IBM, IBM Websphere Application Server, Java EE 5; Sun, Sun Java System Application Server (baseado no GlassFish), pago, Java EE 5;
Servlet Container
___________________________________________________________________________________ Um servlet container um servidor suporta apenas uma parte do Java EE (e no o Java EE completo). Um servlet container suporta: JSP Servlets JSTL JSF
JAVA
Cludio M. N. A. Pereira
Configurando o Tomcat no Eclipse: Para configurar o Tomcat no Eclipse, execute os passos a seguir: Baixe o Tomcat em http://tomcat.apache.org Instale-o (no Windows deve-se executal o instalador. No Linux, descompactar os arquivos) Abra a aba View Servers (perspectiva Java): ctrl + 3 digite servers clique em Show View Na aba Servers insira o Tomcat: clique direito -> New -> Server selecione o Tomcat desejado clique Next indique o diretrio (pasta) de instalao do Tomcat clique em Finish Inicie o Tomcat clique em Start
Aps este procedimento, as seguinets pastas estaro disponveis: src para conter o cdigo fonte Java (.java) build - onde os programas so compilados (.class) WebContent contm o contedo Web (pginas, imagens, css etc) WebContent/WEB-INF - pasta oculta contendo configuraes e recursos do projeto WebContent/WEB-INF/lib contendo as bibliotecas (.jar) WebContent/WEB-INF/classes contendo cpia dos arquivos compilados
JAVA
Cludio M. N. A. Pereira
Para executar o jsp, basta cham-lo em um browser da seguinte forma: http://localhost:8080/nomeDoProjeto/hello.jsp Um pouquinho do arquivo web.xml): O arquivo web.xml define diversas configuraes referentes ao projeto. Dentre elas, os arquivos de entrada da pgina, que so especificados entre as tags <welcome-file> e </welcome-file>, como exemplo a seguir. Programa Exemplo 6.2: Colocando o hello.jsp como pgina de entrada do projeto
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>jspteste</display-name> <welcome-file-list> <welcome-file>hello.jsp</welcome-file> </welcome-file-list> </web-app>
64
JAVA
Cludio M. N. A. Pereira
Desta forma, para executar o jsp, basta digitar o nome do projeto da seguinte forma:
ii) Inserir Tomcat - Na aba Servers: Clique direito->New->Server (localizar Tomcat). iii) Associar projeto ao servidor: - Clique direito -> Add remove -> (clique no do projeto) iv) Criar pacote dao em src v) Copiar arquivos para src: Pessoa.java, PessoaDAO.java e Connectionfactory.java vi) Copiar conector JDBC para WEB-INF/lib vii) Criar o JSP (em WebContent): <%@ page import="java.util.*, dao.*" %> <html> <ul> <% PessoaDAO dao = new PessoaDAO(); List<Pessoa> pessoas = dao.getLista(); for (Pessoa pessoa : pessoas ) { %> <li><%=pessoa.getNome()%>, <%=pessoa.getIdentidade()%></li> <% } %> </ul> </html>
65
JAVA
Cludio M. N. A. Pereira
<body> Adiciona: <form action="adiciona.jsp"> Nome: <input name="nome"/><br/> Identidade: <input name="identidade"/><br/> <input type="submit" value="Adicionar"/> </form> </body> </html> OBS: Esse JSP envia uma requisio (request) para adiciona.jsp
ii) Escreva um JSP com um form para receber e tratar a requisio (salve como
adiciona.jsp): <%@ page import="java.util.*, dao.*" %> <html> <% PessoaDAO dao = new PessoaDAO(); Pessoa p = new Pessoa(); p.setNome(request.getParameter("nome")); p.setIdentidade(Long.parseLong(request.getParameter("identidade"))); dao.adiciona(p); %> Registro adicionado. </html> OBS: Atravs do objeto request, que contm informaes sobre a requisio feita por um cliente, e que est disponvel em pginas JSP, pode-se acessar os parmetros enviados para a pgina. iii) Acesse tela_adiciona.jsp no browser, ou: - Clique direito - Run as -> Run on server
Servlets
___________________________________________________________________________________ Um servlet um pequeno servidor que recebe chamadas (request) de diversos clientes, processa e envia uma resposta (response) que pode ser um html ou uma imagem. Aqui neste curso abordaremos servlets que utilizam protocolo HTTP. Seu comportamento est definido na classe HttpServlet, do pacote javax.servlet. Portanto, a definio de uma servlet http deve ser feita derivando-se da classe HttpServlet. Atravs do mtodo service, a servlet recebe a requisio (request) e pode preencher a resposta (response) que ser enviada ao cliente. O mtodo service possui a seguinte assinatura: 66
JAVA
Cludio M. N. A. Pereira
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... }
Mapeando uma servlet no Web.xml: no arquivo Web.xml que se mapeia uma URL para um servlet. Isso feito como se segue:
<servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>servlet.Hello</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/oi</url-pattern> </servlet-mapping>
OBS: A tag <servlet> identifica o servlet, enquanto a tag <servlet-mapping> mapeia uma URL para o mesmo. Desta forma, ao se acessar:
http://localhost:8080/jspteste/oi
public class Hello extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter();
67
JAVA
Cludio M. N. A. Pereira
out.println("<html>"); out.println("Hello Servlet!"); out.println("</html>"); } } OBS: 1) O objeto out, da classe PrinterWriter recebe uma instncia do writer de response, que permite escrever em response. A partir da, pode-se escreve o cdigo html. 2) Lembre-se! Os imports podem ser facilitados utilizando-se ctrl+shift+o! 3) Escreva apenas service e use CTRL+espao para ajuda na escrita do mtodo service. ii) Abra o Web.xml e mapeie a servlet <servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>servlet.Hello</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/oi</url-pattern> </servlet-mapping> iii) Reinicie o Tomcat
//----------------------------------------------------------------------// Classe AdicionaServlet //----------------------------------------------------------------------package servlet; // Use CTRL+SHIFT+o para obter os imports! // ... public class AdicionaServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Pessoa p = new Pessoa(); p.setNome(request.getParameter("nome"));
68
JAVA
Cludio M. N. A. Pereira
p.setIdentidade( Long.parseLong(request.getParameter("identidade"))); try { PessoaDAO dao = new PessoaDAO(); dao.adiciona(p); } catch (SQLException e) {} PrintWriter writer = response.getWriter(); writer.println("<html>"); writer.println("Contato adicionado."); writer.println("</html>"); } } OBS: Da mesma forma que no JSP do exemplo 6.4, o objeto request passado para a servlet contm os parmetros enviados, que podem ser acessados atravs do mtodo getParameter. ii) Mapeie a classe AdicionaServlet no Web.xml. <servlet> <servlet-name>adicionaServlet</servlet-name> <servlet-class>servlet.AdicionaServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>adicionaServlet</servlet-name> <url-pattern>/adiciona</url-pattern> </servlet-mapping> iii) Escreva um JSP com tela_adiciona_2.jsp): <html> <body> Adiciona: <form action="adiciona"> Nome: <input name="nome"/><br/> Identidade: <input name="identidade"/><br/> <input type="submit" value="Adicionar"/> </form> </body> </html> OBS: Esse JSP envia uma requisio (request) para adiciona (que a URL mapeada para a AdicionaServlet. iv) Acesse tela_adiciona.jsp no browser, ou: Clique direito Run as -> Run on server um form para submeter uma requisio (salve como
69