domingo, 11 de julho de 2010

Desafio final

Chegamos ao final da semana de treinamento da 3º edição Jovens Talentos da ilegra, quem diria!!
E para fechar com chave de ouro, o último post do blog irá explicar como fazer uma página web que calcula a tabuada e utiliza um servlet rodando no Tomcat para realizar esta tarefa.

O que deve ser feito?
Uma página web para calcular a tabuada que deve conter dois campos:
  • Do - Indica a tabuada de qual número deve ser calculada.
  • Até - Indica até que número a tabuada deve ser calculada e exibida na página.
E um botão:
  • Calcular - Após clicado, o conteúdo dos campos serão validados e caso estejam corretos a tabuada deve ser exibida na página.
Na página com o resultado da tabuada também deve existir um botão para o usuário poder voltar até a página inicial.
A página deve ser criada utilizando JSP ou servlet e executar no Tomcat. Neste caso foi escolhido um servlet.

Por onde começar ?
Antes de começar a implementação foi necessário descobrir e entender o que são estas tecnologias e como funcionam. Aproveitando o esforço e levando em conta que informação nunca é demais, postei aqui um pouco do que pesquisei e aprendi para poder fazer o desafio final.

Tomcat ?
O Tomcat é um conteiner servlet (Servidor de Aplicações Java), que serve para interpretar aplicações escritas em Java para Web. Desenvolvido pela Apache Software Foundation, é distribuído como software livre dentro do conceituado projeto Apache Jakarta, sendo oficialmente endossado pela Sun como a implementação de referência para as tecnologias Java Servlet e JavaServer Pages (JSP).

E para utilizar o Tomcat você deve baixar do site da apache (de preferência a versão mais nova) e executar a instalação. Entre tantos lugares que explicam como fazer, aqui vai um link que explica passo a passo como fazer do jeito mais simples que eu encontrei. Link do site!

Dica importante: Na instalação do Tomcat 6 vale a pena selecionar a check-box "Examples" que vai instalar junto exemplos de servlet. Achei isso muito útil, pois você pode rodar e ver o próprio código fonte dos exemplo na página inicial que abre quando você vai em http://localhost:8080. Para quem não tem experiência alguma com Tomcat e Servlet, meu caso, estes exemplos foram bem úteis. Com eles se torna possível ir copiando uma parte de um e outra de outro para fazer algo um pouco mais interesante, e não começar as coisas do "zero absoluto".

Servlet ?
Servlets são módulos que ampliam a funcionalidade de servidores baseados em requisições/respostas. Web servers são o exemplo típico, para o qual são usado um tipo especializado de Servlets, os HttpServlets. Uma Servlet, por exemplo, pode receber dados em um form HTML por meio de uma requisição HTTP, processar os dados, atualizar a base de dados de uma empresa, e gerar alguma resposta dinamicamente para o cliente que fez a requisição.

Ao receber uma requisição, um Servlet pode capturar os parâmetros desta requisição, efetuar qualquer processamento inerente a uma classe Java, e devolver uma página HTML.

Dica importante: Para conseguir criar Servlets no Eclipse você deve adicionar ao seu projeto a API "servlet-api.jar". Passo a passo:
  1. Clique com o botão direito do mouse no seu projeto e vá em "Properties";
  2. Encontre o item "Java Build Path";
  3. Na aba "Libraries";
  4. Botão "Add External Jars";
  5. Selecione o arquivo "servlet-api.jar" que está na pasta LIB de onde você instalou o Tomcat.
E também é possível indicar a API servlet-api.jar no classpath no momento da compilação se for feita no MS-DOS ou em um bacth.
Exemplo: javac -classpath "C:\Program Files\Tomcat 6.0.28\lib\servlet-api.jar" Tabuada.java

Programando o Servlet
Primeiro vou explicar a estrutura da classe Tabuada que precisa herdar a classe HttpServlet (uma classe abstrata) do pacote javax.servlet.http para poder utilizar os métodos de um servlet.

