Alfamídia Programação: Java Web - PDF
Download "Alfamídia Programação: Java Web"
Bernadete Cabreira Farias
2 Todos os direitos reservados para Alfamídia Prow AVISO DE RESPONSABILIDADE As informações contidas neste material de treinamento são distribuídas NO ESTADO EM QUE SE ENCONTRAM, sem qualquer garantia, expressa ou implícita. Embora todas as precauções tenham sido tomadas na preparação deste material, a Alfamídia Prow não tem qualquer responsabilidade sobre qualquer pessoa ou entidade com respeito à responsabilidade, perda ou danos causados, ou alegadamente causados, direta ou indiretamente, pelas instruções contidas neste material ou pelo software de computador e produtos de hardware aqui descritos. 03/2013 Versão 1.0 Alfamídia Prow 2
3 Instalação Passo-a-Passo do Tomcat 5 em Windows... 4 Servlets e JSP Servlets Applats e Servlets CGI X Servlets A API Servlet Exemplo de Servlet Compilando o Servlet Criando uma aplicação no Tomcat Invocando diretamente pelo Navegador Invocando em uma página HTML Diferenças entre as requisições GET e POST Concorrência Obtendo Informações sobre a Requisição Lidando com Formulários
4 Instalação Passo-a-Passo do Tomcat 5 em Windows As etapas e ilustrações a seguir se baseiam na versão Versões futuras podem, obviamente, apresentar alterações no processo de instalação. 1. Inicie o programa instalador. O assistente de instalação será iniciado. No diálogo de Boas-vindas, clique "Next". 2. Estando de acordo com os termos da licença do software, clique "I Agree" para prosseguir. O Tomcat é software aberto, de re-distribuição e uso (comercial ou não) livres e gratuitos. 4
5 3. Na escolha de componentes do software, o padrão é o tipo de instalação "Normal", que inclui, além do núcleo essencial (core) do Tomcat Servlet container, toda a documentação, exemplos de Servlet e JSP e os ícones no Menu Iniciar. Esta seleção é adequada para o uso geral. Na verdade, ficam de fora da instalação Normal apenas a ativação automática do Tomcat como serviço e o código-fonte do Tomcat. Este último só será de alguma utilidade se você pretender participar do projeto de desenvolvimento do Tomcat, ou ainda quiser conhecer a fundo os mecanismos de funcionamento e a implementação do Tomcat inspecionando suas fontes, e não apenas utilizá-lo. 5
6 A instalação do Tomcat 5 sempre cria um serviço do Windows (NT/2000/XP/2003) para o Tomcat. Na opção Normal, porém, o serviço é instalado com ativação manual. Se você preferir que o serviço do Tomcat seja automaticamente ativado sempre que o Windows for iniciado, basta expandir o componente "Tomcat" e selecionar o componente "Service", conforme mostrado a seguir, e o instalador já configurará isto por você. O tipo de instalação mudará para "Custom" (personalizada). De qualquer forma, o tipo de inicialização do serviço do Tomcat pode ser facilmente alterado entre Manual ou Automático a qualquer tempo após a instalação, através da ferramenta administrativa de Serviços do Windows. Se você não tem familiaridade com a configuração de serviços do Windows, ou não estiver certo se deseja a inicialização automática do Tomcat como serviço, deixe a instalação como "Normal", inalterada. Para prosseguir, clique "Next". 6
7 4. A seguir, será confirmado o local de instalação do software. Confirme a pasta principal onde o Tomcat será instalado e clique "Next" para prosseguir. 7
8 5. O diálogo de Configuração permite definir duas opções administrativas do Tomcat: o porto de rede pelo qual o Tomcat atenderá as requisições HTTP, funcionando como um servidor web com o propósito de testes e administração do Tomcat, e o usuário e senha para o acesso à Administração do Tomcat. A menos que no computador já exista outro serviço simultâneo utilizando o porto padrão 8080 do Tomcat, é recomendável deixar o porto inalterado. Em especial, tenha muito cuidado se pretender modificar para o porto 80, que é o padrão para o protocolo HTTP e usado pelos servidores web como o Microsoft IIS e o Apache Web Server (httpd). Esta configuração pode ser alterada após a instalação, pelo arquivo de config do Tomcat. A senha do usuário administrativo do Tomcat (nome padrão "admin") pode ser deixada em branco, o que é plausível se esta instalação do Tomcat for apenas em uma estação de trabalho de desenvolvimento. Em um servidor, ou se o computador for acessível em uma rede (LAN interna ou Internet) e o Tomcat for ficar ativo constantemente, é recomendável definir um nome de usuário e senha personalizados, por segurança. 8
9 6. O instalador do Tomcat procura detectar uma versão de Java SDK (JDK) instalada, necessária para seu funcionamento. Neste diálogo Java Virtual Machine", você deve verificar com atenção se a pasta pré-selecionada pelo instalador corresponde ao local de instalação da versão de JDK instalada que você quer que o Tomcat utilize. Quando a variável de ambiente JAVA_HOME não está corretamente definida, o instalador do Tomcat 5 Windows costuma detectar erroneamente o JRE (Java Runtime, também instalado junto com o JDK), cuja localização padrão é similar a C:\Arquivos de programas\java\j2re1.4\, ao invés de detectar o SDK completo, normalmente localizado em algo como C:\j2sdk1.4\. Se for este o caso, altere a localização para informar o caminho correto do Java SDK (use o botão "..." para navegar nas pastas), caso contrário o Tomcat executará, mas não será capaz de efetuar a compilação dinâmica de páginas JSP novas/alteradas! 9
10 7. Completadas as informações solicitadas pelo assistente, clique "Install" e aguarde o término da instalação. 8. Ao término da instalação, o assistente dá a opções de executar o Tomcat e de visualizar o Leia-Me. 10
11 Note que a opção "Run" do instalador executa o tomcat como processo, e não como serviço, independente do que foi selecionado na instalação. 11
12 Servlets e JSP Servlets e JSP são duas tecnologias desenvolvidas pela Sun para desenvolvimento de aplicações na Web a partir de componentes Java que executem no lado servidor. Essas duas tecnologias fazem parte da plataforma J2EE (Java 2 Platform Enterprise Edition) que fornece um conjunto de tecnologias para o desenvolvimento de soluções escaláveis e robustas para a Web. Nesta apostila abordaremos apenas as tecnologias Servlets e JSP, sendo o suficiente para o desenvolvimento de sites dinâmicos de razoável complexidade. Se a aplicação exigir uma grande robustez e escalabilidade o leitor deve considerar o uso em conjunto de outras tecnologias da plataforma J2EE. 12
13 Servlets Servlets são classes Java que são instanciadas e executadas em associação com servidores Web, atendendo requisições realizadas por meio do protocolo HTTP. Ao serem acionados, os objetos Servlets podem enviar a resposta na forma de uma página HTML ou qualquer outro conteúdo MIME. Na verdade os Servlets podem trabalhar com vários tipos de servidores e não só servidores Web, uma vez que a API dos Servlets não assume nada a respeito do ambiente do servidor, sendo independentes de protocolos e plataformas. Em outras palavras Servlets é uma API para construção de componentes do lado servidor com o objetivo de fornecer um padrão para comunicação entre clientes e servidores. Os Servlets são tipicamente usados no desenvolvimento de sites dinâmicos. Sites dinâmicos são sites onde algumas de suas páginas são construídas no momento do atendimento de uma requisição HTTP. Assim é possível criar páginas com conteúdo variável, de acordo com o usuário, tempo, ou informações armazenadas em um banco de dados. Servlets não possuem interface gráfica e suas instâncias são executadas dentro de um ambiente Java denominado de Container. O container gerencia as instâncias dos Servlets e provê os serviços de rede necessários para as requisições e respostas. O container atua em associação com servidores Web recebendo as requisições reencaminhada por eles. Tipicamente existe apenas uma instância de cada Servlet, no entanto, o container pode criar vários threads de modo a permitir que uma única instância Servlet atenda mais de uma requisição simultaneamente A figura I-1 fornece uma visão do relacionamento destes componentes. Máquina Virtual Java Figura I-1. Relacionamento entre Servlets, container e servidor Web 13
14 Servlets provêem uma solução interessante para o relacionamento cliente/servidor na Internet, tornando-se uma alternativa para a implantação de sistemas para a Web. Antes de entrarmos em detalhes na construção de Servlets, compararemos esta solução com outras duas soluções possíveis para implantação de aplicações na Internet. 14
15 Applats e Servlets Apesar de ser uma solução robusta existem problemas no uso de Applets para validação de dados e envio para o servidor. O programador precisa contar com o fato do usuário possuir um navegador com suporte a Java e na versão apropriada. Você não pode contar com isso na Internet, principalmente se você deseja estender a um grande número de usuário o acesso às suas páginas. Em se tratando de Servlets, no lado do cliente pode existir apenas páginas HTML, evitando restrições de acesso às páginas. Em resumo, o uso de Applets não é recomendado para ambientes com múltiplos navegadores ou quando a semântica da aplicação possa ser expressa por componentes HTML. 15
16 CGI X Servlets Scripts CGI (Common Gateway Interface), acionam programas no servidor. O uso de CGI sobrecarrega o servidor uma vez cada requisição de serviço acarreta a execução de um programa executável (que pode ser escrito em com qualquer linguagem que suporte o padrão CGI) no servidor, além disso, todo o processamento é realizado pelo CGI no servidor. Se houver algum erro na entrada de dados o CGI tem que produzir uma página HTML explicando o problema. Já os Servlets são carregados apenas uma vez e como são executados de forma multithread podem atender mais de uma mesma solicitação por simultaneamente. Versões posteriores de CGI contornam este tipo de problema, mas permanecem outros como a falta de portabilidade e a insegurança na execução de código escrito em uma linguagem como C/C++ 16
17 A API Servlet A API Servlet é composta por um conjunto de interfaces e Classes. O componente mais básico da API é interface Servlet. Ela define o comportamento básico de um Servlet. A figura 1 mostra a interface Servlet. public interface Servlet { public void init(servletconfig config) throws ServletException; public ServletConfig getservletconfig(); public void service(servletrequest req, ServletResponse res) throws ServletException, IOException; public String getservletinfo(); } public void destroy(); Figura 1. Interface Servlet. O método service() é responsável pelo tratamento de todas das requisições dos clientes. Já os métodos init() e destroy() são chamados quando o Servlet é carregado e descarregado do container, respectivamente. O método getservletconfig() retorna um objeto ServletConfig que contém os parâmetros de inicialização do Servlet. O método getservletinfo() retorna um String contendo informações sobre o Servlet, como versão e autor. Tendo como base a interface Servlet o restante da API Servlet se organiza hierarquicamente como mostra a figura 2. Figura 2. Hierarquia de classes da API Servlet. A classe GenericServlet implementa um servidor genérico e geralmente não é usada. A classe HttpServlet é a mais utilizada e foi especialmente projetada para lidar com o protocolo HTTP. A figura 3 mostra a definição da classe interface HttpServlet. HttpServlet public abstract class HttpServlet extends GenericServlet implements java.io.serializable 17
18 Figura 3. Definição da classe HttpServlet. Note que a classe HttpServlet é uma classe abstrata. Para criar um Servlet que atenda requisições HTTP o programador deve criar uma classe derivada da HttpServlet e sobrescrever pelo menos um dos métodos abaixo: doget dopost doput dodelete Trata as requisições HTTP GET. Trata as requisições HTTP POST. Trata as requisições HTTP PUT. Trata as requisições HTTP DELETE. Tabela 1. Métodos da classe HttpServlet que devem ser sobrescritos para tratar requisições HTTP. Todos esses métodos são invocados pelo servidor por meio do método service(). O método doget() trata as requisições GET. Este tipo de requisição pode ser enviada várias vezes, permitindo que seja colocada em um bookmark. O método dopost() trata as requisições POST que permitem que o cliente envie dados de tamanho ilimitado para o servidor Web uma única vez, sendo útil para enviar informações tais como o número do cartão de crédito. O método doput() trata as requisições PUT. Este tipo de requisição permite que o cliente envie um arquivo para o servidor à semelhança de como é feito via FTP. O método doput() trata as requisições DELETE, permitindo que o cliente remova um documento ou uma página do servidor. O método service(), que recebe todas as requisições, em geral não é sobrescrito, sendo sua tarefa direcionar a requisição para o método adequado. 18
19 Exemplo de Servlet Para entendermos o que é um Servlet nada melhor que um exemplo simples. O exemplo abaixo gera uma página HTML em resposta a uma requisição GET. A página HTML gerada contém simplesmente a frase Ola mundo!!!. Este é um Servlet bem simples que ilustra as funcionalidades básicas da classe. import javax.servlet.*; import javax.servlet.http.*; import java.io.ioexception; public class Ola extends HttpServlet { public String getservletinfo() { return "Ola versão 0.1"; } public void doget(httpservletrequest req, HttpServletResponse res) throws IOException, ServletException{ res.setcontenttype("text/html"); java.io.printwriter out = res.getwriter(); out.println("<html>"); out.println("<head>"); out.println("<title>servlet</title>"); out.println("</head>"); out.println("<body>ola mundo!!!"); out.println("</body>"); out.println("</html>"); out.close(); } } Exemplo. Servlet Ola. O método doget() recebe dois objetos: um da classe HttpServletRequest e outro da classe HttpServletResponse. O HttpServletRequest é responsável pela comunicação do cliente para o servidor e o HttpServletResponse é responsável pela comunicação do servidor para o cliente. Sendo o exemplo Servlet Ola apenas um exemplo simples ele ignora o que foi enviado pelo cliente, tratando apenas de enviar uma página HTML como resposta. Para isso é utilizado o objeto da classe HttpServletResponse. Primeiramente é usado o método setcontenttype() para definir o tipo do conteúdo a ser enviado ao cliente. Esse método deve ser usado apenas uma vez e antes de se obter um objeto do tipo PrintWriter ou ServletOutputStream para a resposta. Após isso é usado o método getwriter() para se obter um objeto do tipo PrintWriter que é usado para escrever a resposta. Neste caso os dados da resposta são baseados em caracteres. Se o programador desejar enviar a resposta em bytes deve usar o método getoutputstream() para obter um objeto OutputStream. A partir de então o programa passa usar o objeto PrintWriter para enviar a página HTML. 19
20 Compilando o Servlet A API Servlet ainda não foi incorporado ao SDK, portanto, para compilar um Servlet é preciso adicionar a API Servlet ao pacote SDK. Existem várias formas de se fazer isso. A Sun fornece a especificação da API e diversos produtores de software executam a implementação. Atualmente, a especificação da API Servlet está na versão 2.3. Uma das implementações da API que pode ser baixada gratuitamente pela Internet é a fornecida pelo projeto Jakarta ( denominada de Tomcat. A implementação da API Servlet feita pelo projeto Jakarta é a implementação de referência indicada pela Sun. Ou seja, é a implementação que os outros fabricantes devem seguir para garantir a conformidade com a especificação da API. No entanto, uma vez que o Tomcat é a implementação mais atualizada da API, é também a menos testada e, por consequência, pode não ser a mais estável e com melhor desempenho. Antes de executar o Servlet e preciso compilá-lo. Para compilá-lo é preciso que as classes que implementam a API Servlet estejam no classpath. Para isso é preciso definir a variável de ambiente. No ambiente MS-Windows seria set CLASSPATH=%CLASSPATH%;%TOMCAT_HOME%\lib\servlet.jar e no ambiente Unix seria CLASSPATH=${CLASSPATH}:${TOMCAT_HOME}/lib/servlet.jar Alternativamente, é possível indicar o classpath na própria linha de execução do compilador Java. Por exemplo, No ambiente MS-'Windows ficaria na seguinte forma: javac -classpath "%CLASSPATH%;c:\tomcat\lib\servlet.jar Ola.java 20
21 Criando uma aplicação no Tomcat Agora é preciso definir onde deve ser colocado o arquivo compilado. Para isso é preciso criar uma aplicação no Tomcat ou usar uma das aplicações já existentes. Vamos aprender como criar uma aplicação no Tomcat. Para isso é preciso cria a seguinte estrutura de diretórios abaixo do diretório webapps do Tomcat: webapps Nome aplicação Web-inf classes lib Diretório de Aplicações Na verdade é possível definir outro diretório para colocar as aplicações do Tomcat. Para indicar outro diretório é preciso editar o arquivo server.xml e indicar o diretório por meio da diretiva home do tag ContextManager. O diretório de uma aplicação é denominado de contexto da aplicação. É preciso também editar o arquivo server.xml do diretório conf, incluindo as linhas: <Context path="/nome aplicação" docbase="webapps/ nome aplicação" debug="0 reloadable="true" > </Context> Finalmente, é preciso criar (ou copiar de outra aplicação) um arquivo web.xml no diretório Web-inf com o seguinte conteúdo: <?xml version="1.0" encoding="iso "?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" " <web-app> </web-app> Copie então o arquivo compilado Ola.class para o subdiretório /webapps/nome aplicação/web-inf/classes do Tomcat. 21
22 Invocando diretamente pelo Navegador Podemos executar um Servlet diretamente digitando a URL do Servlet no navegador. A URL em geral possui o seguinte formato: aplicação/servlet/nome servlet A palavra servlet que aparece na URL não indica um subdiretório no servidor. Ela indica que esta é uma requisição para um Servlet. Por exemplo, suponha que o nome da aplicação criada no Tomcat seja teste. Então a URL para a invocação do Servlet do exemplo teria a seguinte forma: A URL para a chamada do Servlet pode ser alterada de modo a ocultar qualquer referência à diretórios ou a tecnologias de implementação. No caso do Tomcat essa configuração é no arquivo web.xml do diretório Web-inf da aplicação. Por exemplo, para eliminar a palavra servlet da URL poderíamos inserir as seguintes linhas no arquivo web.xml entre os tags <web-app> e </web-app>: <servlet> <servlet-name> Ola </servlet-name> <servlet-class> Ola </servlet-class> </servlet> <servlet-mapping> <servlet-name> Ola </servlet-name> <url-pattern> /Ola </url-pattern> </servlet-mapping> 22
23 Invocando em uma página HTML No caso de uma página HTML basta colocar a URL na forma de link. Por exemplo, <a href=" Ola</a> Neste caso o Servlet Ola será solicitado quando o link associado ao texto Servlet Ola for acionado. 23
24 Diferenças entre as requisições GET e POST Os dois métodos mais comuns, definidos pelo protocolo HTTP, de se enviar uma requisições a um servidor Web são os métodos POST e GET. Apesar de aparentemente cumprirem a mesma função, existem diferenças importantes entre estes dois métodos. O método GET tem por objetivo enviar uma requisição por um recurso. As informações necessárias para a obtenção do recurso (como informações digitadas em formulários HTML) são adicionadas à URL e, por consequência, não são permitidos caracteres inválidos na formação de URLs, como por espaços em branco e caracteres especiais. Já na requisição POST os dados são enviados no corpo da mensagem. O método GET possui a vantagem de ser idempotente, ou seja, os servidores Web podem assumir que a requisição pode ser repetida, sendo possível adicionar à URL ao bookmark. Isto é muito útil quando o usuário deseja manter a URL resultante de uma pesquisa. Como desvantagem as informações passadas via GET não podem ser muito longas, um vez o número de caracteres permitidos é por volta de 2K. Já as requisições POST a princípio podem ter tamanho ilimitado. No entanto, elas não são idempotente, o que as tornam ideais para formulários onde os usuários precisam digitar informações confidenciais, como número de cartão de crédito. Desta forma o usuário é obrigado a digitar a informação toda vez que for enviar a requisição, não sendo possível registrar a requisição em um bookmark. 24
25 Concorrência Uma vez carregado o Servlet não é mais descarregado, a não ser que o servidor Web tenha sua execução interrompida. De modo geral, cada requisição que deve ser direcionada a determinada instância de Servlet é tratada por um thread sobre a instância de Servlet. Isto significa que se existirem duas requisições simultâneas que devem ser direcionadas para um mesmo objeto o container criará dois threads sobre o mesmo objeto Servlet para tratar as requisições. A figura 7 ilustra esta situação. Figura 7. Relacionamento entre as instâncias dos Servlets e os threads. Em conseqüência disto temos o benefícios de uma sobrecarga para servidor, uma vez que a criação de threads é menos onerosa do que a criação de processos, e uma aparente melhora no tempo de resposta. Por outro lado, o fato dos Servlets operarem em modo multi-thread aumenta a complexidade das aplicações e cuidados especiais, como visto no capítulo sobre concorrência, devem tomados para evitar comportamentos erráticos. Por exemplo, suponha um Servlet que receba um conjunto de números inteiros e retorne uma página contendo a soma dos números. O exemplo abaixo mostra o código do Servlet. O leitor pode imaginar um código muito mais eficiente para computar a soma de números, mas o objetivo do código do exemplo é ilustrar o problema da concorrência em Servlets. O exemplo contém também um trecho de código para recebimento de valores de formulários, o que será discutido mais adiante. import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class Soma extends HttpServlet { Vector v = new Vector(5); protected void dopost(httpservletrequest req, HttpServletResponse res) throws ServletException, java.io.ioexception { v.clear(); Enumeration e = req.getparameternames(); while (e.hasmoreelements()) { String name = (String)e.nextElement(); String value = req.getparameter(name); if (value!= null) v.add(value); } res.setcontenttype("text/html"); 25
26 } } java.io.printwriter out = res.getwriter(); out.println("<html>"); out.println("<head><title>servlet</title></head>"); out.println("<body>"); out.println("<h1> A soma e'"); int soma =0; for(int i =0; i< v.size() ; i++) { soma += Integer.parseInt((String)v.get(i)); } out.println(soma); out.println("<h1>"); out.println("</body>"); out.println("</html>"); out.close(); Exemplo- Servlet com problemas de concorrência. Note que o Servlet utiliza uma variável de instância para referenciar o Vector que armazena os valores. Se não forem usadas primitivas de sincronização (como no código do exemplo) e duas requisições simultâneas chegarem ao Servlet o resultado pode ser inconsistente, uma vez que o Vector poderá conter parte dos valores de uma requisição e parte dos valores de outra requisição. Neste caso, para corrigir esse problema basta declarar a variável como local ao método dopost() ou usar primitivas de sincronização. 26
27 Obtendo Informações sobre a Requisição O objeto HttpServletRequest passado para o Servlet contém várias informações importantes relacionadas com a requisição, como por exemplo o método empregado (POST ou GET), o protocolo utilizado, o endereço remoto, informações contidas no cabeçalho e muitas outras. O Servlet do exemplo abaixo retorna uma página contendo informações sobre a requisição e sobre o cabeçalho da requisição. import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class RequestInfo extends HttpServlet { public void doget(httpservletrequest req, HttpServletResponse res) throws IOException, ServletException { res.setcontenttype("text/html"); PrintWriter out = res.getwriter(); out.println("<html><head>"); out.println("<title>exemplo sobre Requisicao de Info </title>"); out.println("</head><body>"); out.println("<h3> Exemplo sobre Requisicao de Info </h3>"); out.println("metodo: " + req.getmethod()+ <br> ); out.println("request URI: " + req.getrequesturi()+ <br> ); out.println("protocolo: " + req.getprotocol()+ <br> ); out.println("pathinfo: " + req.getpathinfo()+ <br> ); out.println("endereco remoto: " + req.getremoteaddr()+ <br><br> ); Enumeration e = req.getheadernames(); while (e.hasmoreelements()) { String name = (String)e.nextElement(); String value = req.getheader(name); out.println(name + " = " + value+"<br>"); } out.println("</body></html>"); } public void dopost(httpservletrequest req, HttpServletResponse res) throws IOException, ServletException { doget(req, res); } } Exemplo - Servlet que retorna as informações sobre a requisição. Note que o método dopost() chama o método doget(), de modo que o Servlet pode receber os dois tipos de requisição. A figura 8 mostra o resultado de uma execução do Servlet do exemplo anterior. 27
28 Figura 8. Saída da execução do Servlet que exibe as informações sobre a requisição. 28
29 Lidando com Formulários Ser capaz de lidar com as informações contidas em formulários HTML é fundamental para qualquer tecnologia de desenvolvimento de aplicações para Web. É por meio de formulários que os usuários fornecem dados, preenchem pedidos de compra e (ainda mais importante) digitam o número do cartão de crédito. As informações digitadas no formulário chegam até o Servlet por meio do objeto HttpServletRequest e são recuperadas por meio do método getparameter() deste objeto. Todo item de formulário HTML possui um nome e esse nome é passado como argumento para o método getparameter() que retorna na forma de String o valor do item de formulário. O Servlet do próximo exemplo exibe o valor de dois itens de formulários do tipo text. Um denominado nome e o outro denominado de sobrenome. Em seguida o Servlet cria um formulário contendo os mesmos itens de formulário. Note que um formulário é criado por meio do tag <form>. Como parâmetros opcionais deste tag temos método da requisição (method), é a URL para onde será submetida a requisição (action). No caso do exemplo, o método adotado é o POST e a requisição será submetida ao próprio Servlet Form. import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class Form extends HttpServlet { public void doget(httpservletrequest req, HttpServletResponse res) throws IOException, ServletException { res.setcontenttype("text/html"); PrintWriter out = res.getwriter(); out.println("<html>"); out.println("<head><title>trata formulario</title></head>"); out.println("<body bgcolor=\"white\">"); out.println("<h3>trata formulario</h3>"); String nome = req.getparameter("nome"); String sobrenome = req.getparameter("sobrenome"); if (nome!= null sobrenome!= null) { out.println("nome = " + nome + "<br>"); out.println("sobrenome = " + sobrenome); } out.println("<p>"); out.print("<form action=\"form\" method=post>"); out.println("nome : <input type=text size=20 name=nome><br>"); out.println("sobrenome: <input type=text size=20 name=sobrenome><br>"); out.println("<input type=submit>"); out.println("</form>"); out.println("</body></html>"); } 29
30 public void dopost(httpservletrequest req, HttpServletResponse res) throws IOException, ServletException { doget(req, res); } } 30