• Nenhum resultado encontrado

4. INTERFACE GRÁFICA II

6.4 Servlets

Você já viu que toda página JSP internamente é um servlet que é gerado automaticamente pelo container web. Agora, você irá aprender como escrever o seu servlet.

Na realidade um servlet é uma classe Java que estende a capacidade do servidor para atender às requisições HTTP. Isto é, quando o usuário digita o endereço da sua aplicação web num navegador de internet, a sua aplicação precisa responder a esta solicitação, e a classe Java responsável por atendê-la é o servlet.

No Netbeans, para criar um servlet você deve clicar com o botão direito do mouse sobre o seu projeto e seleciona Novo  Servlet. Assim, irá aparecer a caixa de diálogo exibida na figura 6.5.

Figura 6.5: Caixa de diálogo Novo Servlet (tela 1 de 2)

Fonte: Captura de tela do Netbeans

Você deve preencher os dados do Servlet de acordo com a figura 6.5 e clicar no botão Próximo. Agora você verá a segunda parte dos dados que você irá preencher de acordo com a figura 6.6.

Figura 6.6: Caixa de diálogo Novo Servlet (tela 2 de 2)

Fonte: Captura de tela do Netbeans

Note que existe 3 nomes diferentes para o servlet: o nome da classe, o nome do servlet e a URL para acessar o servlet. Elas podem ser iguais, porém o comum é que elas sejam diferentes, pois os usuários não devem saber como é que são os nomes internos dos seus servlet, nem a estrutura de diretório onde eles estão salvos, para não conseguir hackear a sua aplicação facilmente.

Observe na figura 6.7 como ficou a estrutura do seu projeto. Note que o seu servlet ficou gravado dentro de Pacotes de código-fonte, pois ele é uma classe Java.

Figura 6.7: Janela Projetos do Netbeans

Fonte: Captura de tela do Netbeans

Na figura 6.8 está apresentado o código-fonte inicial gerado automaticamente pelo Netbeans. Este servlet está configurado para aceitar tanto requisições GET quanto POST. As linhas 28 a 37 estão comentadas já contendo um código inicial que gera uma página HTML, então você pode remover as linhas 28 e 37 (será a linha 36, depois de removida a linha 28). Na linha 34 (ou 33 após você ter removido a linha 28), perceba que é utilizado o objeto o objeto implícito request.

Figura 6.8: Código do ServletAloMundo gerado automaticamente

Fonte: Captura de tela do Netbeans

Agora para você testar este servlet, você pode clicar com o botão direito do mouse na janela Projetos em cima do ServletAloMundo.java e selecionar Executar arquivo (tecla de atalho: <shift>+F6). Como resultado, você verá no seu navegador conforme a figura 6.9.

Figura 6.9: Execução do ServletAloMundo

Fonte: Captura de tela do Chrome

Observe na figura 6.9 que a URL no navegador é http://localhost:8080/Primeira_Aplicacao_Web/OlaMundo, indicando que o seu servlet é executado sempre que for solicitado o endereço OlaMundo da aplicação Primeira_Aplicacao_Web. Perceba que ninguém sabe pelo endereço que o seu servlet se chama ServletAloMundo e que ele está no pacote servlets.

Você pode então alterar o código para deixar ele de acordo com o da figura 6.10.

Figura 6.10: Trecho de código do ServletAloMundo

Fonte: Conteudista

Você pode testar novamente o seu servlet, simplesmente apertando o botão Atualizar (ou reload) no seu navegador. Não é necessário compilar nada, basta salvar o servlet dentro do Netbeans e ir para o seu navegador de

internet que contém a página aberta (vide figura 6.9), que o container web (neste caso, o GlassFish) recompila o servlet e já exibe a nova versão da página.

Note que para gerar uma página web com as mesmas informações em JSP seria muito mais fácil do que ficar utilizando o tempo inteiro o objeto implícito out. Por isso, que os servlets normalmente não são utilizados para exibição de conteúdo, eles são utilizados para receber as requisições HTTP (com ou sem parâmetros), fazer o processamento (chamando as suas classes de negócio apropriadas para isso) e redirecionar para uma página JSP que fará a exibição do resultado para o usuário.

Assim, ao invés de ter a página processamento.jsp (vide figura 6.2), você terá um servlet para realizar este processamento. Portanto, veja as alterações necessárias para que o exemplo utilizado, agora utilize o ServletProcessamento.java, ao invés da página JSP processamento.jsp. Primeiro, você deve criar o servlet chamado ServletProcessamento conforme as figuras 6.11 e 6.12.

Figura 6.11: Caixa de Diálogo para criação do ServletProcessamento