Import
Os imports do pacote java.io servem para utilização e tratamento de exceções do objeto que escreve o código HTML na página.
Os imports do pacote javax.servlet servem para podermos herdar o próprio servlet e utilizar as classes de requisição e resposta da página, além do tratamento de exceções que podem ser geradas por estas classes.

Método doGet
Sobrecarga do método herdado pela classe HttpServlet, e é geralmente utilizado quando uma página é requisitada. O navegador geralmente busca pela página na pasta temporário. Caso a mesma esteja presente, é carregada. Recebe o objeto HttpServletRequest com os dados da requisição e o objeto HttpServletResponse que é a maneira(meio de comunicação) do servlet gerar os dados e responder a requisição.

Método doPost
Sobrecarga do método herdado pela classe HttpServlet, e é geralmente utilizado para enviar dados ao servidor. O navegador não busca pela página na pasta temporário, pois a página resultante muda constantemente. Recebe os mesmo parâmetros que o método doGet.

Método jumpLine
Criado especificamente para a implementação da classe Tabuada. Ele serve para escrever em HTML o código responsável por pular uma linha.

Método validaInteiro
Criado especificamente para a implementação da classe Tabuada. Ele serve para validar se o conteúdo de um campo é um número inteiro diferente de zero. Recebe uma String, pois os campos capturados do form no HTML retornam em formato String, e retorna um boleano indicando se o conteúdo do campo é válido para a aplicação.
O método validaInteiro é utilizado dentro no método doGet para gerar um código HTML dinâmico com uma mensagem de erro ao lado do campo com conteúdo inválido.
Exemplo de um campo que foi informado inválido:


Implementação do código HTML
Idéia básica da aplicação Tabuada: Gerar um form HTML que contem os dois campos "Do:", "Até" e o botão "Calcular" que quando o servlet for requisitado, pois o botão calcular foi clicado, então são realizadas as validações nos campos e caso estejam corretos uma página com o resultado e um botão "Voltar" é exibida. Se o servlet for requisitado, pois o botão "Voltar" foi clicado, então a primeira página é gerada novamente.
A implementação final da classe Tabuada ficou muito grande para ser colocada no post como uma imagem. Então segue um link com código final da classe Tabuada: Download Tabuada.java.

Como instalar o servlet no Tomcat ?
O processo de instalação da servlet no servidor é também conhecido como deploy. Após compilar o servlet e o arquivo .class for gerado, é necessário "instalar" sua aplicação web no Tomcat. Particularmente eu não considerei como uma instalação propriamente dita, mas aqui seguem os passos para sua aplicação web servlet rodar no Tomcat.
  1. Na pasta "webapps" da sua instalação do Tomcat crie uma pasta com o nome da sua aplicação web;
  2. Dentro da pasta que acabou de criar, crie outra pasta chamada "WEB-INF";
  3. A pasta "WEB-INF" deve conter o arquivo "web.xml" e a pasta "classes". O arquivo web.xml é um arquivo de configuração da aplicação web. Esse arquivo informa ao Tomcat quais as servlets que compõem a aplicação web, no meu caso a classe Tabuada. E na pasta classes devem ficar as servlets compiladas e outras classes Java que possam ser utilizadas pela aplicação.
Estruturas de pastas da instalação:
No Tomcat o diretório webapps é configurado por meio do arquivo server.xml que fica localizado no diretório conf. Editando esse arquivo poderíamos especificar outro diretório para fazer o deploy da nossa aplicação.

web.xml
Após a configuração do web.xml a aplicação web está instalada no Tomcat e pode ser testada. Primeiro inicie o Tomcat, caso esteja desligado, e faça um teste acessando a página inicial http://localhost:8080. Se aparecer uma página com a imagem de um gato então você está no caminho certo.
Agora para testar sua implementação acesse http://localhost:8080/nome_aplicação_web/servlet_principal.

