Logo Passei Direto
Buscar
páginas com resultados encontrados.
páginas com resultados encontrados.

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

<p>AMBIENTES	DE</p><p>INTERNET</p><p>Jorge Juan Zavaleta Gavidia</p>
<p>TERMOS DE USO DA APOSTILA</p><p>Todo o conteúdo desta apostila é propriedade de Jorge Zavaleta. O conteúdo</p><p>desta apostila é baseado em livros de (GONÇALVES, 2007), (BROWN e HALL, 2005)</p><p>e (QIAN, ALLEN, et al., 2010) sobre o tema e referenciados no final do mesmo, para o</p><p>reconhecimento de sua autoria.</p><p>A apostila pode ser utilizada livremente para estudo pessoal ou pode ser</p><p>utilizada como material de apoio em cursos de ensino superior desde que seja citado</p><p>explicitamente o autor deste material.</p><p>É proibida qualquer utilização desse material que não se enquadre nas condições</p><p>acima sem o prévio consentimento formal, por escrito, do autor. O uso indevido está</p><p>sujeito às medidas legais cabíveis.</p><p>Jorge Juan Zavaleta Gavidia</p><p>zavaleta@cos.ufrj.br</p><p>zavaleta.jorge@gmail.com</p><p>Rio de Janeiro, 2012</p>
<p>SUMÁRIO</p><p>1. SERVLET ..................................................................................................................... 1</p><p>1.1 CONCEITO ................................................................................................................ 3</p><p>1.2 ARQUITETURA DE UM APLICATIVO SERVLET .............................................. 3</p><p>1.3 INSTALAÇÃO E CONFIGURAÇÃO ...................................................................... 4</p><p>1.3.1 Pré-requisitos ........................................................................................................... 4</p><p>1.3.2 Instalação e Configuração do Tomcat/GlassFish .................................................... 5</p><p>1.3.3 Instalação e configuração de uma Aplicação Web .................................................. 5</p><p>1.3 ETAPAS PARA EXECUTAR UM SERVLET ......................................................... 6</p><p>1.3.1 Criar uma estrutura de diretórios em Tomcat .......................................................... 6</p><p>1.3.2 Escrever o código fonte servlet ............................................................................... 6</p><p>1.3.3 Compilar o código fonte .......................................................................................... 7</p><p>1.3.4 Criar uma distribuição descritiva ............................................................................. 8</p><p>1.3.5 Executar o Tomcat ................................................................................................... 8</p><p>1.3.6 Chamar o servlet a partir de um browser de web .................................................... 9</p><p>1.4 EXEMPLOS ............................................................................................................... 9</p><p>2. APLICATIVOS SERVLET ...................................................................................... 10</p><p>2.1 O PACOTE JAVAX.SERVLET .............................................................................. 10</p><p>2.2 CICLO DE VIDA ..................................................................................................... 10</p><p>2.3 CLASSE HttpServlet .............................................................................................. 12</p><p>2.4 A interface HttpServletRequest.............................................................................. 12</p><p>2.5 A interface HttpServletResponse ........................................................................... 12</p><p>2.6 Exemplos .................................................................................................................. 13</p><p>2.6.1 Servlet usando o método POST ............................................................................. 13</p><p>2.6.2 Servlet usando o método GET ............................................................................... 14</p><p>2.6.3 Métodos úteis da interface HttpServletRequest .................................................... 15</p><p>2.6.4 Varrendo um formulário ........................................................................................ 17</p><p>2.6.5 Redirecionando um acesso .................................................................................... 18</p><p>3. GERENCIAMENTO DE SESSÃO ........................................................................... 19</p><p>3.1 Cookies ..................................................................................................................... 19</p><p>3.2 Criando Cookies ....................................................................................................... 19</p><p>3.3 Recuperando um Cookie .......................................................................................... 20</p><p>3.4 Sessões ...................................................................................................................... 21</p><p>3.5 Gerenciando uma sessão ........................................................................................... 24</p><p>3.6 URL Rewriting (Reescrita de URL) ......................................................................... 24</p><p>4 FILTRAGEM DE SERVLET ..................................................................................... 25</p><p>4.1 Importância dos filtros em Servlet............................................................................ 26</p><p>5 FUNDAMENTOS BÁSICOS DE JSP ........................................................................ 30</p><p>5.1 Convenções de tags .................................................................................................. 31</p><p>5.2 Componentes de uma página JavaServer Page ........................................................ 31</p><p>5.2.1 Diretivas ................................................................................................................ 31</p><p>5.3 Elementos de Scripting ............................................................................................. 36</p><p>5.3.1 Declarações ............................................................................................................ 36</p><p>5.3.2 Expressões ............................................................................................................. 37</p><p>5.3.3 Scriplets ................................................................................................................. 38</p><p>5.3.4 Objetos predefinidos .............................................................................................. 39</p><p>6 MODELOS DE COMPONENTES ............................................................................. 40</p><p>7. CONEXÃO DE BANCO DE DADOS COM JDBC ................................................. 46</p>
<p>7.1 INTRODUÇÃO A JDBC ......................................................................................... 46</p><p>7.2 MySQL E JDBC ....................................................................................................... 46</p><p>7.3 MySQL NO WINDOWS......................................................................................... 46</p><p>7.4 INSTALANDO O DRIVER JDBC .......................................................................... 47</p><p>7.7 CONEXÕES COM JDBC E MVC .......................................................................... 51</p><p>7.8 O PADRÃO DAO (Data Access Object) ................................................................. 55</p><p>8 USANDO TAG PERSONALIZADAS ....................................................................... 57</p><p>8.1 CONSTRUINDO UMA BIBLIOTECA DE Tags ................................................... 57</p><p>8.2 CRIANDO O TLD. .................................................................................................. 58</p><p>8.3 REFERENCIANDO UMA BIBLIOTECA DE tags ................................................ 59</p><p>8.4 HANLERS ................................................................................................................ 60</p><p>8.5 BIBLIOTECAS: JSP Standard Tag Library (JSTL) ................................................ 60</p><p>8.6 EMPACOTANDO E DISTRIBUINDO tags ........................................................... 60</p><p>9. STRUTS ..................................................................................................................... 62</p><p>9.1 MVC – Model ........................................................................................................... 62</p><p>9.2 MVC – View ............................................................................................................ 62</p><p>9.3 MVC – Controller ..................................................................................................... 63</p><p>9.4 ARQUITETURA MVC PARA A WEB: A Arquitetura Model 2 ........................... 63</p><p>9.5 STRUTS ................................................................................................................... 64</p><p>9.5.1 Controller ............................................................................................................... 64</p><p>9.5.2 Model (Modelo) ..................................................................................................... 70</p><p>9.5.3 View (Visualização) .............................................................................................. 70</p><p>9.6 UM EXEMPLO USANDO O STRUTS .................................................................. 73</p><p>9.6.1 Criando A Aplicação: LoginStructApp ................................................................. 73</p><p>9.6.2 Criando as paginas JSP .......................................................................................... 74</p><p>9.6.3 Criando o Bean ActionForm ................................................................................. 75</p><p>9.6.4 Criando a Classe Action ........................................................................................ 75</p><p>9.6.5 Implementando a validação (na classe LoginAction) ........................................... 75</p><p>9.6.6 Adicionando forward as entradas no struts-config.xml ......................................... 76</p><p>9.6.7 Configurando e rodando a aplicação ..................................................................... 76</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>1</p><p>1. SERVLET</p><p>A tecnologia Servlet é a base do desenvolvimento de aplicativos web usando a</p><p>linguagem de programação Java. Ela é uma das tecnologias Java mais importante e é</p><p>subjacente para outra tecnologia Java popular para o desenvolvimento de aplicativos, o</p><p>JSP. Entender a tecnologia servlet e sua arquitetura é importante para quem pretende</p><p>desenvolver aplicações web dinâmicas e personalizadas utilizando Java.</p><p>Inicialmente, a Internet consistia apenas de conteúdos estáticos, escritos usando</p><p>HTML (Hypertext Markup Language). Nessa ocasião, qualquer programador que</p><p>soubesse fazer páginas HTML era considerado especialista em Internet. Porém, logo</p><p>chegaram os conteúdos web dinâmicos através da tecnologia CGI (Common Gateway</p><p>Interface), que permite ao servidor web chamar um programa externo e passar</p><p>informações de solicitações HTTP à ele, para processar a solicitação. A resposta é</p><p>então passada de volta ao servidor web, que a encaminha ao browser cliente. Com o</p><p>tempo, Perl se tornou a linguagem mais popular para escrever programas CGI.</p><p>Quando a Internet se tornou mais e mais popular, o número de usuários visitando</p><p>sites aumentou incrivelmente, e ficou claro que CGI tinha falhado em apresentar</p><p>aplicativos escalonáveis de Internet. Essa falha está associada à reprodução de um novo</p><p>processo do programa CGI solicitado, para cada solicitação do cliente. Além disso, o</p><p>processo de criação é uma operação cara, que consome muitos ciclos de CPU e</p><p>memória de computador.</p><p>Gradativamente, tecnologias novas e melhores vieram substituindo gradativamente</p><p>o CGI como principal tecnologia de desenvolvimento de aplicativos web. Algumas</p><p>delas estão listadas a seguir:</p><p>• ColdFusion – oferece tags personalizadas como HTML, que podem ser usadas para</p><p>realizar uma série de operações, especialmente consultar um banco de dados. Essa</p><p>tecnologia teve sua época de glória na história da World Wide Web como principal</p><p>tecnologia para programação de aplicativo web.</p><p>• Server-side JavaScript (SSJS) – é uma extensão da linguagem JavaScript, a</p><p>linguagem de Script que ainda regula a programação web ao lado cliente. SSJS pode</p><p>acessar classes Java distribuídas do lado servidor usando a tecnologia LiveWire da</p><p>Netscape.</p><p>• PHP – excitante tecnologia de fonte aberta, que amadureceu nos últimos anos. A</p><p>tecnologia oferece fácil desenvolvimento de aplicativo web, com seu gerenciamento</p><p>de sessão, e inclui alguma funcionalidade interna, tal como upload de arquivo. A</p><p>quantidade de desenvolvedores usando PHP como sua tecnologia de escolha tem</p><p>aumentado muito nos últimos anos.</p><p>• Servlet – tecnologia introduzida pela Sun Microsystems em 1996 e é a base para os</p><p>aplicativos web desenvolvidos com a linguagem Java.</p><p>• JavaServer Pages (JSP) – extensão da tecnologia servlet, permite principalmente a</p><p>comunicação entre a camada de apresentação (exemplo em HTML) com as camadas</p><p>de negócio e dados escritas como beans (componentes Java). JSP funciona com</p><p>servidores (ex. TomCat).</p><p>• Active Server Pages (ASP) – emprega tecnologias de script que funcionam em</p><p>plataformas Windows. ASP funciona com o servidor web Internet Information</p><p>Server (IIS – servidor de informações de Internet).</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>2</p><p>• Active Server Pages.NET (ASP.NET) – emprega um tempo de execução chamado</p><p>Common Language Runtime que é muito semelhante a Java Virtual Machine e</p><p>oferece uma vasta biblioteca de classe, disponível a todas as linguagens .NET e de</p><p>páginas ASP.NET.</p><p>Dentre as diversas tecnologias mencionadas acima e disponíveis atualmente para o</p><p>desenvolvimento dessa classe de aplicações, destaca- se a de Servlets e a de páginas</p><p>JSP (Java Server Pages).</p><p>A utilização de Servlets e de páginas JSP oferece diversas vantagens em relação ao</p><p>uso de outras tecnologias (como PHP, ASP e CGI). As principais vantagens são</p><p>herdadas da própria linguagem Java que não necessariamente estão disponíveis em</p><p>outras tecnologias:</p><p>• Portabilidade – a aplicação desenvolvida pode ser implantada em diversas</p><p>plataformas, como por exemplo, Windows, Unix e Macintosh, sem que seja</p><p>necessário modificar ou mesmo reconstruir a aplicação. Os aplicativos servlet são</p><p>portáveis e é possível movê-los para outros sistemas operacionais sem dificuldades.</p><p>• Desempenho – superior a CGI, pois não há processo de criação para cada</p><p>solicitação de cliente. Cada solicitação é gerenciada pelo processo contentor de</p><p>servlet. Depois que um servlet termina de processar uma solicitação, ele permanece</p><p>na memória, aguardando por outra solicitação.</p><p>• Facilidade de programação - a programação é orientada a objetos, simplificando o</p><p>desenvolvimento de sistemas complexos. Além disso, a linguagem oferece algumas</p><p>facilidades, como por exemplo, o gerenciamento automático de memória (estruturas</p><p>alocadas são automaticamente liberadas, sem que o desenvolvedor precise se</p><p>preocupar em gerenciar esse processo). Os servlets têm acesso a uma rica biblioteca</p><p>Java, que ajuda a apressar o processo de desenvolvimento.</p><p>• Robustez – os Servlets são gerenciados pela JVM (Java Virtual Machine). Como</p><p>tal, não há necessidade de se preocupar com falha de memória ou coleta de resíduos,</p><p>o que ajuda a criar aplicativos robustos.</p><p>• Flexibilidade – Java é uma tecnologia amplamente aceita. Isso significa que</p><p>numerosos fabricantes trabalham com tecnologias baseadas em Java. Uma das</p><p>vantagens dessa aceitação difundida é que é possível encontrar com facilidade, e</p><p>comprar, componentes, que se ajustem às necessidades, o que poupa precioso tempo</p><p>de desenvolvimento.</p><p>Além dessas vantagens, a arquitetura de Servlets e páginas JSP possibilitam alguns</p><p>benefícios adicionais:</p><p>• Escalabilidade - na maior parte dos servidores de aplicações modernos, é possível</p><p>distribuir a carga de processamento de aplicações desenvolvidas em diversos</p><p>servidores, sendo que servidores podem ser adicionados ou removidos de maneira a</p><p>acompanhar o aumento ou decréscimo dessa carga de processamento.</p><p>• Eficiência - os Servlets carregados por um servidor persistem em sua memória até</p><p>que ele seja finalizado. Assim, ao contrário de outras tecnologias, não são iniciados</p><p>novos processos para atender cada requisição recebida; por outro lado, uma mesma</p><p>estrutura alocada em memória pode ser utilizada no atendimento das diversas</p><p>requisições que chegam a esse mesmo Servlet.</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>3</p><p>• Recompilação automática - páginas JSP modificadas podem ser automaticamente</p><p>recompiladas, de maneira que passem a incorporar imediatamente as alterações sem</p><p>que seja necessário interromper o funcionamento da aplicação como um todo.</p><p>1.1 CONCEITO</p><p>Os Servlets são classes Java, desenvolvidas de acordo com uma estrutura bem definida,</p><p>e que, quando instaladas junto a um Servidor que implemente um Servlet Container</p><p>(um servidor que permita a execução de Servlets, muitas vezes chamado de Servidor de</p><p>Aplicações Java), podem tratar requisições recebidas de clientes.</p><p>A servlet pode ser automaticamente carregada e executada por um servidor web</p><p>especial. Esse servidor web cliente de servlet é chamado de um servlet container, que</p><p>também era chamado de uma máquina servlet no início da tecnologia.</p><p>1.2 ARQUITETURA DE UM APLICATIVO SERVLET</p><p>Os Servlets interagem como clientes por meio de um modelo solicitação-resposta</p><p>baseado em HTTP. Então, um servlet container precisa suportar HTTP como</p><p>protocolo de solicitações de cliente e respostar de servidor. Entretanto, um servlet</p><p>container também pode suportar protocolos semelhantes, como HTTPS (HTTP sobre</p><p>SSL) para transações seguras.</p><p>A arquitetura de um aplicativo servlet pode ser mostrada na figura 1 abaixo.</p><p>Fig. 1: Arquitetura de um aplicativo servlet</p><p>Em um aplicativo JSP, o servlet container é substituído por um container JSP. Ambos</p><p>os containeres, servlet e JSP, com frequência são referenciados como containeres web</p><p>ou container servlet/JSP, especialmente se um aplicativo web consistir de ambos,</p><p>servlets e páginas JSP.</p><p>Um aplicativo servlet também pode incluir conteúdo estático, tais como páginas HTML</p><p>e arquivos de imagem. Permitir que o servlet container sirva conteúdo estático não é</p><p>preferível, pois o conteúdo é mais rápido se servido por um servidor HTTP mais</p><p>potente, tal como o servidor web Apache ou o Microsoft Intenet Information Server.</p><p>Como tal, é uma prática comum colocar um servidor web na frente, para gerenciar todas</p><p>as solicitações de cliente. O servidor web serve o conteúdo estático e passa aos</p><p>containeres servlet todas as solicitações de cliente para servlets.</p><p>A figura 2 abaixo mostra um esquema dessa arquitetura, que é a mais comum para um</p><p>aplicativo servlet.</p><p>resposta HTTP</p><p>(POST)</p><p>Browser</p><p>Servlet</p><p>container</p><p>servlet</p><p>Conteúdo</p><p>estático</p><p>solicitação HTTP</p><p>(GET)</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>4</p><p>Fig. 2: Arquitetura de aplicativo servlet empregando um servidor HTTP</p><p>1.3 INSTALAÇÃO E CONFIGURAÇÃO</p><p>Na seção são apresentados os tópicos referentes a instalação e configuração de um</p><p>ambiente básico para a implantação e execução de aplicações Web com Servlets e</p><p>páginas JSP.</p><p>1.3.1 Pré-requisitos</p><p>O primeiro passo, para desenvolver aplicações Web com Servlets e páginas JSP é a</p><p>configuração de um ambiente básico para a implantação e execução dessas aplicações.</p><p>Esse ambiente básico pressupõe a instalação de dois componentes principais: o Java 2</p><p>Standard Development Kit (J2SDK), utilizado para compilar aplicações Java, e um</p><p>Servlet Container, que irá executar os Servlets desenvolvidos.</p><p>Alguns sistemas operacionais já possuem um J2SDK instalado por “default”. Caso esse</p><p>ainda não se encontre instalado, pode-se obtê-lo no site oficial do Java</p><p>(http://www.oracle.com/technetwork/java/index.html). Neste site é possível selecionar</p><p>entre as versões de J2SDK para as diversas plataformas de mercado tais como</p><p>Windows, Linux, Solaris e outros.</p><p>O outro componente necessário para o desenvolvimento de Servlets e JSP é um servidor</p><p>que implemente um Servlet Container. Esse servidor será responsável por prover um</p><p>framework básico para as diversas aplicações desenvolvidas, inicializando-as,</p><p>distribuindo as requisições entre elas e tratando os resultados do processamento de cada</p><p>aplicação.</p><p>Apesar de existirem diversos servidores disponíveis no mercado, para efeito dos</p><p>exemplos apresentados nesta apostila, utilizaremos o Apache Tomcat, disponível no</p><p>site (http://tomcat.apache.org/). Esse servidor de aplicações atende às especificações</p><p>mencionadas anteriormente e pode ser utilizado sem nenhum custo para o</p><p>desenvolvedor. Uma outra alternativa muito interessante pode ser o GlassFish Server</p><p>(http://glassfish.java.net/).</p><p>Um último componente normalmente utilizado para o desenvolvimento de Servlets e</p><p>páginas JSP é um ambiente gráfico de desenvolvimento (IDE), para desenvolver os</p><p>exemplos de esta apostila foi usado o NetBeans IDE 7.x.x (http://netbeans.org/).</p><p>resposta HTTP</p><p>(POST)</p><p>Browser</p><p>Servidor</p><p>HTTP</p><p>servlet</p><p>Conteúdo</p><p>estático</p><p>solicitação HTTP</p><p>(GET)</p><p>Servlet</p><p>container</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>5</p><p>1.3.2 Instalação e Configuração do Tomcat/GlassFish</p><p>No site do Apache Tomcat ou do GlassFish são disponibilizadas versões do software</p><p>com instaladores para os diversos sistemas operacionais. Normalmente esse processo de</p><p>instalação é simples, e, uma vez finalizado, tem-se um servidor de aplicações pronto</p><p>para ser usado.</p><p>De qualquer forma, o site disponibiliza toda a documentação necessária para resolver</p><p>problemas encontrados e esclarecer dúvidas com relação ao processo de instalação e</p><p>configuração do servidor. Para entender um pouco mais a fundo o funcionamento do</p><p>Tomcat/GlassFish, deve-se examinar os diretórios criados durante o processo de</p><p>instalação. Os principais diretórios criados são:</p><p>Diretório Descrição</p><p>bin Executáveis, incluindo os aplicativos para iniciar e para encerrar a</p><p>execução do servidor</p><p>conf Arquivos de configuração do Tomcat. O arquivo “server.xml”, em</p><p>particular, define uma série de parâmetros para a execução do servidor,</p><p>como por exemplo, a porta onde o servidor irá receber requisições (essa</p><p>porta é, por default, 8080), devendo ser examinado com cuidado e</p><p>modificado conforme as necessidades.</p><p>logs Arquivos de log do servidor. Além de gerar arquivos de log contendo</p><p>entradas para cada requisição recebida, como qualquer servidor Web, o</p><p>Tomcat também pode gerar arquivos de log com tudo o que as aplicações</p><p>desenvolvidas enviam para as saídas padrão do sistema: tipicamente, o que</p><p>é impresso através do “System.out” é acrescido no arquivo “stdout.log”, e</p><p>tudo o que é impresso através do “System.err” é acrescido no arquivo</p><p>“stderr.log”.</p><p>work Diretório temporário do Tomcat. Esse diretório é utilizado, por exemplo,</p><p>para realizar a recompilação automática de páginas JSP (esse processo é</p><p>explicado mais adiante no capítulo “Páginas JSP”).</p><p>webapps Nesse diretório são instaladas as diversas aplicações web desenvolvidas.</p><p>1.3.3 Instalação e configuração de uma Aplicação Web</p><p>De acordo à seção 1.3.2, existe um diretório no Apache Tomcat chamado “webapps”</p><p>onde devem ser instaladas as diversas aplicações desenvolvidas por você ou por</p><p>terceiros. Para que possamos mostrar como são feitas essas instalações, precisamos</p><p>antes definir o que é uma aplicação Web: a partir de agora, estaremos chamando de uma</p><p>aplicação Web um conjunto de Servlets, páginas JSP, classes Java, bibliotecas,</p><p>ícones, páginas HTML e outros elementos, que podem ser empacotados juntos e que</p><p>proveem as funcionalidades previstas pela aplicação.</p><p>De acordo com a especificação de Servlets, existem duas maneiras pelas quais uma</p><p>aplicação web pode ser instalada junto a um Servlet Container: por meio de um arquivo</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>6</p><p>WAR (Web Application Archive) ou por meio de uma estrutura de diretórios criada</p><p>junto ao servidor. No caso específico do Tomcat, essa estrutura deve ser criada abaixo</p><p>do diretório “webapps”.</p><p>1.3 ETAPAS PARA EXECUTAR UM SERVLET</p><p>Depois de instalar e configurar o Tomcat é só seguir as etapas abaixo para escrever um</p><p>servlet e executá-lo.</p><p>1. Criar uma estrutura de diretório para o aplicativo em Tomcat;</p><p>2. Escrever o código fonte de servlet. É preciso importar os pacotes javax.servlet e</p><p>javax.servlet.http;</p><p>3. Compilar o código fonte;</p><p>4. Criar uma distribuição descritiva;</p><p>5. Executar o Tomcat;</p><p>6. Chamar o servlet a partir de um browser de web.</p><p>1.3.1 Criar uma estrutura de diretórios em Tomcat</p><p>Ao instalar o Tomcat, automaticamente são criados vários subdiretórios sob o diretório</p><p>home de Tomcat (%CATALINA_HOME%). Um dos subdiretórios é “webapps”. Esse</p><p>diretório é onde se armazena os aplicativos web. Um aplicativo web é uma coleção de</p><p>servlets e outro conteúdo instalado sob um subconjunto específico do namespace URL</p><p>do servidor. Um diretório separado é dedicado a cada aplicativo servlet. Portanto, a</p><p>primeira coisa a fazer quando se monta um aplicativo servlet é criar um diretório de</p><p>aplicativo. Para criar uma estrutura de diretório para um aplicativo com nome</p><p><<nomeServlet>> os passos são:</p><p>o Criar um diretório chamado <<nomeServlet>> sob</p><p>o diretório “webapps”. O nome do diretório é</p><p>importante, pois isso também aparece na URL ao</p><p>servlet.</p><p>o Criar os diretórios WEB-INF em “nomeServlet” e</p><p>criar um diretório chamado <<classes>> em WEB-INF.</p><p>A estrutura de diretório é mostrada na figura do lado. O</p><p>diretório de classes WEB-INF conterá as classes Java.</p><p>Se houver arquivos HTML, colocá-los diretamente no</p><p>diretório nomeServlet. As imagens podem ser</p><p>colocadas num subdiretório chamado images, em</p><p>nomeServlet.</p><p>1.3.2 Escrever o código fonte servlet</p><p>O código fonte pode ser escrito no editor de texto predileto ou num IDE (Eclipse,</p><p>Netbeans, etc.). O código abaixo está numa classe chamada TestandoServlet que herda</p><p>atributos e métodos da classe HttpServlet. Através do método doGet(), a classe envia</p><p>ao browser algumas tags HTML e algum texto, utilizando o método println do atributo</p><p>out. Esse método recebe dois parâmetros, um objeto HttpServletRequest contendo a</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>7</p><p>solicitação e um objeto HttpServletResponse contendo a resposta. São realizados os</p><p>lançamentos das exceções ServletException e IOException, caso ocorrerem problemas</p><p>relacionados às solicitações, requisições e entrada/saída durante a execução da</p><p>aplicação.</p><p>//importação de classes e interfaces</p><p>import javax.servlet.*;</p><p>import javax.servlet.http.*;</p><p>import java.io.*;</p><p>import java.util.*;</p><p>//classe externa para teste de servlet</p><p>public class TestandoServlet extends HttpServlet{</p><p>//método para enviar as tags e textos</p><p>public void doGet(HttpServletRequest request,</p><p>HttpServletResponse response)</p><p>throws ServletException, IOException{</p><p>//"request" é utilizado para ler os dados do formulário HTML</p><p>//dos cabeçalhos HTTP (um exemplo são os dados digitados e</p><p>//submetidos) e outros dados que podem ser obtidos a partir da</p><p>//requisição do cliente.</p><p>// "response" é para especificar a linha e o cabeçalho de</p><p>//resposta do HTTP (exemplo: especificar o tipo do conteúdo,</p><p>//definir cookies). Também contém métodos que permitem ao</p><p>//Servlet gerar respostas para o cliente.</p><p>PrintWriter out = response.getWriter();</p><p>out.println("<HTML>");</p><p>out.println("<HEAD>");</p><p>out.println("<TITLE>Testando Servlet</TITLE>");</p><p>out.println("</HEAD>");</p><p>out.println("<BODY>");</p><p>out.println("Bem vindo aos testes com servlets");</p><p>out.println("</BODY>");</p><p>out.println("</HTML>");</p><p>}</p><p>}</p><p>Salvar esse código fonte no arquivo TestandoServlet.java no diretório WEBINF/classes</p><p>em appServlet (nomeServlet). Isso o tornará inacessível ao browser da web.</p><p>1.3.3 Compilar o código fonte</p><p>A compilação a partir de um IDE (neste caso o NetBeans) será necessário importar a</p><p>biblioteca externa servlet.jar (servlet-api.jar para a versão x.x do Tomcat) é só fazê-la</p><p>apontando para o diretório da aplicação,</p><p>%CATALINA_HOME%\webapps\appServlet\WEB-INF\classes</p><p>Pode-se também gerar um arquivo.jar e colocá-lo na pasta \lib do Tomcat.</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>8</p><p>1.3.4 Criar uma distribuição descritiva</p><p>O arquivo descritor de contexto (DD - Deployment Descriptor) padrão de uma</p><p>aplicação web, segundo a especificação Java Servlet/Java EE. A descrição assume a</p><p>forma de um documento XML chamado web.xml e precisa estar localizado no diretório</p><p>WEB-INF do aplicativo servlet. Quando presente, a distribuição descritiva contém</p><p>ajustes de configuração específicos para aquele aplicativo.</p><p>As informações contidas no arquivo DD detêm as configurações específicas da</p><p>aplicação. Onde:</p><p> Informações textuais de título (elemento <display-name />, nome para</p><p>exibição no Manager) e o comentário da descrição (<description />) do</p><p>contexto, úteis para a identificação e documentação.</p><p> O elemento <servlet /> indica o nome do Servlet bem como a sua classe.</p><p> No elemento <servlet-mapping /> mapeia o Servlet para que seja acessível no</p><p>browser.</p><p>Para criar uma distribuição descritiva, é preciso criar um arquivo web.xml e colocá-lo</p><p>sob o diretório WEB-INF, baixo o diretório criado para a aplicação, por exemplo em</p><p>appServlet. O arquivo web.xml para esse exemplo está escrito no código abaixo:</p><p><?xml version="1.0" encoding="ISO-8859-1"?></p><p><!DOCTYPE web-app</p><p>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</p><p>"http://java.sun.com/dtd/web-app_2_3.dtd"></p><p><web-app></p><p><servlet></p><p><servlet-name>Testando</servlet-name></p><p><servlet-class>TestandoServlet</servlet-class></p><p></servlet></p><p><servlet-mapping></p><p><servlet-name>Testando</servlet-name></p><p><url-pattern>/Testando</url-pattern></p><p></servlet-mapping></p><p></web-app></p><p>O arquivo web.xml tem um elemento <web-app>. Podem-se escrever todos os servlets</p><p>em <web-app>. Cada servlet tem um elemento <servlet> e precisa dos elementos</p><p><servlet-name> e <servlet-class>. O <servlet-name> é o nome do servlet, pelo qual o</p><p>Tomcat o conhece. O <servlet-class> é o arquivo compilado do servlet, sem a extensão</p><p>.class. O elemento <servlet-mapping> indica o mapeamento para a URL e possui os</p><p>elementos <servlet-name> com o nome do mapeamento e <url-pattern> com o</p><p>mapeamento. Podem ser adicionados mais de um servlet ao arquivo web.xml.</p><p>1.3.5 Executar o Tomcat</p><p>Se o Tomcat ainda não estiver sendo executado, será preciso iniciá-lo. Após isso é</p><p>possível efetuar o chamado da aplicação a partir de um browser.</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>9</p><p>1.3.6 Chamar o servlet a partir de um browser de web</p><p>Agora, o servlet construído pode ser chamado a partir de um browser da web. Digitar o</p><p>URL na caixa Address: http://localhost:8080/appServlet/Testando. A palavra</p><p>“Testando” foi identificada no arquivo web.xml através da tag <servlet-</p><p>name>Testando</servletname>. Caso o arquivo web.xml não tenha sido escrito será</p><p>necessário escrever na caixa Address: http://localhost:8080/appServlet/TestandoServlet,</p><p>onde “TestandoServlet” é o nome da classe sem a extensão .class.</p><p>1.4 EXEMPLOS</p><p>Um cenário típico de funcionamento de uma aplicação desenvolvida com Servlets é o</p><p>seguinte. Ao receber uma requisição, um Servlet pode capturar parâmetros desta</p><p>requisição, efetuar qualquer processamento inerente a uma classe Java, e devolver uma</p><p>página HTML por exemplo.</p><p>import java.io.*;</p><p>import javax.servlet.http.*;</p><p>/ / Servlet simples que retorna página HTML com o endereço IP</p><p>/ / do cliente que está fazendo o acesso</p><p>public class RemoteIPServlet extends HttpServlet {</p><p>public void doGet( HttpServletRequest p_request,</p><p>HttpServletResponse p_response) throws IOException {</p><p>PrintWriter msg = p_response.getWriter();</p><p>msg.println(“<HTML><BODY>”);</p><p>msg.println(“O seu endereço IP é \”” +</p><p>p_request.getRemoteAddr () + “\””);</p><p>msg.println(“</BODY></HTML>”);</p><p>msg.flush();</p><p>}</p><p>}</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>10</p><p>2. APLICATIVOS SERVLET</p><p>2.1 O PACOTE JAVAX.SERVLET</p><p>O pacote javax.servlet contém as de classes e interfaces que descrevem e definem o</p><p>funcionamento de uma classe servlet e o ambiente de execução fornecendo uma</p><p>instância de uma classe para o container servlet.</p><p>2.2 CICLO DE VIDA</p><p>Um servlet é carregado pelo servlet container na primeira vez que é solicitado. Então, a</p><p>ele é encaminhada a solicitação do usuário. Ele a processa e retorna a resposta ao servlet</p><p>container que, por sua vez, envia a resposta de volta ao usuário. Depois disso, o servlet</p><p>permanece na memória aguardando outras solicitações. Ele não é descarregado da</p><p>memória, a menos que servlet container veja uma diminuição de memória. No entanto,</p><p>cada vez que o servidor é solicitado, o servlet container compara o carimbo de horário</p><p>do servlet carregado como o arquivo de classe servlet. Se o carimbo de horário de</p><p>arquivo de classe for mais recente, o servlet é recarregado na memória. Dessa maneira,</p><p>não há a necessidade de reiniciar o servlet container sempre que o servlet for atualizado.</p><p>Fig. 3: Ciclo de vida de um Servlet</p><p>O ciclo de vida (ver fig 3) de um servlet é controlado pelo container no qual o servlet</p><p>tenha sido implantado. Quando uma requisição é mapeada para o servlet, o container</p><p>segue os seguintes passos:</p><p>1. Se uma instância do servlet não existe, o web container:</p><p>(i) carrega a classe do servlet.</p><p>(ii) cria uma instância da classe do servlet.</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>11</p><p>(iii) inicializa a instância do servlet chamando o método init.</p><p>2. Invoca o método service, passando os objetos request e response. Se o container</p><p>necessitar remover o servlet, ele finaliza o servlet chamando o método destroy.</p><p>Todo servlet segue o ciclo de vida composto de 3 fases: inicialização, atendimento às</p><p>requisições e finalização (veja o código a seguir). O funcionamento básico de um</p><p>Servlet compreende em:</p><p>• void init() - A inicialização do Servlet para parâmetros que podem ser lidos e</p><p>variáveis comuns a todas as requisições que devem ser inicializadas. Um exemplo</p><p>disso são as conexões ao banco de dados estabelecidas na inicialização.</p><p>• void service() - Chamadas ao método de serviço pelo Servlet Container, onde seu</p><p>servlet responde a suas solicitações. É aqui onde o Servlet vai interagir com os</p><p>pedidos, processar e responder.</p><p>• void destroy() - Esse método libera os recursos que estavam sendo usados pelo</p><p>Servlet e é chamado quando é finalizado pelo servidor em que esta sendo executado.</p><p>Ciclo de vida de um Servlet</p><p>package br.ufrj.cos.zavaleta;</p><p>import java.io.IOException;</p><p>import java.io.PrintWriter;</p><p>import javax.servlet.ServletException;</p><p>import javax.servlet.http.HttpServlet;</p><p>import javax.servlet.http.HttpServletRequest;</p><p>import javax.servlet.http.HttpServletResponse;</p><p>public class CicloVidaServlet extends HttpServlet {</p><p>@Override</p><p>public void destroy(){</p><p>super.destroy();</p><p>}</p><p>@Override</p><p>public void init() throws ServletException{</p><p>super.init();</p><p>}</p><p>@Override</p><p>protected void service(HttpServletRequest req,</p><p>HttpServletResponse res)</p><p>throws ServletException, IOException{</p><p>res.setContentType("text/html");</p><p>String html = "<html><head>"+</p><p>"<title>Ciclo de vida de um SERVLET</title></head>"+</p><p>"<body><h1>Ciclo de vida do SERVLET"+</p><p>"</h1></body></html>";</p><p>PrintWriter saida = res.getWriter();</p><p>saida.print(html);</p><p>saida.close();</p><p>}</p><p>}</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>12</p><p>2.3 CLASSE HttpServlet</p><p>A classe HttpServlet sobrescreve o método service para distinguir entre as solicitações</p><p>típicas recebidas de um navegador Web Cliente. Os dois métodos mais comuns e usados</p><p>de solicitação HTTP são GET e POST.</p><p>As utilizações dos dois métodos são muito comuns, uma vez que o método GET pode</p><p>tanto obter informações, onde se pode requisitar um arquivo ou uma imagem, como</p><p>também pode enviar dados, que neste caso temos o limite do cabeçalho HTTP.</p><p>O método POST não requisita informações, e sim as envia (posta), dados para o</p><p>servidor. As utilizações mais comuns de solicitações POST consistem em enviar ao</p><p>servidor informações de um formulário HTML em que o cliente insere dados ou envia</p><p>informações ao servidor para que esse possa pesquisar em um banco de dados e etc.</p><p>A classe HttpServlet define os métodos doGet e doPost para responder as solicitações</p><p>GET e POST vindas de um cliente. Os dois métodos recebem como argumento um</p><p>objeto HttpServletRequest e um objeto HttpServletReponse que permitem interação</p><p>entre o cliente e o servidor.</p><p>2.4 A interface HttpServletRequest</p><p>A Interface ServletRequest permite ao servlet acessar a:</p><p> Informações como os nomes dos parâmetros remetidos pelo cliente, o protocolo</p><p>que está sendo utilizado pelo cliente, e o nome da máquina remota (host remote)</p><p>que tenha realizado a requisição e a do servidor que recebeu a solicitação.</p><p> A stream de entrada, ServletInputStream. Os Servlets utilizam este stream para</p><p>obter os dados dos clientes que utilizam os serviços, como os métodos POST e</p><p>PUT, do protocolo HTTP.</p><p>As interfaces que estendem a interface ServletRequest permitem ao servlet receber mais</p><p>dados específicos do protocolo. Por exemplo, a interface HttpServletRequest contém</p><p>métodos para acessar a informação de cabeçalho específica HTTP.</p><p>2.5 A interface HttpServletResponse</p><p>A Interface ServletResponse proporciona ao servlet os métodos para responder ao</p><p>cliente. Permite ao servlet selecionar o tamanho do conteúdo e o tipo MIME da</p><p>resposta. Proporciona um stream de saída, ServletOutputStream, e um writer através do</p><p>qual o servlet pode devolver dados.</p><p>As interfaces que extendem a interface ServletResponse proporcionam aos servlets mais</p><p>capacidades específicas do protocolo. Por exemplo, a interface HttpServletResponse</p><p>contém métodos que permitem ao servlet manipular informações de cabeçalho</p><p>específico do HTTP.</p><p>A classe HttpServlet possui subclasses abstratas possuidoras de métodos adicionais que</p><p>são automaticamente requeridas pelo método service da classe HttpServlet para auxiliar</p><p>no processamento das requisições baseadas no protocolo HTTP. Estes métodos são:</p><p> doGet para tratamento de requisições HTTP GET.</p><p> doPost para tratamento de requisições HTTP POST.</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>13</p><p> doPut para tratamento de requisições HTTP PUT.</p><p> doDelete para tratamento de requisições HTTP DELETE.</p><p> doHead para tratamento de requisições HTTP HEAD.</p><p> doOptions para tratamento de requisições HTTP OPTIONS.</p><p> doTrace para tratamento de requisições HTTP TRACE.</p><p>Normalmente quando são desenvolvidos servlets baseados no protocolo HTTP, um</p><p>desenvolvedor de Servlet somente se preocupa com os métodos doGet e doPost. Os</p><p>demais métodos são considerados métodos avançados para uso por programadores mais</p><p>familiarizados com o protocolo HTTP.</p><p>O método doHead em HttpServlet é uma especialização do método doGet, somente</p><p>retornando os cabeçalhos produzidos pelo método doGet para o cliente. O método</p><p>doOptions determina automaticamente qual método HTTP será diretamente suportado</p><p>pelo servlet e retorna aquela informação para o cliente. O método doTrace causa uma</p><p>resposta com a mensagem contendo todos os cabeçalhos enviados na requisição</p><p>TRACE.</p><p>2.6 Exemplos</p><p>2.6.1 Servlet usando o método POST</p><p>...</p><p>public class PostServlet extends HttpServlet {</p><p>@Override</p><p>public void destroy(){ super.destroy(); }</p><p>@Override</p><p>protected void doPost(HttpServletRequest request,</p><p>HttpServletResponse response)</p><p>throws ServletException, IOException {</p><p>String usuario = request.getParameter("usuario");</p><p>String senha = request.getParameter("senha");</p><p>String html = "<html><head>"+</p><p>"<title>Usando metodo POST</title></head>"+</p><p>"<body>"+</p><p>"<h1>Usando o método POST </h1>";</p><p>if(usuario.equals("jorge") && senha.equals("123")){</p><p>html += " Seja bem-vindo <strong>Jorge</strong>";</p><p>} else {</p><p>html += "Usuário ou senha inválidos";</p><p>}</p><p>html += "</body></html>";</p><p>response.setContentType("text/html;charset=UTF-8");</p><p>PrintWriter saida = response.getWriter();</p><p>saida.print(html);</p><p>saida.close();</p><p>}</p><p>@Override</p><p>public void init() throws ServletException{super.init(); }</p><p>}</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>14</p><p>Servlet usando o método POST</p><p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"></p><p><html></p><p><head></p><p><title>Login e Senha</title></p><p><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></p><p></head></p><p><body></p><p><form action="PostServlet" method ="post"></p><p>Login : <input type="text" name="usuario" /> <br /></p><p>Senha : <input type="password" name="senha" /> <br /></p><p><input type="submit" value="Logar" /></p><p></form></p><p></body></p><p></html></p><p>Arquivo HTML usado para chamar a classe PostServlet</p><p>2.6.2 Servlet usando o método GET</p><p>...</p><p>public class doGetServlet extends HttpServlet {</p><p>@Override</p><p>public void destroy(){</p><p>super.destroy();</p><p>}</p><p>@Override</p><p>protected void doGet(HttpServletRequest req,</p><p>HttpServletResponse res)</p><p>throws ServletException, IOException{</p><p>//Parametros de entrada</p><p>String nome = req.getParameter("nome");</p><p>String empresa = req.getParameter("empresa");</p><p>String html = "<html><head>"+</p><p>"<title>GET em Servlet</title></head>"+</p><p>"<body>"+</p><p>"Nome: <strong>"+nome+"</strong><br />"+</p><p>"Empresa: <strong>"+empresa+"</strong><br />"+</p><p>"A query string enviada é : <strong>"+</p><p>req.getQueryString()+ "</strong>"+</p><p>"</body></html>";</p><p>res.setContentType("text/html");</p><p>PrintWriter saida = res.getWriter();</p><p>saida.print(html);</p><p>saida.close();</p><p>}</p><p>@Override</p><p>public void init() throws ServletException{</p><p>super.init();}</p><p>}</p><p>Classe Servlet usando o método GET</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>15</p><p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"></p><p><html></p><p><head></p><p><title>Trabalhando com o método GET</title></p><p><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></p><p></head></p><p><body></p><p><h1> Método GET</h1></p><p><a href="doGetServlet?nome=Jorge&empresa=UFRJ">Meu nome e minha Empresa</a></p><p><br /></p><p><a href="doGetServlet?empresa=UFRJ">Minha Empresa</a></p><p><br /></p><p></body></p><p></html></p><p>Arquivo HTML usado para chamar a classe doGetServlet</p><p>2.6.3 Métodos úteis da interface HttpServletRequest</p><p>Esta interface além de oferecer métodos da superclasse ServletRequest, oferece</p><p>também suporte a cookies e sessões.</p><p>Além do método getParameter() também conta com os seguintes métodos:</p><p>• String[] getParameterValues(String s) - retorna uma Array de String caso o</p><p>parâmetro tenha múltiplos valores.</p><p>• Enumeration getParameterNames() - Retorna uma enumeração com os nomes</p><p>de todos parâmetros enviados.</p><p>• String getHeader(String s) - Retorna o valor do cabeçalho enviado.</p><p>• Enumeration getHeaders(String s) - Retorna uma enumeração com os valores</p><p>do cabeçalho.</p><p>• Enumeration getHeaderNames() - Retorna uma enumeração com os nomes de</p><p>todos os cabeçalhos.</p><p>Praticando os métodos, considere a seguinte situação: Uma radio local deseja saber</p><p>quais são as musicas escolhidas por um determinado usuário usando um formulário.</p><p><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"</p><p>"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"></p><p><html xmlns="http://www.w3.org/1999/xhtml"></p><p><head></p><p><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /></p><p><title>Trabalhando com outros métodos de HttpServletRequest</title></p><p></head></p><p><body></p><p><form action="OutrosMetodosServlet" method="post"></p><p><h2>Escolha as músicas</h2></p><p><p></p><p><input name="musica" type="checkbox" value="ROCK" /> Rock<br /></p><p><input name="musica" type="checkbox" value="POP" /> POP<br /></p><p><input name="musica" type="checkbox" value="DANCE" />Dance<br /></p><p><input name="musica" type="checkbox" value="MPB" />MPB<br /></p><p><input name="musica" type="checkbox" value="SERTANEJO" /> Sertanejo</p><p></p></p><p><br /></p><p><input type="submit" name="btEnviar" value="Enviar" /></p><p></form></p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>16</p><p></body></p><p></html></p><p>outrosMetodos.html</p><p>public class OutrosMetodosServlet extends HttpServlet {</p><p>public OutrosMetodosServlet() { super();}</p><p>@Override</p><p>public void destroy() {super.destroy(); }</p><p>@Override</p><p>protected void doPost(HttpServletRequest request, HttpServletResponse response)</p><p>throws ServletException, IOException {</p><p>String[] e = request.getParameterValues("musica");</p><p>String html = "<html><head>"+</p><p>"<title>Trabalhando com Outros métodos em Servlet</title>"+</p><p>"</head>"+</p><p>"<body>" +</p><p>"<h2>Músicas escolhidas:</h2>";</p><p>for(int i=0; i< e.length; i++){</p><p>html+= "<strong>"+e[i]+"</strong><br />";</p><p>}</p><p>html+="</body></html>";</p><p>response.setContentType("text/html");</p><p>PrintWriter writer = response.getWriter( );</p><p>writer.print(html);</p><p>writer.close( );</p><p>}</p><p>@Override</p><p>public void init() throws ServletException {super.init(); }</p><p>}</p><p>Servlet OutrosMetodosServlet.java</p><p>Visualizando os resultados no Browser</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>17</p><p>2.6.4 Varrendo um formulário</p><p>Em muitas aplicações é sempre necessário fazer a varredura de todos os objetos</p><p>enviados em um formulário, por exemplo:</p><p><html xmlns="http://www.w3.org/1999/xhtml"></p><p><head></p><p><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /></p><p><title>Trabalhando com outros métodos de HttpServletRequest</title></p><p></head></p><p><body></p><p><form action="VarrendoFormularios" method="post"></p><p><h2>Cadastre-se aqui:</h2><p></p><p>Nome:<input name="nome" type="text" /><br /></p><p>E-mail: <input name="email" type="text" /><br /></p><p>Site: <input name="site" type="text" /><br /></p><br /></p><p><input type="submit" name="Enviar" value="Enviar" /></p><p></form></p><p></body></p><p></html></p><p>Arquivo formulário.html</p><p>public class VarrendoFormularios extends HttpServlet {</p><p>public VarrendoFormularios() {</p><p>super();</p><p>}</p><p>@Override</p><p>public void destroy() {</p><p>super.destroy();</p><p>}</p><p>@Override</p><p>protected void doPost(HttpServletRequest request, HttpServletResponse</p><p>response) throws ServletException, IOException {</p><p>Enumeration e = request.getParameterNames( );</p><p>String html = "<html><head>"+</p><p>"<title>Trabalhando com getParameterNames( )</title>"+</p><p>"</head>"+</p><p>"<body>" +</p><p>"<h2>Músicas escolhidas:</h2>";</p><p>while(e.hasMoreElements( )){</p><p>String param = (String) e.nextElement( );</p><p>html+= "<strong>"+param+":</strong>"+</p><p>request.getParameter(param)+"<br />";</p><p>}</p><p>html+="</body></html>";</p><p>response.setContentType("text/html");</p><p>PrintWriter writer = response.getWriter( );</p><p>writer.print(html);</p><p>writer.close( );</p><p>}</p><p>@Override</p><p>public void init() throws ServletException {</p><p>super.init();</p><p>}</p><p>}</p><p>Servlet VarrendoFormularios.java</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>18</p><p>2.6.5 Redirecionando um acesso</p><p>Em muitas aplicações é necessário redirecionar o acesso para uma outra pagina, no</p><p>mesmo site ou para um site externo. Para fazer isso, basta usar o método</p><p>sendRedirect(String s). Veja o exemplo a seguir.</p><p>public class RedirServlet extends HttpServlet {</p><p>@Override</p><p>public void destroy(){</p><p>super.destroy();</p><p>}</p><p>@Override</p><p>protected void doPost(HttpServletRequest req, HttpServletResponse res)</p><p>throws ServletException, IOException{</p><p>String usuario = req.getParameter("usuario");</p><p>String senha = req.getParameter("senha");</p><p>if(usuario.equals("Jorge") && senha.equals("123")){</p><p>res.sendRedirect("us_valido.html");</p><p>} else{</p><p>res.sendRedirect("us_invalido.html");</p><p>}</p><p>}</p><p>@Override</p><p>public void init() throws ServletException{</p><p>super.init();}</p><p>}</p><p>Servlet RedirServlet.java</p><p><html></p><p><head></p><p><title>Ligin de Usuário</title></p><p><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></p><p></head></p><p><body></p><p><h1>Tela de Login</h1></p><p><form action="RedirServlet" method="post"></p><p>Login: <input type="text" name="usuario" /><br /></p><p>Senha: <input type="text" name="senha" /><br /></p><p><input type ="submit" value="Logar" /></p><p></form></p><p></body></p><p></html></p><p>Arquivo login.html</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>19</p><p>3. GERENCIAMENTO DE SESSÃO</p><p>Os cookies e as sessões são muito usados no desenvolvimento de sites. Os cookies são</p><p>arquivos usados para armazenar no computador do usuário a suas preferências de</p><p>navegação de um site, e muito comum em sites de comercio eletrônico, e as sessões são</p><p>utilizadas para armazenar temporariamente informações de um usuário em uma em uma</p><p>determinada área do site, por exemplo, em uma caixa de e-mails.</p><p>3.1 Cookies</p><p>Um cookie é usado para armazenar informações no computador de um cliente quando</p><p>ele visita um site na Web. As informações podem ser usadas para identificar o cliente</p><p>quando ele retorna ao site visitado anteriormente.</p><p>A capacidade de identificar os clientes e personalizar os conteúdos é muito importante</p><p>nas vendas por internet.</p><p>Existem dois tipos de cookies:</p><p>• Cookies de sessão - são armazenados na memória e permanecem no</p><p>computador do cliente somente enquanto ele está visitando os site na web.</p><p>• Cookies de persistência - são armazenado num arquivo de texto no computador</p><p>do cliente e podem durar meses ou ate anos. Em computadores com Windows é</p><p>chamado de arquivo Cookie e arquivo Magic Cookie em computadores</p><p>Macintosh.</p><p>3.2 Criando Cookies</p><p>Para criar um cookie é preciso instanciar a classe java,servlet.http.Cookie. Essa classe</p><p>fornece um tipo de construtor que recebe duas variáveis de tipo String, que representam</p><p>o nome e o valor do cookie, como mostrado no servlet exemplo a seguir:</p><p>public class CriandoCookieServlet extends HttpServlet {</p><p>public CriandoCookieServlet() {</p><p>super();</p><p>}</p><p>@Override</p><p>public void destroy(){</p><p>super.destroy();</p><p>}</p><p>@Override</p><p>protected void doGet(HttpServletRequest request, HttpServletResponse response)</p><p>throws ServletException, IOException {</p><p>//</p><p>Cookie meucookie = new Cookie("nome", "Jorge");</p><p>meucookie.setMaxAge(60);</p><p>meucookie.setSecure(false);</p><p>meucookie.setComment("Meu nome");</p><p>response.addCookie(meucookie);</p><p>String html = "<html><head>"+</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>20</p><p>"<title>Criando um Cookie</title>"+</p><p>"</head><body>"+</p><p>"<h2>Seu cookie foi criado com sucesso!</h2>"+</p><p>"<a href=\"VisualizaCookieServlet\">" +</p><p>"Clique aqui para ver o Cookie criado" +</p><p>"</a>"+</p><p>"</body></html>";</p><p>response.setContentType("text/html");</p><p>PrintWriter writer = response.getWriter( );</p><p>writer.print(html);</p><p>writer.close( );</p><p>}</p><p>@Override</p><p>public void init() throws ServletException{</p><p>super.init();</p><p>}</p><p>}</p><p>Arquivo CriandoCookieServlet,java</p><p>3.3 Recuperando um Cookie</p><p>Para recuperar um cookie pode ser usado o método getCookies() do objeto implícito</p><p>request. O servlet a seguir recupera o cookie criado anteriormente:</p><p>public class VisualizaCookieServlet extends HttpServlet {</p><p>public VisualizaCookieServlet() {</p><p>super();</p><p>}</p><p>@Override</p><p>public void destroy() {</p><p>super.destroy();</p><p>}</p><p>@Override</p><p>protected void doGet(HttpServletRequest request,</p><p>HttpServletResponse response)</p><p>throws ServletException, IOException {</p><p>Cookie listaCookies[] = request.getCookies( );</p><p>Cookie nome = null;</p><p>if (listaCookies != null) {</p><p>for (int i = 0 ; i < listaCookies.length ; i++) {</p><p>if (listaCookies[i].getName().equals("nome")) {</p><p>nome = listaCookies[i];</p><p>break;</p><p>}</p><p>}</p><p>}</p><p>String html = "<html><head>"+</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>21</p><p>"<title>Visualizando um Cookie</title>"+</p><p>"</head>"+</p><p>"<body>" +</p><p>"O Cookie chamado <strong>nome</strong> tem o valor: " +</p><p>"<strong>" + nome.getValue() + "</strong>"+</p><p>"</body></html>";</p><p>response.setContentType("text/html");</p><p>PrintWriter writer = response.getWriter( );</p><p>writer.print(html);</p><p>writer.close( );</p><p>}</p><p>@Override</p><p>public void init() throws ServletException{</p><p>super.init();</p><p>}</p><p>}</p><p>Arquivo VisualizaCookieServlet.java</p><p>O método getCookies() recupera os cookies encontrados.</p><p>3.4 Sessões</p><p>As sessões são largamente usadas em aplicações Web administrativas e também em</p><p>comercio eletrônico, as sessões carregam geralmente informações de uma página para</p><p>outra, usando ou não cookies.</p><p>A API de Servlet disponibiliza um módulo extremadamente útil no controle de</p><p>informações associadas ao usuário que acessa uma área restrita ou que necessita de</p><p>informações que sejam transmitidas de uma pagina para outra, conhecido como módulo</p><p>de gerenciamento de sessões de usuários.</p><p>Esse módulo funciona basicamente criando um identificador de sessão na primeira vez</p><p>que o usuário acessa a aplicação. A interface que representa a sessão de usuário é a</p><p>java.servlet.Http.HttpSession.</p><p>A partir dessa definição, o servidor procura fazer com que todas as requisições vindas</p><p>daquele usuário carreguem esse identificador de sessão, seja através de cookies, ou de</p><p>URLs (com informações adicionais de caminho) para que incorporem essa informação.</p><p>Dentro do servidor é estabelecido um objeto de sessão único e que somente pode ser</p><p>acessado pelo cliente que o chamou. Assim sendo, esses objetos de sessão não são</p><p>compartilhados entre cada usuário da aplicação.</p><p>public class SessionUmServlet extends HttpServlet {</p><p>public SessionUmServlet() {</p><p>super();</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>22</p><p>}</p><p>@Override</p><p>public void destroy() {</p><p>super.destroy();</p><p>}</p><p>@Override</p><p>protected void doGet(HttpServletRequest request,</p><p>HttpServletResponse response)</p><p>throws ServletException, IOException {</p><p>HttpSession sessao = request.getSession(true);</p><p>sessao.setAttribute("nome", "Jorge");</p><p>sessao.setMaxInactiveInterval(1);</p><p>String html = "<html><head>"+</p><p>"<title>Trabalhando com Sessão</title>"+</p><p>"</head>"+</p><p>"<body>" +</p><p>"Sua sessão foi criada com sucesso!<br />"+</p><p>"Sua ID é: <strong>" + sessao.getId( ) + "</strong><br />"+</p><p>"O tempo máximo de inatividade é: <strong>" +</p><p>sessao.getMaxInactiveInterval( ) +</p><p>"</strong> segundo(s)<br />"+</p><p>"<a href=\"SessionDoisSevlet\">Clique aqui</a>"+</p><p>" para ver a sessão na página seguinte."+</p><p>"</body></html>";</p><p>response.setContentType("text/html");</p><p>PrintWriter writer = response.getWriter( );</p><p>writer.print(html);</p><p>writer.close( );</p><p>}</p><p>@Override</p><p>public void init() throws ServletException {</p><p>super.init();</p><p>}</p><p>}</p><p>Arquivo SessionUmServlet.java</p><p>O método getSession(boolean b) retorna um objeto HttpSession associado com a atual</p><p>sessão de navegação do cliente. Esse método pode criar um objeto HttpSession</p><p>(argumento true) se ainda não existir um para o cliente.</p><p>O armazenamento de um objeto de sessão é feito pelo método setAttribute(String s,</p><p>Object o). No caso, o objeto de sessão chamado nome contem o valor de Jorge.</p><p>O método getID() captura o identificador dessa sessão. Quando for clicar para ir ao</p><p>segundo servlet criado, essa sessão será mantida, para que o nome criado nessa sessão</p><p>seja recuperado.</p><p>public class SessionDoisServlet extends HttpServlet {</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>23</p><p>public SessionDoisServlet() {</p><p>super();</p><p>}</p><p>@Override</p><p>public void destroy() {</p><p>super.destroy();</p><p>}</p><p>@Override</p><p>protected void doGet(HttpServletRequest request,</p><p>HttpServletResponse response)</p><p>throws ServletException, IOException {</p><p>HttpSession sessao = request.getSession(true);</p><p>String nome = (String)sessao.getAttribute("nome");</p><p>String html = "<html><head>"+</p><p>"<title>Trabalhando com Sessão</title>"+</p><p>"</head>"+</p><p>"<body>";</p><p>if(nome!=null){</p><p>html += "Sua ID é:<strong>" + sessao.getId( ) +</p><p>"</strong><br />"+</p><p>"E seu nome é: <strong>"+nome+"</strong><br />"+</p><p>"<a href=\"FecharSessaoServlet\">Clique aqui</a>"+</p><p>" para fechar a sessão";</p><p>}</p><p>else{</p><p>html += "Sua sessão não foi criada. <br />"+</p><p>"<a href=\"SessionUmServlet\">Clique aqui</a>"+</p><p>" para criar a sua sessão.";</p><p>}</p><p>html += "</body></html>";</p><p>response.setContentType("text/html");</p><p>PrintWriter writer = response.getWriter( );</p><p>writer.print(html);</p><p>writer.close( );</p><p>}</p><p>@Override</p><p>public void init() throws ServletException {</p><p>super.init();</p><p>}</p><p>}</p><p>Arquivo SessionDoisServlet.java</p><p>O servlet a seguir remove o valor do objeto de sessão chamado de nome</p><p>public class FecharSessionServlet extends HttpServlet {</p><p>public FecharSessionServlet() {</p><p>super();</p><p>}</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>24</p><p>@Override</p><p>public void destroy() {</p><p>super.destroy();</p><p>}</p><p>@Override</p><p>protected void doGet(HttpServletRequest request,</p><p>HttpServletResponse response)</p><p>throws ServletException, IOException {</p><p>HttpSession sessao = request.getSession(true);</p><p>// *** sessao.invalidate();</p><p>sessao.removeAttribute("nome");</p><p>String nome = (String)sessao.getAttribute("nome");</p><p>String html = "<html><head>"+</p><p>"<title>Terminando uma Sessão</title>"+</p><p>"</head>"+</p><p>"<body>"+</p><p>"Sua ID é:<strong>" + sessao.getId( ) +</p><p>"</strong><br />"+</p><p>"E seu nome é: <strong>"+nome+"</strong><br />"+</p><p>"<a href=\"SessionUmServlet\">Clique aqui</a>"+</p><p>" para iniciar uma nova sessão"+</p><p>"</body></html>";</p><p>response.setContentType("text/html");</p><p>PrintWriter writer = response.getWriter( );</p><p>writer.print(html);</p><p>writer.close( );</p><p>}</p><p>@Override</p><p>public void init() throws ServletException {</p><p>super.init();</p><p>}</p><p>}</p><p>Arquivo FecharSessionServlet.java</p><p>3.5 Gerenciando uma sessão</p><p>Pode-se controlar a expiração de uma sessão, obtendo um maior controle da aplicação</p><p>Web. Usando o método setMaxInactiveInterval(int i) se pode definir o tempo máximo</p><p>de inatividade na aplicação, em segundos. Com este método se pode capturar o tempo</p><p>dado como máximo de inatividade, em segundos.</p><p>Usando o método invalidate() permite que a sessão seja expirada explicitamente pela</p><p>aplicação.</p><p>3.6 URL Rewriting (Reescrita de URL)</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>25</p><p>Nesta abordagem, o Browser cliente concatena um Session ID único ao fim de cada</p><p>requisição que ele faz ao servidor. Este Session ID pode então ser lido, e a informação</p><p>apropriada ao usuário é recuperada. Esta é outra boa solução que funciona mesmo se o</p><p>usuário desabilitar o uso de Cookies. Contudo, existem dois problemas associados com</p><p>essa abordagem. Primeiro, o servidor deve assegurar que cada Session ID que ele</p><p>fornece seja único. Segundo, a aplicação completa deve ser escrita de forma que o</p><p>Session ID concatenado a todos os Links/URLs apontem para a aplicação.</p><p>Qualquer requisição que não inclua o Session ID não seria considerada parte da sessão e</p><p>não teria acesso às informações específicas da sessão.</p><p>4 FILTRAGEM DE SERVLET</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>26</p><p>Na maioria dos sistemas web é necessário o controle de acesso a algumas áreas da</p><p>aplicação, geração de logs, compactar dados, acessar banco de dados, etc., e podem ser</p><p>feitas usando filtros da API Servlet.</p><p>Um filtro é um componente Web que reside no servidor. Intercepta as requisições e</p><p>respostas no seu caminho até o servlet e de volta ao cliente. Sua existência é ignorada</p><p>por ambos. É totalmente transparente tanto para o cliente quanto para o servlet.</p><p>Ao utilizar filtros conseguimos separar de forma mais clara essas tarefas do resto da</p><p>aplicação, além de poder criar filtros genéricos, facilmente "plugáveis", e que poderão</p><p>ser utilizados em outros lugares sem a necessidade de se alterar nenhuma linha de</p><p>código.</p><p>4.1 Importância dos filtros em Servlet</p><p>Os filtros são importantes por varias razões:</p><p>• Fornecem a habilidade de encapsular os módulos e tornando estes em reusáveis</p><p>e modularizando o código, permitindo que estes sejam mais fácil de usar e</p><p>também de documentar, facilitando a eliminação de erros.</p><p>• os filtros podem ser usados para transformar a resposta de um servlet ou de uma</p><p>página de JSP.</p><p>Um filtro é um objeto que implementa a classe javax.servlet.Filter e define três</p><p>métodos:</p><p>O método init é chamado uma vez antes do filtro entrar em operação pela primeira vez.</p><p>Como parâmetro é passado um FilterConfig de onde se pode obter o nome do filtro, os</p><p>parâmetros de inicialização, e o ServletContext. O método destroy é chamado para</p><p>avisar o filtro que ele está sendo desativado, e possa liberar eventuais recursos alocados.</p><p>O método doFilter é onde é feito todo o processamento do filtro.</p><p>A sua estrutura básica é a seguinte:</p><p>void init(FilterConfig config) throws ServletException</p><p>void destroy()</p><p>void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws</p><p>IOException, ServletException {</p><p>//essa parte é executada antes do request chegar ao Servlet</p><p>chain.doFilter(request, response);</p><p>//essa parte é executada depois que o response já foi gerado pelo Servlet</p><p>}</p><p>No método doFilter, a primeira parte é executada antes de que o Servlet seja executado.</p><p>Então, a chamada chain.doFilter transfere o controle para o próximo filtro. A chamada</p><p>só retorna quando o Servlet já foi processado, e todo o código posterior a essa chamada</p><p>será executado. Como ao chamarmos chaind.doFilter passamos como parâmetro um</p><p>request e um response, podemos facilmente alterá-los, criando Wrappers em torno de</p><p>cada um deles</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>27</p><p>Vejamos um exemplo simples de filtro.</p><p>public class TimerFilter implements Filter {</p><p>private ServletContext context = null;</p><p>public void init(FilterConfig config) throws ServletException {</p><p>this.context = config.getServletContext();</p><p>}</p><p>public void destroy() {</p><p>//config = null;</p><p>}</p><p>public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)</p><p>throws IOException, ServletException {</p><p>long inicio = System.currentTimeMillis();</p><p>chain.doFilter(request, response);</p><p>long fim = System.currentTimeMillis();</p><p>String nome = "";</p><p>if (request instanceof HttpServletRequest) {</p><p>nome = ((HttpServletRequest)request).getRequestURI();</p><p>}</p><p>context.log(nome + ": " + (fim - inicio) + "ms");</p><p>}</p><p>}</p><p>arquivo TimerFilter.java</p><p>Esse Servlet bastante simples gera um log do tempo que cada requisição levou. Para ter</p><p>acesso ao log do Tomcat é preciso guardar o ServletContext, o que é feito no método</p><p>init. Vale ressaltar também que o request recebido pelo filtro não é um</p><p>HttpServletRequest, e portanto para conseguirmos a URL utilizada para chamar o</p><p>Servlet precisamos de um cast. Falta agora instalar esse filtro na aplicação (configurar).</p><p>Para isso precisamos declará-lo no arquivo web.xml, através da tag :</p><p><filter></p><p><filter-name>timerFilter</filter-name></p><p><filter-class>br.ufrj.cos.zavaleta.TimerFilter</filter-class></p><p></filter></p><p>Isso informa ao servidor que o filtro timerFilter é implementado pela classe</p><p>TimerFilter. Precisamos agora mapear para que tipos de URL desejamos aplicar esse</p><p>filtro. Isso é feito através da tag da seguinte forma:</p><p><filter-mapping></p><p><filter-name>timerFilter</filter-name></p><p><url-pattern>/meu_Servlet</url-pattern></p><p></filter-mapping></p><p>filtro que substitui um Servlet</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>28</p><p>Isso mapeia o filtro timerFilter para todas as URLs que comecem com meu_Servlet.</p><p>Este é o nome do servlet a ser usado, por exemplo, PostServlet e index.html, dos</p><p>exemplos.</p><p><filter-mapping></p><p><filter-name>timerFiltro</filter-name></p><p><servlet-name>/PostServlet</servlet-name></p><p></filter-mapping></p><p>filtro que intercepta um servlet</p><p>O exemplo é bastante simples, mas permite perceber o quanto poderosa é essa API. É</p><p>importante ressaltar que podemos plugar e remover filtros sem que os Servlets fiquem</p><p>sabendo disso , o que nos dá uma grande flexibilidade. Uma coisa com a qual devemos</p><p>sempre tomar cuidado é que um filtro não é um Servlet, e portanto não deve ser</p><p>responsável por gerar nenhum tipo de conteúdo, ele deve apenas filtrar os dados que</p><p>passam por ele. A seguir outro exemplo de Filtro</p><p>import java.io.IOException;</p><p>import java.util.logging.LogRecord;</p><p>import javax.servlet.Filter;</p><p>public class LoggingFilter implements Filter {</p><p>private FilterConfig config;</p><p>public void init(FilterConfig config) {</p><p>this.config = config;</p><p>}</p><p>public void doFilter(ServletRequest request, ServletResponse response,</p><p>FilterChain chain) throws ServletException, IOException {</p><p>// recupera o objeto ServletContext que sera usado para realizar o logging</p><p>ServletContext context = config.getServletContext();</p><p>// cria um registro da URL acessada pelo usuário</p><p>String logEntry = request.getServerName() + ":" + request.getServerPort();</p><p>logEntry += "/" + request.getLocalAddr() + "/" + request.getLocalName();</p><p>logEntry += "--> acessado pelo usuário em " + new java.util.Date();</p><p>// utilizando o recurso de logging disponível na classe ServletContext</p><p>context.log(logEntry);</p><p>// chama o próximo filtro na cadeia de filtros</p><p>chain.doFilter(request, response);</p><p>}</p><p>public void destroy() {}</p><p>public boolean isLoggable(LogRecord arg0) {</p><p>throw new UnsupportedOperationException("Not supported yet.");</p><p>}</p><p>}</p><p>filtro LoggingFilter.java</p><p><filter></p><p><filter-name>LoggingFilter</filter-name></p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>29</p><p><filter-class>br.ufrj.cos.zavaleta.LoggingFilter</filter-class></p><p></filter></p><p><filter-mapping></p><p><filter-name>LoggingFilter</filter-name></p><p><url-pattern>/*</url-pattern></p><p><dispatcher>REQUEST</dispatcher></p><p><dispatcher>INCLUDE</dispatcher></p><p></filter-mapping></p><p>Configuração para o arquivo web.xml</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>30</p><p>5 FUNDAMENTOS BÁSICOS DE JSP</p><p>A equipe da Sun desenvolveu uma tecnologia baseada em Servlets chamada de</p><p>JavaServer Pages (JSP). JSP são páginas Java embebidas em HTML. Dessa forma a</p><p>pagina dinâmica é gerada pelo código JSP. A primeira vez que uma página JSP é</p><p>carregada pelo container JSP, o código Java é compilado gerando um Servlet que é</p><p>executado. As chamadas subseqüentes são enviadas diretamente ao Servlet, não</p><p>havendo mais recopilação do código Java.</p><p>O JSP é uma tecnologia baseada em servlet usada na camada WEB para apresentar</p><p>conteúdo dinâmico e estático. Ela é baseada em texto e contém, em sua maioria, modelo</p><p>de texto em HTML misturado com tags que especificam conteúdo dinâmico.</p><p>Figura 5.1: Funcionamento de uma página JSP</p><p>O JSP deve ser usado por as seguintes razões:</p><p>• Considerando que JSP são documentos de texto como HTML, desenvolvedores</p><p>evitam ter que formatar e manipular uma String longa para produzir saída. O</p><p>conteúdo HTML não estará embutido dentro de código em Java. Isto torna mais</p><p>fácil sua manutenção.</p><p>• JSP são familiares para qualquer um com conhecimento de HTML, porque</p><p>possuem somente marcação dinâmica, isto é, tags. Isto torna possível para</p><p>projetistas de site criar o modelo HTML do site restando aos desenvolvedores</p><p>processando-o posteriormente a inclusão das tags para produzir o conteúdo</p><p>dinâmico. Isto torna fácil o desenvolvimento de páginas WEB.</p><p>• JSP têm suporte interno para o uso de componentes de software reusáveis</p><p>(JavaBeans). Estes não somente permitem que os desenvolvedores evitem</p><p>“reinventar a roda” para cada aplicação. Ter suporte para componentes de</p><p>software separados para manipular lógica promove separação de apresentação e</p><p>lógica de negócios também.</p><p>• JSP, como parte da solução Java para desenvolvimento de aplicação WEB, são</p><p>inerentemente multiplataforma e podem ser executadas em qualquer contêiner</p><p>compatível, independente do distribuidor ou sistema operacional.</p><p>• Devido ao modo como JSP funciona, não necessita de compilação explícita pelo</p><p>desenvolvedor. Esta compilação é feita pelo contêiner. Modificações na JSP é</p><p>também detectadas automaticamente e resultam em uma nova compilação. Isto</p><p>torna as páginas JSP relativamente simples de desenvolver.</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>31</p><p>• Usa Scripting e tags.</p><p>5.1 Convenções de tags</p><p>Uma tag em JSP tem a seguinte forma <% codigo_java %> e este código é chamado</p><p>de scriplet e pode ser inserido em qualquer parte da página JSP. Exemplo:</p><p><% String s="<h2>Este é um código JSP embebido no HTML</h2>";</p><p>out.write(s);</p><p>%></p><p>Os arquivos JSP, diferente do Servlet, não ficam dentro do diretório classes, em WEB-</p><p>INF, mas sim diretamente na raiz da aplicação. Observe também que o arquivo, embora</p><p>contenha código HTML, tem a extensão modificada para JSP.</p><p>Existem variáveis já implícitas no código jsp, onde todo arquivo jsp já possui uma</p><p>variável chamada out (do tipo JspWriter) que permite imprimir objetos através do</p><p>método write, print ou println:</p><p><% out.write(s); %></p><p>As tags mais comuns são:</p><p>• Comentário: <% -- comentário em JSP %></p><p>• Comentário: <% /* comentário de mais de uma linha */ %></p><p>• Declaração de atributos ou métodos: <%! %></p><p>• Expressão de um resultado: <%= %></p><p>• Tags personalizadas: <%@ taglib %></p><p>Exemplo de uso de uma tag personalizada:</p><p><% @taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %></p><p>onde uri é o nome definido no arquivo TLD (TAG LIBRARY DESCRIPTOR) ( é o</p><p>mecanismo que liga o código de uma tag à página JSP. Um arquivo TLD é um arquivo</p><p>XML geralmente localizado no diretório WEB-INF da aplicação web) e prefix é o</p><p>nome da tag que será utilizada na página JSP.</p><p>5.2 Componentes de uma página JavaServer Page</p><p>O JSP esta composto de tags HTML e tags JSP. Como as páginas JSP são códigos Java</p><p>embebidos em páginas HTML, se pode definir o local onde se deseja colocar o código.</p><p>O JSP esta composto por:</p><p>• Diretivas</p><p>• Declarações</p><p>• Scriptlets</p><p>• Comentários</p><p>• Expressões</p><p>5.2.1 Diretivas</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>32</p><p>As diretivas são usadas para fornecer informações especiais ditas ao container sobre</p><p>uma página JSP quando esta é compilada para servlet. A sintaxe de uma diretiva é:</p><p><%@ diretiva diretiva-atributo-nome = valor %></p><p>Existem três tipos de diretivas principais:</p><p>• page: permite importação de classes, customização de superclasses servlet entre</p><p>outras.</p><p>• include: permite que um conteúdo seja inserido de um arquivo no servlet.</p><p>• taglib: permite que o ambiente JSP importe uma determinada biblioteca de tags.</p><p>Para cada um desses tipos de diretivas, existem conjuntos de atributos específicos</p><p>utilizados para parametrizar a diretiva.</p><p>1. Diretiva Page. Esta diretiva serve para definir diretivas da página. Esta diretiva tem</p><p>a seguinte sintaxe: <% @page %> e os atributos mais usados são:</p><p> language = "java" - Especifica a linguagem que está sendo usada.</p><p> extends = "pacote.classe" - Define a super classe do servlet por herança.</p><p> import = "pacote.classe.*" - Pacote que deve ser importado.</p><p> session = "true|false" - Permite ou não variáveis de sessão.</p><p> buffer = "none | 10kb" - Tamanho do buffer em KB para o jspWriter out. O</p><p>buffer padrão é definido pelo servidor.</p><p> info = "mensagem" - Define uma string que pode ser recuperada pelo método</p><p>getServletInfo(). Com este atributo o desenvolvedor pode adicionar uma</p><p>documentação à página que resume sua funcionalidade.</p><p> errorPage = "erro.jps" - Define a página de erro no qual será desviado caso</p><p>isto ocorra.</p><p> isErrorPage = "true|false" - Define se é uma página de controle de erro.</p><p> contentType = "text/html" - Informações sobre a página, o MIME type de</p><p>documento.</p><p> pageEncoding = "ISO-8859-1" - Define o conjunto de caracteres para a página</p><p>JSP.</p><p> autoFlush ="true|false" - O valor true (padrão) indica se o buffer deve ser</p><p>esvaziado quando estiver cheio. Em false, indica que uma exceção deve ser</p><p>mostrada quando ocorrer overflows.</p><p> Exemplo: data.jsp</p><p><%@page language ="java"</p><p>contentType="text/html"</p><p>pageEncoding="UTF-8"</p><p>info="Escrito por Jorge Zavaleta"</p><p>import="java.util.*"</p><p>import="java.text.SimpleDateFormat"</p><p>%></p><p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</p><p>"http://www.w3.org/TR/html4/loose.dtd"></p><p><html></p><p><head></p><p><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></p><p><title>Usando a Diretiva Page</title></p><p></head></p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>33</p><p><body></p><p><h1>Usando a Diretiva Page</h1></p><p><%</p><p>Date hoje = new Date();</p><p>SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yy");</p><p>%></p><p>A data de hoje é <strong><%= formato.format(hoje) %></strong></p><p></body></p><p></html></p><p>2. Diretiva include. A diretiva include permite que sejam incluídos arquivos na hora</p><p>em que a página JSP é compilada em Servlet. Sua sintaxe é:</p><p><%@ include file=”topo.html” %></p><p>Para exemplificar essa diretiva, você irá criar três páginas: DiretivaInclude.jsp,</p><p>cabecalho.html, rodape.html.</p><p><h1 style="color:red;background-color:#EEEEEE"></p><p>Pagina de Jorge Zavaleta</p><p></h1></p><p>Arquivo cabecalho.html</p><p><center></p><p><strong>Todos os direitos Reservados, 2011. Rio de Janeiro</strong></p><p></center></p><p>Arquivo rodape.html</p><p><%@page language="java" contentType="text/html" pageEncoding="ISO-8859-1"%></p><p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</p><p>"http://www.w3.org/TR/html4/loose.dtd"></p><p><html></p><p><head></p><p><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></p><p><title>Usando Diretiva Include</title></p><p></head></p><p><body></p><p><h1>Usando a Diretiva Include</h1></p><p><%@include file="cabecalho.html" %></p><p><h2>Aqui deve estar o conteúdo da página</h2></p><p><%@include file="rodape.html" %></p><p></body></p><p></html></p><p>Arquivo DiretivaInclude.jsp</p><p>3. Diretiva taglib. As tags personalizadas ou customizadas são comuns no</p><p>desenvolvimento de páginas dinâmicas escritas em Java. Existem dois tipos de tags</p><p>que podem ser chamadas de Tags Clássicas e Tags Simples. O objetivo do exemplo</p><p>a seguir é criar uma tag básica com a finalidade de apresentar o desenvolvimento de</p><p>uma taglib personalizada. Esse exemplo utilizará uma Tag Clássica, e é necessário</p><p>principalmente porque envolve uma série de detalhes com a construção que o</p><p>ajudará a entender melhor sua aplicabilidade.</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>34</p><p>A tag resultante simplesmente imprime uma frase: " Criando uma TagLib" como</p><p>resultado de uma página HTML.</p><p>public class CriandoTagLibs extends TagSupport{</p><p>@Override</p><p>public int doStartTag() throws JspException{</p><p>try{</p><p>pageContext.getOut().print("Criando uma TagLib");</p><p>} catch(IOException e){</p><p>throw new JspException("Erro: JspException");</p><p>}</p><p>return SKIP_BODY;</p><p>}</p><p>}</p><p>CriandoTagLibs.java</p><p>A classe abstrata TagSupport é parte das APIs de tags JSP e define todos os</p><p>métodos que o JSP precisa em tempo de execução para chegar à funcionalidade da tag.</p><p>O método publico doSatartTag() é chamado em tempo de execução para trazer as tags</p><p>personalizadas. A tag quando chamada irá imprimir na tela a mensagem "Criando uma</p><p>TagLib" para o usuário, usando o método print de pageContext.</p><p>Em caso de erro, uma IOException é disparada. O retorno da constante</p><p>SKIP_BODY é necessário, como exigido pelo método, para que diga ao runtime como</p><p>proceder quando encontrar a tag.</p><p>O descritor da Biblioteca de Tags (TLD - Tag Library Descriptor). Depois de</p><p>compilado, a classe esta dentro do diretório classes no pacote (br.estacio.si.ai.xx),</p><p>chamado de CriandoTagLibs em WEB-INF.</p><p>Dentro desse mesmo diretório, WEB-INF, deve-se criar outro diretório chamado de tld,</p><p>e adicionar o arquivo mostrado a seguir, dentro dele com a extensão .tld:</p><p><?xml version="1.0" encoding="UTF-8"?></p><p><taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"</p><p>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</p><p>xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-</p><p>jsptaglibrary_2_1.xsd"></p><p><tlib-version>1.0</tlib-version></p><p><short-name>trabcomtaglib</short-name></p><p><uri>/WEB-INF/TagLib/tld/TrabComTagLib</uri></p><p><tag></p><p><name>Frase</name></p><p><tag-class>br.ufrj.cos.zavaleta.CriandoTagLibs</tag-class></p><p><body-content>empty</body-content></p><p><info>Criando TagLibs personalizadas</info></p><p></tag></p><p></taglib></p><p>TrabComTabLib.tld</p><p><uri /> : Define o nome para referencia da taglib.</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>35</p><p><name /> : Define o nome para o elemento que será chamado pela página JSP para</p><p>imprimir na página o conteúdo desenvolvido na classe</p><p>CriandoTagLibs.java.</p><p><tag-class />: Define o caminho para a classe criada, onde se encontra a tag</p><p>personalizada.</p><p><body-content />: Determina que sua tag personalizada não tenha um corpo.</p><p>Utilizando a TagLib numa Aplicação. Depois de desenvolvido e configurado o TLD,</p><p>precisa configurar o seu deployment descriptor (web.xml) para que seja possível rodar</p><p>a aplicação utilizando a tag personalzada.</p><p><web-app .....></p><p><welcome-file-list></p><p><welcome-file>UtilizandoTagPers.jsp</welcome-file></p><p>...</p><p></welcome-file-list></p><p><taglib></p><p><taglib-uri>TrabComTagLib</taglib-uri></p><p><taglib-location>/WEB-INF/TagLib/tld/TrabComTagLib.tld</taglib-location></p><p></taglib></p><p></web-app></p><p>parte do arquivo web.xml</p><p>No deployment descriptor da sua aplicação, é obrigatório colocar o elemento <taglib /></p><p>envolvendo os elementos:</p><p><taglib-uri />: aqui deve ser adicionado o mesmo nome dado pelo elemento <uri /></p><p>definido no TLD TrabComTabLib.tld.</p><p><taglib-location />: aqui se define o local onde se encontra o arquivo TLD criado.</p><p>Utilizando a Tag personalizada em uma Página JSP. Depois de desenvolvido e</p><p>configurado, agora só precisa chamar essa tag personalizada. Para chamar use a página</p><p>JSP a seguir:</p><p><%@ taglib uri="TrabComTagLib" prefix="jsps"%></p><p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</p><p>"http://www.w3.org/TR/html4/loose.dtd"></p><p><html></p><p><head></p><p><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></p><p><title>Trabalhando com TagLibs Personalizadas</title></p><p></head></p><p><body></p><p><h1>Trabalhando com TagLibs Personalizadas</h1></p><p><h3> <jsps:Frase /> </h3></p><p></body></p><p></html></p><p>UtulizandoTagPers.jsp</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>36</p><p>A diretiva taglib entra em ação, onde se utiliza o atributo uri necessário para chamar à</p><p>tag personalizada. No elemento prefix, se define o nome de um prefixo que será</p><p>colocado na chamada a tag personalizada. O nome foi definido no TLD</p><p>TrabComTabLib.tld no elemento <name />.</p><p>5.3 Elementos de Scripting</p><p>As páginas JSP devem ser vistas como documentos HTML ou XML com scripts JSP</p><p>embutido. Elementos de scripting JSP permitem inserir instruções Java na classe Servlet</p><p>gerada a partir da página JSP. A forma mais simples de se criar uma JSP dinâmica é</p><p>inserir diretamente elementos de scripting no modelo de dados. Os elementos de</p><p>scripting JSP são: Declarações. Expressões, e Scriptlets.</p><p>5.3.1 Declarações</p><p>Declarações permitem definir métodos ou variáveis. Elas possuem o seguinte formato:</p><p><%! Código Java %></p><p>Declarações são usadas para embutir código de modo semelhante aos scriptlets. No</p><p>entanto, declarações são inseridas na parte principal (main body) da classe Servlet, fora</p><p>do método _jspService() que processa a requisição. Por essa razão, os códigos</p><p>embutidos em declarações podem ser usados para declarar métodos ou variáveis</p><p>globais. Por outro lado, código das declarações NÃO são protegidos, a não ser que seja</p><p>explicitamente programado pelo desenvolvedor da JSP, logo devemos tomar cuidado ao</p><p>escrever declarações.</p><p>A seguir temos alguns lembretes simples sobre a utilização da utilização da tag de</p><p>declaração:</p><p>• Antes da declaração deve ter <%! e ao final da declaração %></p><p>• As instruções devem seguir a sintaxe Java padrão</p><p>• Declarações não geram saídas, mas usadas com expressões JSP ou scriptlets</p><p>Como declarações não geram qualquer saída, elas são normalmente usadas em conjunto</p><p>com expressões JSP ou scriptlets. Por exemplo, a seguir temos uma JSP que imprime o</p><p>número de vezes que a página corrente foi requisitada desde que o servidor foi iniciado</p><p>(ou a classe servlet foi mudada ou recarregada):</p><p><%! private int accessCount = 0; %></p><p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</p><p>"http://www.w3.org/TR/html4/loose.dtd"></p><p><html></p><p><head></p><p><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></p><p><title>Scriptlet de declaração</title></p><p></head></p><p><body></p><p><h1>Scripts: Declaração</h1></p><p><% accessCount++;%></p><p>Acesso a página desde o reinicio do servidor:</p><p><%= accessCount %></p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>37</p><p></body></p><p></html></p><p>AccessCountDeclaration.jsp</p><p>A JSP é capaz de mostrar o número de visitas através da declaração de uma atributo</p><p>com escopo na classe accessCount, utilizando um scriptlet para incrementar o valor do</p><p>número de vezes que a página foi visitada e uma expressão para mostrar o valor.</p><p>O estilo XML para a tag <%! Instruções Java %> é</p><p><jsp:declaration></p><p>Código Java;</p><p></jsp:declaration></p><p>5.3.2 Expressões</p><p>Expressões fornecem uma maneira de inserir valores Java diretamente na saída. Elas</p><p>têm a seguinte forma:</p><p><%= Expressão Java %></p><p>Expressões nada mais são do que uma abreviação para out.println(). Note que o ponto-</p><p>e-vírgula ( ; ) não aparece no final da instrução dentro da tag. Qualquer expressão Java</p><p>colocada entre <%= e %> é avaliada em tempo de execução, convertida para String e</p><p>inserida na página. Uma expressão sempre envia uma String de texto para o cliente, mas</p><p>o objeto produzido como resultado da expressão não necessariamente será uma</p><p>instância do objeto String. Todas as instâncias de objetos não-String são convertidos</p><p>para strings através de seus métodos membros herdados toString(). Se o resultado for</p><p>primitivo, então uma representação String do valor primitivo será mostrada.</p><p>Como mencionado anteriormente, avaliações são efetuadas em tempo de execução</p><p>(quando a página é requisitada). Isso dá às expressões acesso total às informações sobre</p><p>a requisição (request).</p><p>Diversos objetos predefinidos estão disponíveis para os desenvolvedores de JSP para</p><p>simplificar expressões. Esses objetos são chamados de objetos implícitos e serão</p><p>discutidos em maiores detalhes posteriormente. Para o propósito das expressões, as mais</p><p>importantes são:</p><p>• requisição (request), o HttpServletRequest;</p><p>• resposta (response), o HttpServletResponse;</p><p>• sessão (session), o HttpSession associado com à requisição (se houver); e</p><p>• saída (out), o PrintWriter (uma versão armazenada do tipo JspWriter) utilizado</p><p>para enviar dados de saída para o cliente.</p><p>Por exemplo, para imprimir o nome da máquina (hostname), só precisamos incluir essa</p><p>simples expressão JSP abaixo:</p><p>Nome da Máquina: <%= request.getRemoteHost() %></p><p>O estilo XML para a tag <%= Expressão Java %> é:</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>38</p><p><jsp:expression></p><p>Expressão Java</p><p></jsp:expression></p><p>5.3.3 Scriplets</p><p>Proporcionam uma maneira de inserir diretamente pedaços de instruções Java em</p><p>diferentes partes da modelo de dados e tem a seguinte forma:</p><p><% Instruções Java; %></p><p>Definir instruções Java entre <% e %> é o mesmo que estar codificando dentro de um</p><p>método. Scriptlets são úteis para embutir instruções Java como comandos condicionais,</p><p>de repetição, entre outros. Não existe um limite específico sobre a complexidade das</p><p>instruções Java que podem ser inseridas em scriptlets. No entanto, devemos ter grande</p><p>precaução a utilização exagerada de scriptlets. Colocar processos computacionais</p><p>pesados dentro de códigos scriptlets gera um problema para manutenção. Além disso, o</p><p>excesso de utilização de scriptlets viola a regra de JSP de ser prioritariamente um</p><p>componente da camada de apresentação.</p><p>Discutiremos mais adiante como poderemos utilizar JavaBeans para encapsular o</p><p>resultado de dados passados por outro componente, reduzindo drasticamente a</p><p>quantidade de scriptlets necessários em uma página. Mais adiante, iremos discutir como</p><p>utilizar tags customizadas para executar tarefas comuns como decisão lógica, repetição,</p><p>entre outras. Isso, combinado com a utilização dos JavaBeans, desta forma iremos</p><p>diminuir a necessidade de scriptlet.</p><p>Se quisermos utilizar os caracteres "%>" dentro de um scriptlet, escrevemos "%\>" .</p><p>Isso evitará que o compilador interprete os caracteres como tag de fechamento de</p><p>scriptlet. A seguir temos dois exemplos que definem códigos Java dentro de tags</p><p>HTML. O comando println em Scriplet:</p><p><%@page contentType="text/html" pageEncoding="UTF-8"%></p><p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</p><p>"http://www.w3.org/TR/html4/loose.dtd"></p><p><html></p><p><head></p><p><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></p><p><title>Exemplo de Escriplet</title></p><p></head></p><p><body></p><p><h1>Um Scriplet</h1></p><p><%</p><p>String username = "Jorge";</p><p>out.println(username);</p><p>%></p><p></body></p><p></html></p><p>PrintlnScriplet.jsp</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>39</p><p>O exemplo mostra a implementação de instruções Java embutidas em uma página JSP.</p><p>Esta página escreve o texto contido no atributo username no navegador WEB. O</p><p>comando for em scriptlet:</p><p><%@page contentType="text/html" pageEncoding="UTF-8"%></p><p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"</p><p>"http://www.w3.org/TR/html4/loose.dtd"></p><p><html></p><p><head></p><p><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></p><p><title>Exemplo de Scriplet</title></p><p></head></p><p><body></p><p><h1>Exemplo de Scriplet</h1></p><p><% for(int i=0; i<10;i++){ %></p><p>Esta linha é impressa 10 vezes ...</p><p><br/></p><p><% } %></p><p></body></p><p></html></p><p>LoopScriplet.jsp</p><p>Este outro exemplo mostra a implementação do código Java de um laço for inserido</p><p>dentro das tags de scriptlet (<%...%>). A saída que teremos no navegador após a</p><p>execução dessas JSP deve ser o texto “Esta linha é impressa 10 vezes ...” mostrado 10</p><p>vezes devido a iteração do comando for de 0 até 9.</p><p>Note que o scriptlet não é enviado para o cliente, apenas sua saída. Tente ver o código</p><p>da saída do JSP que foi produzida no browser para entender esse ponto. Tudo o que</p><p>vemos são tags HTML mais a saída do scriptlet mas não vemos o scriptlet.</p><p>O estilo XML para escrever scriptlets é:</p><p><jsp:declaration></p><p>Código Java;</p><p></jsp:declaration></p><p>5.3.4 Objetos predefinidos</p><p>Os objetos JSP implícitos são automaticamente declarados pelo contêiner e estão</p><p>sempre disponíveis para utilização pelas expressões e scriptlets (mas não em</p><p>declarações). A seguir temos a lista de objetos implícitos:</p><p>• request: Instância da classe javax.servlet.http.HttpServletRequest, este objeto</p><p>é associado com a requisição do cliente.</p><p>• response: Instância da classe javax.servlet.http.HttpServletResponse, este</p><p>objeto é associado com a resposta para o cliente.</p><p>• pageContext: Objeto associado com a página corrente.</p><p>• out: Instância da classe javax.servlet.jsp.JspWriter, este objeto pode ser usado</p><p>para escrever ações e modelo dos dados em páginas JSP, parecido com objetos</p><p>da classe PrintWriter que utilizamos na discussão da Servlet. O objeto out é</p><p>inicializado automaticamente utilizando métodos de objetos da classe</p><p>PageContext.</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>40</p><p>• session: Instância da classe javax.servlet.http.HttpSession. É equivalente a</p><p>chamar o método HttpServletRequest.getSession().</p><p>• application: Instância da classe javax.servlet.ServletContext. É equivalente a</p><p>chamar o método getServletConfig().getContext(). Esse objeto implícito é</p><p>compartilhado por todos os Servlets e páginas JSP no servidor.</p><p>• config: Instância da classe javax.servlet.ServletConfig para essa página. Igual</p><p>as Servlets, JSP tem acesso aos parâmetros inicialmente definidos no</p><p>Deployment Descriptor do servidor de aplicação.</p><p>6 MODELOS DE COMPONENTES</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>41</p><p>Em toda aplicação, a parte do código mais sujeita a mudança é a porção da interface de</p><p>usuário. A interface é o aspecto mais visível ao usuário e com o qual o usuário interage.</p><p>Sendo assim, é o alvo mais provável de pedidos de mudança ou de melhorias da</p><p>usabilidade.</p><p>Ter sua lógica de negócio firmemente acoplada com a interface de usuário leva a</p><p>processos de alterações da interface mais complexos e sujeitos os erros. As mudanças a</p><p>uma parte têm o potencial de trazer consequências em cascata no restante da aplicação.</p><p>O padrão MVC fornece uma solução para este problema dividindo a aplicação nos</p><p>componentes Model, View e Controller, desacoplando estes de quaisquer outros ao</p><p>fornecer um conjunto de recomendações sobre suas interações.</p><p>O diagrama acima mostra os três componentes definidos pelo padrão MVC assim como</p><p>as suas interações previstas. Vamos analisar parte por parte.</p><p>6.1 MODEL</p><p>O padrão MVC define uma camada chamada Model que representa os dados usados</p><p>pela aplicação, assim como as operações de negócio associadas a eles. Definindo a</p><p>Model como uma camada separada, detalhes como recuperação, persistência e</p><p>manipulação dos dados são abstraídos do restante da aplicação.</p><p>Há diversos benefícios com este tipo de abordagem. Primeiramente, isto assegura que</p><p>os detalhes dos dados e das operações nos dados podem ser encontrados em uma área</p><p>bem definida (a Model) em vez de estarem dispersos na aplicação. Isto se prova</p><p>benéfico durante a fase de manutenção da aplicação. Em segundo lugar, tendo-se os</p><p>detalhes dos dados totalmente separados de qualquer implementação de interface, os</p><p>componentes da Model podem ser reaproveitados mais facilmente em outras aplicações</p><p>que necessitam de uma funcionalidade similar.</p><p>6.2 VIEW</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>42</p><p>Esta camada compreende todos os detalhes da implementação da interface de usuário.</p><p>Aqui os componentes gráficos fornecem as representações do estado interno da</p><p>aplicação e oferecem aos usuários as formas de interagir com a aplicação. Nenhuma</p><p>outra camada interage com o usuário, somente a View.</p><p>Ter uma camada View separada fornece diversos benefícios. Por exemplo, é mais fácil</p><p>incluir a presença de um grupo de design separado na equipe de desenvolvimento. Este</p><p>grupo de design pode se concentrar completamente no estilo, look & feel da aplicação</p><p>sem ter que se preocupar a respeito de outros detalhes.</p><p>Além disso, ter uma camada View separada torna possível fornecer múltiplas interfaces</p><p>à aplicação. Considerando que a funcionalidade do núcleo da aplicação encontra-se em</p><p>algum outro lugar (na Model), múltiplas interfaces podem ser criadas (baseadas no</p><p>Swing, baseadas na WEB, baseadas na console), todas podem ter diferentes look & feel</p><p>e todas podem simplesmente utilizar os componentes da Model com suas</p><p>funcionalidades.</p><p>6.3 CONTROLLER</p><p>Por último, a arquitetura MVC inclui a camada do componente Controller. Esta camada</p><p>contém detalhes sobre o fluxo de programa/transição da tela e é também responsável</p><p>por capturar os eventos gerados pelo usuário na camada View e, possivelmente,</p><p>atualizar os componentes da Model usando dados fornecidos pelo usuário.</p><p>Há diversos benefícios em se ter uma camada separada para a Controller. Primeiro,</p><p>tendo um componente da aplicação separado para conter os detalhes da transição de</p><p>tela, componentes da View podem ser projetados de maneira que não necessitem estar</p><p>cientes um do outro. Isto facilita a múltiplas equipes independentes de desenvolvimento</p><p>que trabalham simultaneamente. As interações entre os componentes da View são</p><p>abstraídas na Controller.</p><p>Segundo, tendo uma camada separada que atualize os componentes da Model, detalhes</p><p>são removidos da camada de apresentação. A camada de apresentação pode se</p><p>especializar em sua finalidade preliminar de apresentar dados ao usuário. Os detalhes de</p><p>como os dados do usuário mudam o estado da aplicação são escondidos dentro do</p><p>componente da Controller. Isto fornece uma separação limpa entre a lógica de</p><p>apresentação e a lógica de negócio.</p><p>Não podemos afirmar que o padrão MVC possua somente benefícios e nenhum efeito</p><p>colateral. Dividir a aplicação em três componentes separados resulta em aumento de</p><p>complexidade. Para pequenas aplicações que não se beneficiam do acoplamento fraco</p><p>da Model, pode ser excessivo o uso deste padrão. Entretanto, é melhor lembrar que as</p><p>aplicações frequentemente começam pequenas e tornam-se sistemas complexos. Assim,</p><p>deve-se sempre buscar o acoplamento fraco.</p><p>6.4 JAVABEANS EM JSP</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>43</p><p>O uso dos JavaBeans em JSP não é definido pela especificação JSP. Entretanto,</p><p>provêem funcionalidades interessantes. O uso de JavaBeans tem reduzido bastante a</p><p>quantidade de elementos encontrados nas páginas JSP.</p><p>O JavaBeans são simplesmente classes Java que seguem um determinado padrão de</p><p>codificação:</p><p>• por padrão, provê um construtor sem argumentos</p><p>• possui exclusivamente métodos gets e sets</p><p>Um exemplo de JavaBean é demonstrado a seguir:</p><p>public class User {</p><p>private String name;</p><p>private String address;</p><p>private String contactNo;</p><p>public User() { }</p><p>public String getName() {</p><p>return name;</p><p>}</p><p>public void setName(String name) {</p><p>this.name = name;</p><p>}</p><p>public String getAddress() {</p><p>return address;</p><p>}</p><p>public void setAddress(String address) {</p><p>this.address = address;</p><p>}</p><p>public String getContactNo() {</p><p>return contactNo;</p><p>}</p><p>public void setContactNo(String contactNo) {</p><p>this.contactNo = contactNo;</p><p>}</p><p>}//end user</p><p>6.4.1 Como são usados os JavaBeans em JSP?</p><p>Como um objeto de transferência de dados – JavaBeans são amplamente utilizados em</p><p>páginas JSP como objeto de transferência de dados. Em muitas aplicações os processos</p><p>são executados em uma Servlet, não em um JSP. Só os resultados do transcurso são</p><p>passados para o JSP na forma de um ou mais JavaBeans.</p><p>Como um objeto auxiliar - Em algumas aplicações menores não é eficiente ter um</p><p>servlet separado para processar os dados. Neste caso, é melhor colocar a funcionalidade</p><p>dentro de um JavaBean.</p><p>6.4.2 JavaBeans relacionados com ações de JSP</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>44</p><p>JSP define ações padrão que simplificam o uso de JavaBeans.</p><p><jsp:useBean></p><p>Para usar um componente JavaBean, deve-se habilitar seu uso por instanciação, o qual</p><p>pode feito por intermédio das ações abaixo:</p><p>Os atributos das ações <jsp:useBean> são as seguintes:</p><p>• id – especifica o nome do bean e como ele será referenciado na página.</p><p>• scope – especifica a região na qual se pode armazenar uma instância do</p><p>JavaBean. Pode ser anexado à página (page), à sessão (session), à requisição</p><p>(request), ou à aplicação (application).</p><p>• class – especifica o nome da classe Java na qual o JavaBean é criado. Se foi</p><p>especificado o nome do JavaBean não será preciso especificar a classe.</p><p>• beanName – Especifica o nome do bean que está armazenado no servidor.</p><p>Refira-se a este atributo como a uma classe (por exemplo,</p><p>com.projectalpha.PowerBean). Se especificado o atributo class, não é necessário</p><p>especificar este atributo.</p><p>• type - especifica o tipo de variável de scripting devolvido pelo bean. O tipo tem</p><p>que se relacionar à classe do bean.</p><p>A seguir, um exemplo de como usar um JavaBean em uma pagina JSP:</p><p><jsp:useBean id="usuario" scope="session" class="br.ufrj.cos.ufrj.zavaleta.User"/></p><p>Quando a página encontra uma ação useBean, primeiro tentará verificar se já existe uma</p><p>instância do JavaBean deste tipo determinado com a determinada extensão. Caso não</p><p>exista, o contêiner automaticamente cria uma nova instância do JavaBean usando o</p><p>construtor padrão sem argumentos. Colocando o JavaBean no escopo determinado.</p><p>Caso a funcionalidade anterior seja expressada como um scriptlet, se pareceria com:</p><p><%</p><p>usuario.setNome("Zavaleta");</p><p>usuario.setEndereco("Gloria-RJ");</p><p>%></p><p>Uma vez que o JavaBean tenha sido habilitado usando a ação jsp:useBean, pode ser</p><p>usado dentro da pagina JSP como qualquer instância de objeto, apenas usando o nome</p><p>especificado no atributo id. Vejamos o seguinte exemplo:</p><p><body></p><p><jsp:useBean id="usuario" scope="session" class="br.ufrj.cos.zavaleta.Usuario"/></p><p><strong></p><p><%</p><p>usuario.setNome("Zavaleta");</p><p>usuario.setEndereco("Gloria-RJ");</p><p>%></p><p></strong></p><p><br /></p><p>Oi, <strong> <%= usuario.getNome() %> </strong>, tudo bem com vc?<br /></p><p>Você mora no Bairro da <%= usuario.getEndereco() %></p><p><br /></p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>45</p><p></body></p><p>Esta ação retorna o valor de uma propriedade específica dentro de um JavaBean e</p><p>retorna imediatamente ao fluxo de resposta. Esta ação possui dois atributos:</p><p>• name – Nome do JavaBean cuja propriedade será retornada. Ela deve possuir o</p><p>mesmo valor do atributo id usado na ação anterior <jsp:useBean></p><p>• property – Nome da propriedade cujo valor será retornado.</p><p>Se o desenvolvedor desejar recuperar o valor de uma propriedade de JavaBean sem</p><p>colocar isto imediatamente no fluxo de saída, não se terá outra escolha a não ser fazer</p><p>uso de scriptlet ou expressão.</p><p>Seguindo os exemplos anteriores, para exibir a propriedade name através do JavaBean,</p><p>faz-se uso da ação getProperty da seguinte forma:</p><p><jsp:getProperty name=”usuario” property=”name”/></p><p><jsp:setProperty></p><p>Esta ação permite aos desenvolvedores atribuir valores a propriedades do JavaBean sem</p><p>que seja necessário escrever uma linha de código no scriptlet.</p><p>Esta ação possui os mesmos atributos da ação getProperty e dois adicionais:</p><p>• value – Valor que deve ser atribuído à propriedade. Pode ser um valor estático</p><p>ou uma expressão avaliada durante a execução.</p><p>• param – Especifica o parâmetro de requisição pelo qual a propriedade irá</p><p>retornar.</p><p>O desenvolvedor que faz uso desta ação da seguinte forma: deve especificar o valor, ou</p><p>o atributo de param, mas, ao incluir ambos os atributos na ação, irá causar uma exceção.</p><p><%@page language = “java” contentType=”text/html” pageEncoding=”ISO-8859-1”%></p><p><!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”</p><p>“http://www.w3.org/TR/html4/loose.dtd”></p><p><html></p><p><head></p><p><meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8”></p><p><title>Usando um Bean Dinámico</title></p><p></head></p><p><body></p><p><h1>Usando um Bean Dinámico</h1></p><p><jsp:useBean id=”dinamico” class=”br.ufrj.cos.zavaleta.BeanDinamico”/></p><p><jsp:setProperty name=”dinamico” property=”*”/></p><p>Seu nome é</p><p><strong></p><p><jsp:getProperty name=”dinamico” property=”nome” /></p><p></strong></p><p><form method=”post” action=”beandinamico.jsp”></p><p>Nome:<input type=”text” size=”20” name=”nome” /><br /></p><p><input type=”submit” name=”submit” value=”Enviar”></p><p></form></p><p></body></p><p></html></p><p>BeanDinamico.jsp</p>
<p>INFO500 - Ambientes de Internet</p><p>© Jorge Zavaleta, 2012 zavaleta.jorge@gmail.com</p><p>46</p><p>7. CONEXÃO DE BANCO DE DADOS COM JDBC</p><p>Trabalhar com Banco de Dados (BD) é comum no desenvolvimento de</p><p>aplicações Web. Estas aplicações usam Servlets e paginas JSP. Existem atualmente</p><p>dezenas de BDs no mercado. Os mais populares são o Oracle, MySQL, SQL Server,</p><p>PostgreSQL, DB2, Interbase, Firebird. Todos eles são baseados no conceito relacional</p><p>de dados.</p><p>7.1 INTRODUÇÃO A JDBC</p><p>JDBC é uma API incluída dentro da linguagem Java para o acesso a BD.</p><p>Consistem em um conjunto de classes e interfaces escritas em Java que oferecem uma</p><p>completa API para a programação com BD, solução 100% Java e independente de</p><p>plataforma. Uma mesma aplicação escrita utilizando JDBC poderá trabalhar com</p><p>qualquer BD, para que isso aconteça, basta alterar o JDBC referente ao BD usado e o</p><p>seu sistema passará a se comunicar com o BD configurado.</p><p>7.2 MySQL E JDBC</p><p>Sendo um sistema de gerenciamento de BD mais usados do mundo, sua</p><p>velocidade e capacidade de ser multiplataforma só poderiam chamar a atenção de quem</p><p>desenvolve em Java. O driver JDBC usado para realizar os exemplos é o Connector/J.</p><p>Usando o driver Connnector/J, todos os tipos de aplicações de Java podem acessar um</p><p>BD.</p><p>7.3 MySQL NO WINDOWS</p><p>Pode ser utilizado o comando pelo “promt” no Windows para inicializar o serviço do</p><p>MySQL.</p><p>1. Para iniciar o serviço</p><p>net start mysql</p><p>Para parar o serviço</p><p>net stop mysql</p><p>Acessando o Banco de Dados MySQL</p><p>mysql –u root –p</p><p>Pedido de senha</p><p>password</p><p>2. Criando o Banco de dados:</p><p>CREATE DATABASE livraria;</p>

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?
Você viu 1, do total de 81 páginas