(tela 1 de 2)

Figura 6.12: Caixa de Diálogo para criação do ServletProcessamento

(tela 2 de 2)

Fonte: Captura de tela do Netbeans

Veja o código do método processRequest na figura 6.13, que é o único método que você precisa implementar do ServletProcessamento.

Figura 6.13: Código do ServletProcessamento

Fonte: Conteudista

Os servlets não tem os objetos implícitos que você viu que as páginas JSP possuem, portanto, você não pode utilizar pageContext.forward(...). Você precisa utilizar um objeto do tipo RequestDispatcher para realizar a tarefa de fazer o forward para uma página JSP (vide linhas 38 a 40 da figura 6.13). Também, não é possível salvar todos os parâmetros diretamente no bean, como é possível numa página JSP (a não ser que você utilize um framework como o spring ou struts), portanto veja nas linhas de 29 a 34, como é feita a recuperação dos parâmetros, alterando as propriedades do bean e salvando ele na session (que no servlet precisa ser solicitado a partir do objeto request – linha 34).

Nas linhas 26, 28 e 36, é feita a definição para qual página este servlet irá encaminhar. Na linha 26 é definida a página de erro com o parâmetro com erro desconhecido. Já na linha 28, se tudo der certo, o servlet encaminha para a página exibicao.jsp. E finalmente, na linha 36, dentro da cláusula catch para a exceção de formato de número inválido a página JSP a ser encaminhada é a erro.jsp com a mensagem “Número Inválido”.

A página erro.jsp precisa voltar a ter o código da exibido na figura 5.28, pois ela precisa exibir a mensagem recebida como parâmetro, ao invés de capturar a exceção.

Observe que como o servlet está encaminhado a requisição para uma página JSP, então ninguém sabe o nome real da página que está exibindo os dados, e isto não é interessante. Portanto, ao invés de utilizar o forward é melhor utilizar o redirect, conforme exibido na figura 6.14.

Figura 6.14: Código do ServletProcessamento

Fonte: Conteudista

Existe mais uma diferença, não é mais possível utilizar o caminho absoluto “/” antes dos nomes das páginas JSP, pois o redirect não está restrito ao contexto da sua aplicação, como o forward.

Saiba Mais

Dependendo do caso, você precisar utilizar forward em algumas situações, e redirect em outras, então para saber mais sobre este assunto dê uma olhada nas seguintes páginas:

http://www.rponte.com.br/2008/07/12/repitam-comigo- redirect-nao-e-forward/

http://www.mhavila.com.br/topicos/web/http_mime.html#redi rect

A aplicação desenvolvida até o momento, já está se estruturando de

uma forma que existe uma separação entre o código para processar o

que está sendo requisitado pelo usuário e o código utilizado para

exibir páginas web. Na seção a seguir você entenderá melhor como

realizar a separação de códigos (de forma similar à que você fez

utilizando arquitetura em camadas) ao desenvolver uma aplicação

web.

6.5 Padrão MVC

Como você viu no exemplo anterior, normalmente você possui

páginas JSP que não possuem código Java (ou melhor, tem pouco

código Java) e servlet que não tem nenhum código HTML (ou o

mínimo possível).

A arquitetura MVC (model-view-controller) é a mais difundida para

realizar bem esta separação de códigos (HTML e Java) numa

aplicação web. Portanto, você tem os seguintes componentes:

model (modelo): responsável pelas regras de negócio da sua aplicação;

view (visão): cria a interface com o usuário exibindo os dados provenientes do modelo;

controller (controlador): recebe as requisições do usuário, dispara as ações necessárias utilizando as classes do seu modelo, e finalmente redireciona para uma página da view para exibir a resposta ao usuário.

O exemplo anterior utilizando servlet já está utilizando esta

arquitetura MVC, onde o model é representado por BeanPessoa,

enquanto que o ServletProcessamento é o controller e as páginas

cadastro.jsp, exibicao.jsp e erro.jsp são as views.

Se você tiver a sua aplicação dividida em camadas, como visto na

disciplina Linguagem de Programação I, você poderá reutilizar as

camadas de negócio e de dados como sendo o model, e precisará

implementar os componentes da view e do controller.

Para exemplificar melhor estes conceitos, uma segunda aplicação web

será desenvolvida utilizando como base a Primeira Aplicação Web

desenvolvida até o momento. Porém, agora será possível cadastrar

várias pessoas.

6.6 Exemplo MVC

Crie uma nova aplicação web no Netbeans chamada Segunda

Aplicacao Web. Veja na figura 6.15 a estrutura do projeto e todas as

páginas e classes que ele contém.