Deploy utilizando arquivo .WAR
Você também pode instalar sua aplicação web gerando o arquivo .WAR que irá conter aquela estrutura de pastas já explicada. Quando você já possui uma aplicação web encapsulada em um arquivo WAR e desejar instalar no seu servidor Tomcat, é possível acessar o serviço gerenciador do Tomcat e importar esta aplicação.

Ligando e desligando o Tomcat
Para rodar seu servlet no Tomcat é necessário ligar o Tomcat. Um ícone na barra de tarefas exibe o status do servidor, ligado ou desligado. E você também pode controlar pela janela de propriedades clicando duas vezes sobre o ícone na barra de tarefas.
Ligado:
Desligado:

Rodando a aplicação web no Tomcat
A aplicação web "Tabuada" é acessada em http://localhost:8080/ilegra/Tabuada. Seguem agora algumas imagens da página HTML gerada apartir do servlet Tabuada.
Página principal:
Página de resultados:

Considerações Finais
Gostei bastante do jeito "rápido" da ilegra, pois percebi que em apenas uma semana eu aprendi e fiz coisas que antes acreditava demorar muito mais para conseguir por em prática. Para mim, este foi o exemplo real de que a ilegra é realmente do jeito que se descreve no seu site e como os seus colaboradores explicaram para nós (grupo da 3ª edição Jovens Talentos).

quinta-feira, 8 de julho de 2010

Coleções

Post relacionado ao trabalho em grupo realizado sobre coleções. Foram criados 3 exercícios para os grupos resolverem utilizando coleções em java. Segue os enunciados dos exercícios que eu e meu colega Renan Trapp Silva resolvemos, e também um link para o arquivo Porwer Point com a nossa apresentação do trabalho.

Exercício 1.
Fazer um programa que tenha uma lista de Pessoas e ordene as mesmas por idade.

Exercício 2.
Fazer um programa que tenha um mapa de estados e capitais e o usuário possa consultar se existe uma capital ou não no mapa.

Exercício 3.
Fazer um programa que gerencia um estádio de futebol que não deixa a mesma pessoa entrar duas vezes no mesmo jogo, caso a pessoa tente entrar novamente deve levantar uma exception.

Apresentação do trabalho:

quarta-feira, 7 de julho de 2010

Polimorfismo

Este post irá resolver dois exercícios sobre polimorfismo.

Exercício 1: Crie uma classe Automovel e duas especializações: Carro e Moto. Implemente o método andar com mensagem diferente para cada classe.


Agora que as classes Carro e Moto implementaram a interface Automovel elas poderão ser referenciadas pelo tipo de classe Automovel e não mais apenas pelo tipo de classe específica delas. Logo abaixo está um exemplo demonstrando esse aspecto do polimorfismo que nos permite isolar e alterar as implementações (neste casso as classes Carro e Moto) mantendo as funcionalidades do sistema (neste casso o método andar) sem sofrerem nenhum tipo de alteração ou ajuste para se adequar as novas classes.

Saída no console: "Vruuum!!!"

Saída no console: "Pe-péééééé!!!"

Se você não entendeu ainda o conceito, aqui vai um bom exemplo de implementação de interface na vida real.
  • Interface: Governo
  • Método principal da interface: public void cobrarImpostos(long muitoDinheiro);
  • Classes que implementam a interface: Politico e qualquer outra classe que herda Politico
A interface Governo serve para "fechar o acordo" de que a principal funcionalidade do sistema é "cobrar impostos" e que isso deve acontecer independente do tipo específico de político que a implementar. Portanto, graças as interfaces na vida real, a cada ciclo letivo os "objetos" políticos mudam (as vezes para melhor as vezes para pior), mas nem por isso é necessário em todo novo ciclo letivo fazer qualquer modificação ou ajuste na principal funcionalidade do sistema.
Caso a funcionalidade "cobrar impostos" não fosse uma interface, mas estivesse implementada em cada político, então a cada novo ciclo letivo seria necessário que todos novos políticos passassem por um processo demorado de aprendizado da funcionalidade "cobrar impostos" que poderia acabar sendo implementada diferente em cada um deles. E uma grave consequência disso seria a demora para cada novo político por em prática a funcionalidade principal do sistema. Mas podemos ficar tranquilos pois este tipo de interface hoje é muito bem implementada.
OBS: Este exemplo é apenas uma brincadeira saudável.