Figura 6.15: Estrutura da Segunda Aplicacao Web

6.6.1 Classes do Modelo

Primeiramente, o modelo é composto por duas classes Pessoa e

Sistema. Na figura 6.16 você pode ver o código da classe Pessoa e na

figura 6.17 o da classe Sistema.

Figura 6.16: Classe Pessoa

Figura 6.17: Classe Sistema

Fonte: Conteudista

Observe que a classe Sistema é um Singleton e está utilizando um

ArrayList para armazenar os dados. Assim, qualquer usuário terá

acesso às pessoas cadastradas, enquanto a aplicação não for

reinicializada (isto ocorre quando um servlet ou página JSP é alterada,

ou o container web é reiniciado).

6.6.2 Controlador

O controlador é responsável por receber as requisições do usuário,

realizar a ação requerida e enviar para a página JSP correspondente

para exibir a resposta ao usuário.

Como este exemplo é pequeno, foi criado um único servlet chamado

Controlador. Você deve criar este servlet e implementar o método

processRequest de acordo com a figura 6.18.

Figura 6.18: Método processRequest do Servlet Controlador

Fonte: Conteudista

Preste atenção aos seguintes pontos no código da figura 6.18:

Existem casos em que é realizado o encaminhamento (forward), e em outros, o redirecionamento (redirect). Para realizar este controle, é utilizada uma variável booleana chamada forward (linhas 27, 47 e 56 a 62);

O servlet recebe o parâmetro acao que indica a operação que ele deve realizar (linhas 28, 30, 32, 36), e as variáveis forward e paginaJSP são preenchidas de acordo com a ação desejada;

Normalmente operações que alteram o estado do modelo (neste exemplo, apenas o cadastramento) devem utilizar redirect, pois se o usuário apertar no botão de atualizar do navegador, não deseja- se disparar novamente o cadastramento da mesma pessoa;

Nas operações que não alteram o estado do model, utiliza-se o forward, pois se o usuário apertar o botão de atualizar do navegador várias vezes, apenas a exibição é repetida;

Veja nas linhas de 37 a 48 a sequência de comandos para executar o cadastramento de uma pessoa: 1) pega os parâmetros nome e idade; 2) confere se o nome está ok, e converte a idade para número; 3) pega a instância única do sistema; 4) cria um objeto Pessoa e inicializa ele com os parâmetros recebidos; 5) cadastra a pessoa no sistema e 6) define que irá redirecionar e indica a página “controlador?acao=exibir”, neste caso;

Na linha 34, você pode ver a gravação de um atributo na variável request, assim, tudo que o a página JSP precisa exibir está gravada na solicitação (request) que tem escopo de página. Desta forma, a página JSP não precisa acessar o Sistema.

Neste exemplo simples, só existe um servlet controlador, porém numa

aplicação maior, você terá apenas um servlet geral que receberá as

ações do usuário e irá fazer um forward para os servlets que realmente

irão executar as solicitações do usuário.

Existirão, dois tipos de servlets: os de tarefas e os de página. Os

primeiros realizam tarefas que alteram o seu modelo (cadastrar,

alterar, excluir, ...), e assim, precisam utilizar redirect e os últimos

executam operações que só faz consulta ao modelo, e utilizam

forward.

6.6.3 Visão

As páginas JSP que fazem parte deste componente são: index.jsp (na

pasta principal do projeto) e cadastro.jsp, erro.jsp e exibicao.jsp

(dentro da pasta WEB-INF).

A página index.jsp está apresentada na figura 6.19, é a página de

entrada para o sistema e que exibe links para as operações de cadastrar

e exibir. Observe que é direcionada para o servlet controlador

passando o parâmetro acao via GET.

Figura 6.19: Página index.jsp

Fonte: Conteudista

A página de cadastro.jsp é basicamente a mesma do exemplo anterior,

alterando apenas os dados do cadastro não é mais enviado para a

página processamento.jsp, e sim para o servlet controlador com o

parâmetro acao = efetuarCadastro. Observe que como os parâmetros

são passados via POST, então faz-se necessário no formulário um

campo oculto (hidden) para configurar o parâmetro acao.

Figura 6.20: Página cadastro.jsp

Fonte: Conteudista

A página erro.jsp é a mesma do primeiro exemplo e você pode ver o

seu código na figura 6.21, onde ela recebe como parâmetro as

informações que serão exibidas ao usuário.

Figura 6.21: Página erro.jsp

Fonte: Conteudista

A página exibicao.jsp (vide figura 6.22) diferencia da vista no

exemplo anterior, pois esta poderá ter várias pessoas cadastradas. Ela

recebe os dados do que exibir através do método getAttibute do objeto

request (linha 10). Para que esta linha possa compilar, é necessário ter

as importações das linhas 6 e 7. A tabela agora tem um cabeçalho

(linhas 21 a 26), e a quantidade de linhas da tabela depende de

quantos elementos existem dentro da lista (veja que o for começa na

linha 28 e termina na linha 33). Foi também incluído um link para o

início da aplicação (linha 36) apontando para o servlet controlador

sem nenhuma ação associada, e assim fazendo um forward para a

página index.jsp que é o valor padrão da variável paginaJSP (linha 29

da figura 6.18).

Figura 6.22: Página exibicao.jsp

Fonte: Conteudista

6.7 Estudos Futuros

Existe muita tarefa repetitiva quando você implementa uma aplicação web grande utilizando o padrão MVC, portanto para facilitar o seu trabalho existem os frameworks como spring e struts que facilita bastante a sua vida. Portanto, é um ponto interessante para você começar a estudar e desenvolver mais a sua habilidade para o desenvolvimento de aplicações web.

Outros padrões de projetos que é interessante você estudar são: factory, abstract factory e DAO (data access object), e assim deixar a sua aplicação ainda mais reusável e fácil de desenvolver.

Já existe a versão Java EE 6 que ainda incorpora mais recursos ao desenvolvimento web, também é preciso estudar as chamadas tag libraries, JSF e Unified Expression Language.

Portanto, saiba que estas duas unidades semanais foram apenas a sua introdução a este assunto tão extenso que é o desenvolvimento de aplicações web em Java.

Outros recursos que você também precisa aprender incluem: javascript, AJAX, jQuery, etc.

Saiba Mais

Vocês pode obter mais detalhes sobre JSP e Java EE nos seguintes sites:

http://download.oracle.com/javaee/6/tutorial/doc/index.html http://www.metropoledigital.ufrn.br/aulas_avancado/web/dis ciplinas/desenv_web/index.html http://netbeans.org/kb/trails/java-ee_pt_BR.html http://www.oficinadanet.com.br/artigo/1687/mvc_- _o_padrao_de_arquitetura_de_software http://www.jsptut.com http://javafree.uol.com.br/artigo/868717/JSP-Java-Server-

http://www.javasimples.com.br/spring-2/spring-framework- parte-1-dependency-injection/

Atividades de aprendizagem:

1. Desenvolva uma pequena aplicação web de uma agenda telefônica utilizando o padrão MVC e armazenando os dados em banco de dados através de JDBC.

2. Estude mais sobre o framework Spring e altere a aplicação web do exercício 1 para se aproveitar das facilidades do Spring.

RESUMO

Nesta aula você aprendeu a estruturar melhor as suas aplicações web

separando código Java em servlets e código HTML em páginas JSP

utilizando o conhecido padrão de arquitetura MVC. Aprendeu também

como criar JavaBeans e facilitar o fluxo de informações entre as

páginas JSP e os servlets da sua aplicação. E principalmente, que o

assunto coberto aqui é apenas a ponta do iceberg no desenvolvimento

de aplicações web.

REFERÊNCIAS

[1] DEITEL, Harvey M.; DEITEL, Paul J.. Java, como programar. 8. ed. Prentice Hall Brasil, 2010.

[2] MECENAS, I. J. Java 6 - Fundamentos, Swing, Bluej E Jdbc. 3. ed. Starlin Alta Consult, 2008.

[3] HORSTMANN, Cay S.; CORNELL, Gary. Core Java, V.1 -

Fundamentos. 8. ed. Prentice Hall Brasil, 2009.

[4] ______. The Java Tutorials. Disponível em http://download.oracle.com/javase/tutorial/. Atualizado em 17/03/2011. Acessado em 16/04/2011.

[1] JANDL JUNIOR, P. Desenvolvendo Aplicações Web com JSP e

JSTL. 1. ed. Novatec, 2009.

[2] BASHAM, B. Use a Cabeça! Servlets e JSP. 2. ed. Starlin Alta Consult, 2008.

[3] GONÇALVES, E. Desenvolvendo Aplicações Web com JSP,

Servlets, JavaServer Faces, Hibernate, EJB 3 Persistence e AJAX.

1. ed. Ciência Moderna, 2007.

[4] ______. The Java EE 6 Tutorial. Disponível em http://download.oracle.com/javaee/6/tutorial/doc/. Atualizado em Março de 2011. Acessado em 16/04/2011.

No documento LINGUAGEM DE PROGRAMAÇÃO II VOLUME 02 (páginas 76-104)

Documentos relacionados