Exercício 2: Faça um programa que tenha um método que você passa 3 automóveis, ele executa o método andar e informa qual é o automóvel mais rápido.

Note que agora a interface possui 2 métodos novos que permitem capturar a velocidade e a descrição dos automóveis (independente do tipo deles).



Note que esta classe foi feita com a intenção de poder receber mais de 3 automóveis, mas no enunciado está pedindo para testar apenas 3.

Saída no console:
Vruuum!!!
Vruuum!!!
Pe-péééééé!!!
Automóvel mais rápido: Fiat 147 tunado

Falando um pouco sobre Threads

Thread é um fluxo de execução que ocorre dentro do contexto(limites) de um processo, onde cada processo pode ter de apenas uma até várias threads. Mas uma thread pertence sempre apenas a um único processo.

Mesmo sabendo que cada processador (CPU) pode executar apenas um fluxo de execução por vez, as threads são executadas "paralelamente" na visão do usuário, pois o escalonamento delas é tão rápido para o usuário que o mesmo tem a impressão de estarem executando ao mesmo tempo. Porém, em computadores com mais de um processador ocorre o paralelismo real onde cada fluxo de execução (Thread) está executando em um processador e isso pode trazer um aumento significativo no desempenho de uma aplicação.

Além da utilização de threads para aumentar o desempenho de processamento elas são extremamente úteis quando é necessário interagir com o usuário ao mesmo tempo que se deve processar outra tarefa em um mesmo programa. Um exemplo simples da utilização de threads é o corretor ortográfico do Microsoft Office Word que executa em uma thread e paralelamente outra thread se encarrega de aceitar a digitação do usuário. Outro exemplo relevante da utilização de threads no dia a dia são os browsers para navegação na internet que separam a carga de uma página em várias threads e assim cada imagem, tabela, texto, download, controle da navegação, e o que mais estiver na página, serão carregados "simultaneamente" na visão do usuário.


Utilizando threads em java

Em java é utilizada a classe Thread para implementar programas que utilizam mais de um fluxo de execução. Esta classe possui o método "public void run()" que será executado quando a thread for chamada. Para isso, uma classe que deseja executar como uma thread deve herdar a classe Thread sobrescrevendo o método run() e inserindo nele o que deve ser executado como fluxo paralelo de processamento. Para executarmos uma thread utilizamos o método "start()" e para finalizar a execução, caso a thread não seja capaz de se finalizar por conta própria, é utilizado o método "interrupt()".

Neste exemplo de programa em java utilizando threads são criadas duas threads para executarem simultaneamente exibindo no console uma contagem sequencial.

Classe que implementa a thread:

Classe para criar e executar as threads:

Este deverá ser o resultado da execução do programa exibida no console, além de ser exibida uma janela de confirmação.
Mario - 0
Luigi - 0
Mario - 1
Luigi - 1
Luigi - 2
Mario - 2
Luigi - 3
Mario - 3
Mario - 4
Luigi - 4
Mario - 5
Luigi - 5
Mario - 6
Luigi - 6
...

Note, que na verdade, não são apenas dois fluxos de execução que serão executados, mas sim três fluxos (Threads). Um para cada objeto contador e outro fluxo de execução para o próprio main que continua "interagindo" com o usuário enquanto as demais threads estão processando.

Este tópico tratou apenas da utilização e o conceito básico de threads, pois se tratando de threads existem muito mais funções poderosas para serem abordadas como o sincronismo entre threads, grupos de threads, deadlocks, etc.