Baixe o app para aproveitar ainda mais
Prévia do material em texto
Grupo Multitecnus©, 2013 www.multitecnus.com WEB 2 Grupo Multitecnus© , 2013 1. Introdução Java é uma Linguagem de Programação orientada a objetos (LPOO), projetada para ser portável entre diferentes plataformas de hardware e software, ou seja, um programa criado no ambiente Windows pode ser executado no ambiente Linux ou UNIX. Como qualquer linguagem de programação, JAVA lhe permitirá escrever programas que rodarão com capacidade semelhante à de qualquer programa para desktop1. Java também permite construir páginas Web, e que podem ser acessadas por um navegador, tal como: Chrome, Firefox, IE , Opera, etc. 1 Um material de introdução à linguagem Java encontra-se em: http://www.multitecnus.com/java . 3 Grupo Multitecnus© , 2013 1.1. Criando um Projeto WEB no Eclipse Execute o Eclipse. Verifique se a perspectiva Java EE está ativa: 4 Grupo Multitecnus© , 2013 Clique em File -> New -> Dynamic Web Project: 5 Grupo Multitecnus© , 2013 Surge a janela New Dynamic Web Project. No campo Project Name digite o nome do projeto, por exemplo, dwp.html: Em seguida, clique em Next. Obs.: Definiu-se o nome do projeto como dwp.html, mas poderia ser qualquer nome de sua escolha, como, por exemplo, prj_web. 6 Grupo Multitecnus© , 2013 Na janela seguinte (de configuração), clique em Next: 7 Grupo Multitecnus© , 2013 Surge a janela Web Module. Marque a opção Generate web.xml deployment descriptor; após, clique em Finish: 8 Grupo Multitecnus© , 2013 Pronto. A estrutura básica para criar seu projeto web foi criada. A pasta WebContent representa o root da aplicação. 9 Grupo Multitecnus© , 2013 Da estrutura criada para executar a aplicação web, explica-se os diretórios: a) WebContent: diretório a partir do qual o usuário acessará os recursos publicados (deploy); b) META-INF: contém um arquivo de informações necessárias para a execução do projeto. c) WEB-INF: é um diretório acessível apenas pelo web container (conteiner web, ou servidor web). O próximo passo é criar um arquivo HTML para testar o projeto criado por você. 10 Grupo Multitecnus© , 2013 Clique sobre WebContent (botão direito do mouse), e, depois, em New -> HTML File: 11 Grupo Multitecnus© , 2013 Surge a janela New HTML File. Neste primeiro exemplo, vamos deixar o nome do arquivo inalterado (NewFile.html). Clique em Next: 12 Grupo Multitecnus© , 2013 Na janela Select HTML Template, clique no template desejado aqui optou-se pelo HTML5, mas poderia ter sido qualquer outro), em seguida, clique em Finish: 13 Grupo Multitecnus© , 2013 Observe o arquivo NewFile.html (na pasta WebContent) e seu conteúdo: 14 Grupo Multitecnus© , 2013 Altere o código-fonte de NewFile.html, inserindo a informação abaixo (no body): <h1> Multitecnus – teste </h1> O código-fonte fica, então: <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Insert title here</title> </head> <body> <h1> Multitecnus – teste </h1> </body> </html> Salve as modificações. 15 Grupo Multitecnus© , 2013 1.2. Empacotando e Publicando a Aplicação WEB Uma vez que a página é criada, deve-se publicá-la (deploy), o que significa que o projeto deve estar contido na pasta webapps do servidor web. Neste trabalho, o projeto criado anteriormente será testado com o Apache Tomcat2. O primeiro passo é iniciar o servidor Apache Tomcat (vá ao Monitor Tomcat e clique em Start service), caso não esteja em funcionamento. O segundo passo é criar um móduloWAR (Web Archive), contendo todos os recursos necessários (html, jsp, servlets, etc.) à publicação (padrão JEE). 2 Neste momento, o Apache já deve estar instalado no sistema. Caso não esteja, vá ao endereço http://www.multitecnus.com/java e faça o download do arquivo apache_tomcat.pdf. Siga as instruções para instalar este servidor WEB. 16 Grupo Multitecnus© , 2013 Para gerar o arquivo WAR e publicá-lo, basta clicar com o botão direito do mouse sobre o nome do projeto (no Project Explorer) e, depois, em Export -> WAR file: 17 Grupo Multitecnus© , 2013 Na janela War Export, clique no botão Browse... : 18 Grupo Multitecnus© , 2013 Na janela Salvar como, vá até o o diretório de instalação do Apache Tomcat, e selecione a pasta webapps: Em seguida, digitemultitecnus no campo Nome. Ao final, clique em Salvar. 19 Grupo Multitecnus© , 2013 Finalize o deploy clicando em Finish: 20 Grupo Multitecnus© , 2013 Observe o arquivoWAR (multitecnus.war) gerado e salvo no diretório webapps. Observe, também, que uma pasta com o mesmo nome do arquivoWAR foi criada. 21 Grupo Multitecnus© , 2013 Esse diretório contém a estrutura básica para o funcionamento da aplicação WEB criada por você, além do arquivo NewFile.html criado por você com o auxílio do Eclipse: 22 Grupo Multitecnus© , 2013 Em um navegador web, acesse: http://localhost:9080/multitecnus/NewFile.html. Veja que o conteúdo entre <h1> e </h1> é exibido na janela do navegador. Obs.: A porta utilizada (9080) pode variar, dependendo de como o Apache Tomcat foi configurado. 23 Grupo Multitecnus© , 2013 2. Servlet Servlets são classes Java que executam e processam requisições dentro de um conteiner web. Podem ser requisições genéricas (GenericServlet) ou requisições HTTP (HttpServlet). GenericServlets podem devolver qualquer tipo de dados. Já HttpServlets, podem devolver uma página HTML, documentos do MS-Word, MS-Excel, Acrobat- PDF, imagens (gif, jpg, etc.), ou qualquer outro conteúdo MIME3 válido. 3 MIME: Multipurpose Internet Mail Extensions. Em http://www.w3.org/wiki/WebIntents/MIME_Types pode-se obter mais informação a respeito. 24 Grupo Multitecnus© , 2013 2.1. Criando um HttpServlet com Eclipse Para criar um HttpServlet, deve-se: a) Inserir uma anotação@WebServlet; b) Criar uma classe que estenda javax.servlet.http.HttpServlet; c) Definir os métodos doGet e doPost a serem utilizados pelo HttpServlet; d) Importar a biblioteca servlet-api.jar para o Build Path do projeto. Para finalizar, deve-se criar um formulário HTML para testar o HttpServlet criado. 25 Grupo Multitecnus© , 2013 Para exemplificar, crie um HttpServlet no Eclipse: a) Crie um projeto web dinâmico (New -> Dynamic Web Project): 26 Grupo Multitecnus© , 2013 Nomeie o projeto como: dwp.servlet e, depois, clique em Finish: 27 Grupo Multitecnus© , 2013 b) Crie um pacote (New -> Package): 28 Grupo Multitecnus© , 2013 Nomeie o pacote como: com.multitecnus.servlet. Clique em Finish. 29 Grupo Multitecnus© , 2013 O pacote criado (com.multitecnus.servlet) pode ser visto em Project Explorer: 30 Grupo Multitecnus© , 2013 c) Clique com o botão direito do mouse sobre o pacote, e, depois, em New -> Servlet: 31 Grupo Multitecnus© , 2013 Dê o nome ServletExemplo ao HttpServlet sendo criado. Clique em Next: 32 Grupo Multitecnus© , 2013 Na janela de informações, complete o campo Description, se desejado: O campo URL Mappings define o URL de execução do Servlet. Clique em Next. 33 Grupo Multitecnus© , 2013 Na janela seguinte, marque os métodos desejados e clique em Finish. d) Surge o código do HttpServlet criado. Nele, podem ser vistos vários apontamentos de erro. Configure o Build Path4 para corrigi-los. 4 Em: http://www.multitecnus.com/java, no material Introdução à Linguagem Java, encontra-se explicação a respeito do recurso Configure Build Path do Eclipse. 34 Grupo Multitecnus© , 2013 35 Grupo Multitecnus© , 2013 Clique com o botão direito do mouse sobre o pacote. Em seguida, clique em Build Path -> Configure Build Path...: 36 Grupo Multitecnus© , 2013 Na janela Java Build Path, clique na aba Libraries, e, depois, em Add External JARs...: 37 Grupo Multitecnus© , 2013 Na janela JAR Selection, vá até o diretório lib de instalação do Tomcat, e selecione o arquivo servlet-api.jar. Clique em Abrir: 38 Grupo Multitecnus© , 2013 Pronto! A biblioteca foi adicionada ao projeto. Clique em OK. 39 Grupo Multitecnus© , 2013 Observe que não há mais erros no projeto. 40 Grupo Multitecnus© , 2013 Agora, só falta testar o HttpServlet criado. Para tal, crie um arquivo HTML no Eclipse. Clique com o botão direito do mouse sobre o pacote com.multitecnus.servlet e, depois, em New -> HTML File: 41 Grupo Multitecnus© , 2013 Nomeie-o como testaServlet.html. Clique em Next: 42 Grupo Multitecnus© , 2013 Selecione o template html 5. Clique em Finish. 43 Grupo Multitecnus© , 2013 Ao surgir o código html, insira o trecho destacado em negrito: <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Insert title here</title> </head> <body> <form action="ServletExemplo" method="get"> Parâmetro 1 <input type="text" name="p1" /><br /> Parâmetro 2 <input type="text" name="p2" /><br /> <input type="submit" value="Enviar" /> </form> </body> </html> 44 Grupo Multitecnus© , 2013 Altere, altere o método doGet do HttpServlet criado, inserindo o código abaixo: PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<meta charset='ISO-8859-1'>"); out.println("<title>Tela de saída</title>"); out.println("</head>"); out.println("<body>"); String p1 = request.getParameter("p1"); out.println("<p>Parâmetro 1: " + p1 + "</p>"); String p2 = request.getParameter("p2"); out.println("<p>Parâmetro 2: " + p2 + "</p>"); out.println("</body>"); out.println("</html>"); 45 Grupo Multitecnus© , 2013 O método doGet, então , fica como: 46 Grupo Multitecnus© , 2013 Para finalizar, teste o HttpServlet. Clique na aba testaServlet.html e, depois, em Run: 47 Grupo Multitecnus© , 2013 Se surgir a janela Run On Server, selecione o servidor instalado na máquina local. No exemplo dado, será selecionado o servidor Tomcat 7.0 Server. Clique em Next: 48 Grupo Multitecnus© , 2013 Certifique-se que o projeto (dwp.servlet) esteja configurado no servidor. Clique em Finish. 49 Grupo Multitecnus© , 2013 O navegador interno do Eclipse surge, com o arquivo HTML criado anteriormente carregado: 50 Grupo Multitecnus© , 2013 Preencha os campos de texto com as strings Grupo e Multitecnus, e clique no botão Enviar: 51 Grupo Multitecnus© , 2013 O Servlet criado por você cria uma página HTML dinâmica e a envia ao navegador: 52 Grupo Multitecnus© , 2013 2.2. Publicando o HttpServlet Clique com o botão direito do mouse sobre o projeto (dwp.servlet) e, depois, em Export -> WAR file: 53 Grupo Multitecnus© , 2013 Clique em Browse... para selecionar a pasta de destino do arquivoWAR: 54 Grupo Multitecnus© , 2013 Selecione a pasta webapps de instalação do Apache-Tomcat. Clique em Salvar: 55 Grupo Multitecnus© , 2013 Clique em Finish para exportar o arquivoWAR: dwp.servlet.war. 56 Grupo Multitecnus© , 2013 O arquivo dwp.servlet.war já se encontra no diretório webapps. 57 Grupo Multitecnus© , 2013 Porém, para que a publicação seja completada, é preciso que o serviço do Apache- Tomcat seja iniciado. Mas, antes, é necessário "parar" o servidor utilizado pelo Eclipse quando da execução do HTML. No Eclipse, clique na aba Servers (na parte inferior da IDE): Em seguida, clique no botão Stop the server (em vermelho). 58 Grupo Multitecnus© , 2013 O servidor é, então, parado. Agora, por meio doMonitor Tomcat, inicie o Apache-Tomcat instalado no sistema : 59 Grupo Multitecnus© , 2013 Ao iniciar o serviço Apache-Tomcat, observe que um diretório com o mesmo nome do arquivoWAR é criado no diretório webapps: Este diretório, dwp.servlet, já é resultante do deploy da aplicação web. 60 Grupo Multitecnus© , 2013 No diretório dwp.servlet encontra-se o arquivo testaServlet.html. 61 Grupo Multitecnus© , 2013 Uma vez publicado o projeto, carregue a página HTML em um navegador web: http://localhost:9080/dwp.servlet/testaServlet.html. Observação: Neste exemplo foi alterado o método doGet porque o método utilizado pelo formulário para envio dos dados ao HttpServlet foi o método GET. Caso o método de envio das informações do formulário seja por meio do método POST, deve-se utilizar o método doPost. 62 Grupo Multitecnus© , 2013 2.3. Deployment Descriptor A anotação@WebServlet criada pelo Eclipse: @WebServlet(description = "Exemplo de criação de um HttpServlet com Eclipse", urlPatterns = { "/ServletExemplo" }) atende à especificação Servlet 3.0, tornando opcional a alteração do arquivoWEB- INF /web.xml. O arquivo web.xml é denominado deployment descriptor (descritor de publicação), e contém informações de configuração para a publicação de um aplicativo web. 63 Grupo Multitecnus© , 2013 Um duplo clique sobre o arquivo web.xml (na pasta na pasta Web-INF) permite acessar seu conteúdo: 64 Grupo Multitecnus© , 2013 No desenvolvimento de projetos web dinâmicos em versões anteriores à 3.0, cria- se facilmente este arquivo com o Eclipse. Por exemplo, inicie um novo projeto (Dynamic Web Project) e selecione a versão 2.5: 65 Grupo Multitecnus© , 2013 Após clicar 2 vezes em Next, selecione: Generate web.xml deployment descriptor: Isto faz com que o arquivo web.xml seja gerado com várias informações iniciais, ao contrário do arquivo gerado na versão 3.0, que só contém uma referência à versão (Version) e a inserção da anotação (@WebServlet ) dentro do Servlet. 66 Grupo Multitecnus© , 2013 Ao clicar em Finish o Eclipse inicia um projeto dinâmico e, não só cria o deployment descriptor, mas também o inicia com alguns valores. Dê um duplo clique sobre o arquivo web.xml (na pasta na pasta Web-INF) para acessar seu conteúdo: 67 Grupo Multitecnus© , 2013 Para verificar como o Eclipse altera, automaticamente, o arquivo web.xml, execute as seguintes tarefas: a) Crie o pacote: com.multitecnus.servlet ; b) Crie um Servlet. Nomeie a classe como: TestaServlet ; c) Complete o campo Description com: Testa Servlet ; d) Clique no botão Add... do campo URL mappings: e complete o campo Pattern com: /TS ; e) Clique em Finish . 68 Grupo Multitecnus© , 2013 Agora, examine o arquivo web.xml, e verifique as informações sobre o Servlet criado. Dê um clique na aba Source para ter acesso ao arquivo web.xml: 69 Grupo Multitecnus© , 2013 Na listagem abaixo, observe as informações sobre o Servlet criado (em negrito): <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>dwp.servlet</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <description>Testa Servlet</description> <display-name>TestaServlet</display-name> <servlet-name>TestaServlet</servlet-name> <servlet-class>com.multitecnus.servlet.TestaServlet</servlet-class></servlet> <servlet-mapping> <servlet-name>TestaServlet</servlet-name> <url-pattern>/TestaServlet</url-pattern> <url-pattern>/TS</url-pattern> </servlet-mapping> </web-app> 70 Grupo Multitecnus© , 2013 2.3.1. Elementos de web.xml O elemento web-app é o raiz do documento web.xml. Listam-se, abaixo, alguns elementos válidos para esse arquivo5: a) Context-param : declara parâmetros de iniciação. b) Description : texto descritivo sobre a aplicação. c) Display-name : nome curto da aplicação a ser visualizado por ferramentas GUI. d) Error-page : página a ser exibida quando da ocorrência de um dado erro. e) Servlet : contém dados de declaração de um servlet. f) Servlet-mapping : define um mapeamento entre uma URL e um servlet. g) welcome-file: lista ordenada de arquivos a serem carregados se o arquivo desejado não estiver disponível para carregamento (index.html, por exemplo). 5Mais detalhes em: http://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/web_xml.html#1017571 71 Grupo Multitecnus© , 2013 2.4. Sessão Quando uma página "chama" uma outra, nenhum estado é armazenado entre essas chamadas. Diz-se, então, que o HTTP é um protocolo "stateless“, pois o servidor HTTP não armazena qualquer informação sobre o que se passa nos navegadores. Porém, às vezes é necessário armazenar valores entre chamadas. Por exemplo, em sites de comércio eletrônico, identifica-se o cliente permitindo-lhe utilizar seu carrinho de compras, independente da navegação entre páginas do site. Quando ocorre uma requisição HTTP, é criado, pelo servidor, uma conexão temporária (única) entre ambos (servidor e requisitante), a qual se conhece por sessão (session). Uma vez criada, pode-se armazenar informações entre navegações por meio de sessões. (interface HttpSession). 72 Grupo Multitecnus© , 2013 Para exemplificar, será criado um projeto contendo 3 arquivos: 1 HTML para invocar o servlet criaSession, o qual criará uma variável de sessão para armazenar a informação http://www.multitecnus.com e retornará ao navegador com uma página contendo um link para o servlet ResgataSession, o qual exibirá o conteúdo da informação armazenada na sessão, além do seu ID e último acesso. Para tal, execute os passos abaixo: a) Crie o projeto (Dynamic Web Project): dwp.ExemploSession ; b) Crie o arquivo HTML: criaSession.html ; c) Crie o pacote: testaSession ; d) No pacote testaSession: d.1) Crie o servlet: CriaSession.java ; d.2) Crie o servlet: ResgataSession.java ; e) O projeto será configurado no servidor Apache Tomcat 7.0 . 73 Grupo Multitecnus© , 2013 O Project Explorer resultante deverá ser como mostrado abaixo: 74 Grupo Multitecnus© , 2013 f) Substitua o código-fonte de criaSession.html pelo código abaixo: <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Insert title here</title> </head> <body> <a href="./CriaSession">Chama a servlet "Cria Session"</a> </body> </html> 75 Grupo Multitecnus© , 2013 g) Insira no método doGet de CriaSession.java, as linhas de código abaixo: HttpSession sessao = request.getSession(true); sessao.setAttribute("site", "http://www.multitecnus.com"); PrintWriter out = response.getWriter(); response.setContentType("text/html"); String pagina = "<html>" + "<head>" + "<title>Servlet chamado de cria Session.html</title>" + "</head>" + "<body>" + "<a href=\"./ResgataSession\">Chama a servlet \"Resgata Session\"</a>" + "</body>" + "</html>"; out.println(pagina); 76 Grupo Multitecnus© , 2013 h) Insira no método doGet de ResgataSession.java, as linhas de código abaixo : PrintWriter out = response.getWriter(); out.println("Chamada de CriaSession<br />"); HttpSession sessao = request.getSession(true); response.setContentType("text/html"); out.println("Valor resgatado: " + sessao.getAttribute("site") + "<br />"); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy - HH:mm"); out.println("Id da session: " + sessao.getId() + "<br />"); out.println("Acesso : " + sdf.format(new Date(sessao.getLastAccessedTime()))); Obs.: O parâmetro true em request.getSession(true) cria uma sessão caso ela não exista. Um parâmetro igual a false retorna uma sessão caso ela exista, e nulo, caso contrário. 77 Grupo Multitecnus© , 2013 i) Execute o projeto (a partir de criaSession.html). A tela produzida por ResgataSession deverá exibir algo como: Obs.: As informações "Id da session" e "Acesso" poderão variar de acordo com o obtido do seu ambiente de desenvolvimento. 78 Grupo Multitecnus© , 2013 2.4.1. Definindo Tempo Máximo para uma Sessão Uma sessão expira, por padrão, em 1800 segundos (30 minutos). E, ao expirar, o conteiner invalida a sessão. Por exemplo, se a linha de comando sessao.setMaxInactiveInterval(10); for inserida após a linha de comando de criação da sessão: HttpSession sessao = request.getSession(true); sessao.setMaxInactiveInterval(1); response.setContentType("text/html"); Após 10 segundos a sessão será invalidada, e a informação armazenada, perdida. Atualizar a página faz com que a informação "Valor resgatado" exiba "null". 79 Grupo Multitecnus© , 2013 2.5. Cookie Há uma outra forma de persistir informação entre navegações: pode-se utilizar cookies para esse armazenamento. Cookies são pequenos arquivos de texto armazenados na máquina do cliente, e que são enviados pelo endereço remoto com a finalidade de persistir informações, tais como a identificação e as preferências do usuário. Assim, em uma visita posterior ao site que enviou o cookie, o usuário será automaticamente identificado, e suas preferências utilizadas para personalizar seu acesso. Deve-se ressaltar que o cookie tem prazo para expirar, e esse prazo é definido pelo programador. Outro ponto: o usuário pode bloquear o acesso do navegador a cookies, dificultando, algumas vezes, impedindo, a navegação pelas páginas do site. 80 Grupo Multitecnus© , 2013 2.5.1. Criar um cookie: a) Crie um servlet. b) Crie o cookie em um método da classe (passe duas Strings ao construtor): Cookie cookie = new Cookie("id", "1"); c) Em seguida, defina por quanto tempo (em segundos) o cookie será válido: cookie.setMaxAge(60); No exemplo acima, após 1 minuto (60s) o cookie torna-se inválido. Um valor igual a 0 (zero) exclui o cookie. d) Adicione o cookie ao objeto HttpServletResponse: response.addCookie(cookie); Obs.: Repita o processo anterior para cada cookie adicional. Por exemplo: Cookie novoCookie = new Cookie("nome", "multitecnus"); novoCookie.setMaxAge(Integer.MAX_VALUE); response.addCookie(novoCookie); 81 Grupo Multitecnus© , 2013 2.5.2. Resgatar um cookie: a) Crie um servlet. b) Em um dos métodos da classe, resgate todos os cookies em um array: Cookie [] cookies = request.getCookies(); a) Liste os valores se o array não for nulo (caso haja cookie válido armazenado): PrintWriter out = response.getWriter(); if (cookies == null) out.println ("Não há cookies válidos!"); else for(int i=0; i<cookies.length;i++) { Cookie cookie = cookies[i]; out.println("Valor["+ i +"]= " + cookie.getValue() + "<br />"); } 82 Grupo Multitecnus© , 2013 2.5.3. Resgatar um cookie específico: Para listar o valor de um cookie específico, deve-se identificar o nome dado ao mesmo (por meio do método getName): if (cookies == null) out.println ("Não há cookies válidos!"); else for(int i=0; i<cookies.length;i++) { if(cookies[i].getName().equals("id")) { out.println("Parâmetro: " + cookies[i].getName() + "<br />" ); out.println("Valor: " + Integer.parseInt(cookies[i].getValue())); } } 83 Grupo Multitecnus© , 2013 2.6. DataSourceUm DataSource é um objeto (server-side) que referencia um repositório de conexões (Connection Pool) a bancos de dados. Seu registro define os parâmetros associados à conexão: o driver JDBC, a base de dados (database), o login, etc. Após uma conexão ser utilizada, a mesma retorna ao Connection Pool para uso por outra requisição, o que evita novas operações de login ao banco, que causam diminuição do desempenho da aplicação Java Web em acessos a dados. Por meio do DataSource pode-se criar conexão JDBC e executar cláusulas SQL. Um exemplo será criado para manipular um banco de dados no MySQL6. 6 Neste momento, o MySQL já deve estar instalado no sistema. Caso não esteja, vá ao endereço http://www.multitecnus.com/java e faça o download do arquivo mysql.pdf. Siga as instruções para instalar este SGBD. 84 Grupo Multitecnus© , 2013 2.6.1. JNDI - Java Naming and Directory Interface Em computação, um serviço de nomes associa um nome a um recurso computacional, quer seja o nome de um local na internet (por exemplo, http://www.multitecnus.com é associado ao endereço IP desse local. Assim, para acessar o site é preciso conhecer seu nome (ao invés do endereço IP), quer seja o nome de um diretório (que é associado a um bloco de memória). Essa associação é chamada Binding, e um conjunto de associações é chamado Contexto. Além de associar nomes a recursos, um serviço de nomes deve localizar um recurso (por exemplo, servlets, EJBs, bancos de dados, etc.) a partir de seu nome, que segue uma convenção. Por exemplo, o nome de um local na internet termina com o domínio (.com ou .br). O nome continua da direita para a esquerda, separando os demais elementos do nome pelo caractere "." (ponto): multitecnus.com 85 Grupo Multitecnus© , 2013 JNDI é uma API Java que permite o acesso a recursos por meio de nomes. Ela define um contexto (Context), por meio do qual é possível a procura do recurso (objeto) desejado, sendo que essa procura é iniciada por um contexto inicial (InitialContext). Para que se possa utilizar um DataSource, deve-se procurar (lookup) o objeto DataSource para o contexto JNDI (Java Naming and Directory Interface). 86 Grupo Multitecnus© , 2013 2.6.2. Exemplo a. Iniciar o Apache Tomcat b. Crie o projeto Web dinâmico (File -> New ->Dynamic Web Project): dwp.ds c. Crie o arquivo context.xml no diretório META-INF com o conteúdo abaixo: <?xml version="1.0" encoding="UTF-8" ?> <Context > <Resource name="testaDS" auth="Container" driverClassName="com.mysql.jdbc.Driver" type="javax.sql.DataSource" maxActive="20" maxIdle="10" 87 Grupo Multitecnus© , 2013 maxWait="100" url="jdbc:mysql://localhost/multitecnus" username="root" password="mysql" description="Teste de DataSource" closeMethod="close" /> </Context> Obs.: O parâmetro "closeMethod" corrige o problema das versões anteriores de não fechamento do DataSource (do Pool de conexão). Indica, para o Apache Tomcat, que ele deve fechar todas os recursos JNDI (conexões do DataSource) no undeploy do arquivo WAR. 88 Grupo Multitecnus© , 2013 d. Crie um servlet para testar o datasource: - Anotação: @WebServlet("/JavaDS") - Obter o contexto inicial: Context initialContext = new InitialContext(); - Obter do contexto e procura do objeto DataSource para o contexto JNDI: Context envContext = (Context)initialContext.lookup("java:/comp/env"); dataSource = (DataSource)envContext.lookup("testaDS"); e. Faça o deploy da aplicação f. Inicie o MySQL - Crie o BD: multitecnus - Crie a tabela: produto g. Carregue o servlet no navegador: http://localhost:9080/dwp.ds/JavaDS 89 Grupo Multitecnus© , 2013 Obs.1: SQL de construção da tabela produto no MySQL: CREATE TABLE `produto` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(20) DEFAULT NULL, `preco` double(15,3) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 PACK_KEYS=0; Obs.2: Em http://www.multitecnus.com/java podem ser obtidos os códigos-fonte do servlet (datasource_src.doc) e do arquivo XML (datasource_context.doc). 90 Grupo Multitecnus© , 2013 2.7. Listener Um Listener é utilizado no tratamento de eventos, e permite que objetos interessados sejam avisados de uma mudança de estado, ou da ocorrência de um evento, em outro objeto. Os principais tipos de evento são: - Eventos de janela (WindowEvents): ocorre quando o estado de uma janela é modificado, ou seja, quando ela é: aberta, fechada, minimizada ou maximizada. - Eventos de ações (ActionEvents): ocorre quando o estado de um componente é modificado (seleção de um elemento ou clique do mouse em um elemento, por exemplo, um JButton). - Eventos de mouse (MouseEvents): ocorre quando o mouse é manipulado (clique no botão ou deslocamento) - Eventos de teclado (KeyEvents): ocorre quando uma tecla é pressionada. 91 Grupo Multitecnus© , 2013 A especificação servlet possui a capacidade de manipular eventos por meio de listeners, possibilitando um controle maior da aplicação Web. Para que se possa fazer esse monitoramento, deve-se implementar umas das interfaces abaixo: - javax.servlet.ServletContextListener: é um listener que monitora o início (contextInitialized) e a finalização (contextDestroyed ) de uma aplicação. - javax.servlet.ServletContextAttributeListener: é um listener que monitora a adição (attributeAdded), a remoção (attributeRemoved) ou a alteração (attributeReplaced) de um atributo no contexto. - javax.servlet.http.HttpSessionListener: é um listener que monitora a criação (sessionCreated) e a destruição (sessionDestroyed) da sessão. 92 Grupo Multitecnus© , 2013 - javax.servlet.http.HttpSessionAttributeListener: é um listener que monitora a adição (attributeAdded), a remoção (attributeRemoved) ou a alteração (attributeReplaced) de um atributo da sessão de usuário. - javax.servlet.http.HttpSessionActivationListener: é um listener que monitora ó ativamento (sessionDidActivate) ou passivada (sessionWillPassivate). - javax.servlet.http.HttpSessionBindingListener: é um listener que monitora quando o objeto que implementa esta interface é vinculado ou desvinculado de uma sessão, ou para um HttpSessionAttributeListener que foi configurado no descritor de implementação quando qualquer atributo for vinculado, desvinculado ou substituído em uma sessão. A sessão vincula o objeto por meio de uma chamada a HttpSession.setAttribute e libera o objeto por meio de uma chamada para HttpSession.removeAttribute. 93 Grupo Multitecnus© , 2013 - javax.servlet.ServletRequestListener: é um listener que monitora a chegada de uma requisição. - javax.servlet.ServletRequestAttributeListener: é um listener que monitora a adição (attributeAdded), a remoção (attributeRemoved) ou a alteração (attributeReplaced) de um atributo de uma requisição. De todas elas, as interfaces ServletContextListener e HttpSessionListener são as mais utilizadas. 94 Grupo Multitecnus© , 2013 2.7.1. Criando um Listener com Eclipse a) Crie um projeto Web dinâmico (File -> New -> Dynamic Web Project) ; b) Crie o pacote com.multitecnus ; c) Crie um servlet de nome ServletMonitorado; d) Clique, com o botão direito do mouse, sobre o nome do pacote, e, depois, em New -> Listener : 95 Grupo Multitecnus© , 2013 Na janela que surge, digite ServletmonitoradoListener no campo Class name : Clicar em Next. 96 Grupo Multitecnus© , 2013 Na janela que surge, clique em javax.servlet.ServletContextListener : Clique em Finish. 97 Grupo Multitecnus© , 2013 A anotação @WebListener no código gerado: @WebListener public class ServletMonitoradoListener implements ServletContextListener{ /** * Default constructor. */ public ServletMonitoradoListener() { // TODO Auto-generated constructor stub } registra a classe como sendo um listener, obrigando-a a implementar uma das interfaces listadas anteriormente (no exemplo, usou-se: ServletContextListener). Em versões anteriores à especificação 3.0, deve-se alterar o arquivo de web.xml com o seguinte: <listener> <listener-class>com.multitecnus. ServletMonitoradoListener</listener-class> </listener> 98 Grupo Multitecnus© , 2013 Na classe recém criada, altere as linhas de código como abaixo: public void contextInitialized(ServletContextEvent arg0) { // TODO Auto-generated method stub System.out.println("O Contexto foi iniciado!"); } Execute, agora, a aplicação Web e veja a mensagem na aba Console (na parte inferior da tela do Eclipse). Obs.: Caso esta aba não esteja visível, clique emWindow -> Show View -> Console. 99 Grupo Multitecnus© , 2013 2.8. Filtro Um servlet filter permite interceptar os objetos HttpServletRequest e HttpServletResponse antes que eles sejam enviados ao servlet, permitindo implementar controle de acesso, compressão/descompressão de dados, etc. A anotação @WebFilter no código: @WebFilter(servletNames = { "ServletTeste" } ) public class ServletTesteFilter implements Filter { registra a classe como sendo um filtro, obrigando-a a implementar a interface Filter. E informa que o servlet ServletTeste será filtrado por meio de ServletTesteFilter. 100 Grupo Multitecnus© , 2013 Nas versões anteriores à especificação Servlet 3.0, deve-se adicionar os elementos “<filter>” e “<filter-mapping>” ao arquivo web.xml: <filter> <display-name>ServletTesteFilter</display-name> <filter-name>ServletTesteFilter</filter-name> <filter-class>com.multitecnus.ServletTesteFilter</filter-class> </filter> <filter-mapping> <filter-name>ServletTesteFilter</filter-name> <servlet-name>ServletTeste</servlet-name> </filter-mapping> 101 Grupo Multitecnus© , 2013 Quando o filtro é adicionado ao contexto, o método init é executado. Quando o filtro é destruído, é invocado o método destroy. O método mais importante em um filtro é o método doFilter, que examina os cabeçalhos (headers) da requisição, customiza requisições que solicitem a modificação de cabeçalhos ou dados e invoca o próximo filtro. A interface FilterConfig (parâmetro do método init), possui 4 métodos: a) public String getFilterName() : retorna o nome do filtro. b) public String getInitParameter(String arg0) : retorna uma string contendo o parâmetro de iniciação, ou nulo, caso não exista tal parâmetro. c) public Enumeration<String> getInitParameterNames() : retorna os nomes de todos os parâmetros do filtro. d) public ServletContext getServletContext() : retorna um objeto para o contexto do servlet. 102 Grupo Multitecnus© , 2013 Como exemplo, crie um filtro de controle para acesso a requisições7 a um servlet: 1) Crie um projeto Web dinâmico. Nomeie-o como: filtro . 2) Crie o pacote com.multitecnus.filtro . 3) Crie o servlet ServletTeste no pacote com.multitecnus.filtro. Altere o URL mappings para: /st . 4) Clique com o botão direito do mouse sobre o nome do servlet ServletTeste e, após isto, em New -> Filter. É criada a classe ServletTesteFilter. Neste caso, o filtro avaliará se o usuário possui, ou não, privilégio para acessar o ServletTeste. 5) Crie o arquivo teste.html que requisitará ServletTeste . 6) Execute o projeto a partir do HTML gerado. 7Obs.: O filtro será configurado para permitir o acesso a ServletTeste somente pelo usuário admin. Usuário com login diferente de admin será redirecionado ao formulário de entrada. 103 Grupo Multitecnus© , 2013 Trecho do código-fonte do arquivo ServletTeste.java: a) Anotação: @WebServlet("/st") b) Método doGet: PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<meta charset='ISO-8859-1'>"); out.println("<title>Tela de saída</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>Usuário logado!</p>"); String login = request.getParameter("login"); out.println("<p>Login: " + login + "</p>"); String senha = request.getParameter("senha"); out.println("<p>Senha: " + senha + "</p>"); String valor = (String) getServletContext().getAttribute("valor"); out.println("<p>Valor: " + valor + "</p>"); out.println("</body>"); out.println("</html>"); 104 Grupo Multitecnus© , 2013 Passos para criação do filtro ServletTesteFilter.java : Clique com o botão direito do mouse sobre o servlet a ser filtrado Em seguida, clique em New -> Filter 105 Grupo Multitecnus© , 2013 Código-fonte do arquivo ServletTesteFilter.java: package com.multitecnus; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; Obs1: Adicione os trechos em negrito ao código gerado pelo Eclipse. Obs2: Altere a anotação criada automaticamente pelo descrito no exemplo. Obs3: O projeto completo, filter.war, pode ser obtido em http://www.multitecnus.com/java. 106 Grupo Multitecnus© , 2013 /** * Servlet Filter implementation class ServletTesteFilter */ @WebFilter(urlPatterns = { "/st" }) public class ServletTesteFilter implements Filter { private FilterConfig fConfig; /** * Default constructor. */ public ServletTesteFilter() { // TODO Auto-generated constructor stub } /** * @see Filter#destroy() */ public void destroy() { // TODO Auto-generated method stub } 107 Grupo Multitecnus© , 2013 /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub // place your code here // pass the request along the filter chain if (((HttpServletRequest) request).getParameter("login").equals("admin")) { fConfig.getServletContext().setAttribute("valor", "10"); chain.doFilter(request, response); } else ((HttpServletResponse) response).sendRedirect("teste.html"); 108 Grupo Multitecnus© , 2013 /** * @see Filter#init(FilterConfig) */ public void init(FilterConfig fConfig) throws ServletException { // TODO Auto-generated method stub this.fConfig = fConfig; } } 109 Grupo Multitecnus© , 2013 Código-fonte do arquivo teste.html: <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Insert title here</title> </head> <body> <form action="st" method="get"> Login <input type="text" name="login" /><br /> Senha <input type="text" name="senha" /><br /> <input type="submit" value="Enviar" /> </form> </body> </html> 110 Grupo Multitecnus© , 2013 Antes de exportar o projeto (arquivo .war), cuide para que servlet-api.jar seja exportada também. Para tal, na aba Markers, expanda o item Classpath Dependency Validator Message. Aparecerá a mensagem Classpath entry. 111 Grupo Multitecnus© , 2013 Clique em Classpath entry com o botão direito do mouse: Em seguida, dê um clique em Quick Fix. 112 Grupo Multitecnus© , 2013 Na janela do Quick Fix, certifique-se que a opção: Mark the associated raw classpath entry as a publish/export dependency esteja selecionada. Clique em Finish para terminar. 113 Grupo Multitecnus© , 2013 Pronto. O problema da dependência está resolvido. Agora,é só exportar o projeto. 114 Grupo Multitecnus© , 2013 2.9. Servlet Assíncrono A especificação Java Servlet 3.0 permite processamento assíncrono de tal forma que uma thread relacionada a um servlet não precise esperar pela resposta de um banco de dados, ou outro recurso qualquer, para continuar processando a requisição, ou seja, a thread não é bloqueada. Um bom exemplo de utilização de servlet assíncrono, é na construção de conversações (chats) onde se tem a necessidade de habilitar conexões clientes longas com um servlet. Dessa forma, a requisição processada pelo servlet é colocada em uma fila; já a resposta é processada dentro da possibilidade do servidor, sendo gerada assincronamente. 115 Grupo Multitecnus© , 2013 Para que se possa trabalhar com servlets assíncronos, deve-se: a) Incluir o argumento asyncSupported = true na anotação @WebServlet . Por exemplo: @WebServlet(urlPatterns={"/ts","/ServletAssincrono"}, asyncSupported=true) b) Fazer uma requisição assíncrona por meio do método startAsync: AsyncContext aCtx = request.startAsync(request, response); c) Definir a quantidade de tempo (em ms) após o qual ocorre "timeout" para a requisição HTTP. No exemplo dado, serão 30s (30000 ms): aCtx.setTimeout(30000); d) Criar um pool de threads para executar as tarefas (no exemplo dado, o pool conterá10 threads, ativas ou inativas): ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor (10); 116 Grupo Multitecnus© , 2013 e) Definir a quantidade máxima de threads que o pool poderá conter (as requisições que excederem "MaximumPoolSize" serão rejeitadas): stpe.setMaximumPoolSize(500); f) Definir o tempo máximo, após o qual, uma thread é encerrada se não estiver em atividade (no exemplo dado, 30s): stpe.setKeepAliveTime(30, TimeUnit.SECONDS); f) Executar as tarefas: stpe.execute(new ServletAssincronoThread(aCtx)); Segue o código-fonte da classe ServletAssincrono.java. 117 Grupo Multitecnus© , 2013 package com.async; import java.io.IOException; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import javax.servlet.AsyncContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(urlPatterns={"/tsa","/ServletAssincrono"}, asyncSupported=true) public class ServletAssincrono extends HttpServlet { private static final long serialVersionUID = 1L; public ServletAssincrono() { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { AsyncContext aCtx = request.startAsync(request, response); aCtx.setTimeout(10000); ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor (10); stpe.setMaximumPoolSize(500); stpe.setKeepAliveTime(30, TimeUnit.SECONDS); stpe.execute(new ServletAssincronoThread(aCtx)); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ } } 118 Grupo Multitecnus© , 2013 g) Criar a classe "ServletAssincronoThread" para executar a tarefa desejada com uma thread: public class ServletAssincronoThread implements Runnable Segue o código-fonte: package com.async; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.servlet.AsyncContext; import javax.sql.DataSource; 119 Grupo Multitecnus© , 2013 package com.async; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.AsyncContext; public class ServletAssincronoThread implements Runnable { AsyncContext aCtx; PrintWriter out; public ServletAssincronoThread(AsyncContext aCtx) { this.aCtx = aCtx; try { this.out = aCtx.getResponse().getWriter(); } catch (IOException ioe){} } public void run() { /* * Rotina demorada (acesso a dados, a sites, etc.) */ aCtx.complete(); } } 120 Grupo Multitecnus© , 2013 Obs.1: Para um melhor controle da operação, pode-se adicionar um observador (classe Listener) à variável que instancia AsyncContext (no caso, aCtx): aCtx.addListener (new AListener(aCtx)); Obs.2: Para ver o projeto completo (com a classe AListener, que implementa a interface AsyncListener, e a classe ServletAssincronoThread, que utiliza um datasource para acesso a dados), importe o arquivo testaAssincrono.war (File -> Import... -> Web ->WARfile), em: http://www.multitecnus.com/java. 121 Grupo Multitecnus© , 2013 3. JSP JSP (JavaServer Pages) permite criar páginas web de forma dinâmica, sendo transformada em um Servlet pelo conteiner web. Um arquivo JSP pode conter HTML e código Java (chamado de scriptlet) delimitado pelos marcadores: <% e %>, como mostrado abaixo: <html> <head> <title>Exemplo de JSP</title> </head> <body> <% out.println (“Teste de JSP”); %> </body> </html> 122 Grupo Multitecnus© , 2013 Métodos definidos dentro do código JSP, devem ser delimitados pelos marcadores <%! e %>, como mostrado abaixo: <html> <head> <title>Exemplo de JSP</title> </head> <body> <%! public String msg(String m) { return "Mensagem= " + m; } %> <p>Código HTML</p> <% out.println( msg("testandométodo msg") ); %> </body> </html> 123 Grupo Multitecnus© , 2013 Obs.: A impressão de saída pelo método println: <% out.println( msg("testando método msg") ); %> pode ser substituída pela forma abreviada abaixo: <%= msg("testando método msg") %> Observe que o marcador inicial é "<%=" e, neste caso, após o marcador "%>" não há ponto e vírgula. 124 Grupo Multitecnus© , 2013 Os passos para criação de uma página dinâmica via JSP envolvem: a) Uma requisição (request) HTTP chega ao servidor web; b) O servidor envia a página JSP especificada na requisição ao motor (engine) JSP; c) O JSP é convertido em um servlet; d) O servlet é compilado e, então, enviado ao motor (engine) servlet para que seja executado; e) O servlet após execução produz uma saída no formato HTML, e enviado ao cliente da requisição por meio de uma resposta (response) HTTP; f) O motor servlet envia a resposta HTTP ao servidor web, e este, por sua vez, envia a página HTML gerada ao navegador requisitante. 125 Grupo Multitecnus© , 2013 3.1. Scriptlet Um scriptlet pode conter código Java (método, variável ou comendo), sendo delimitado por: <% e %>: <% // código Java %> Em formato XML, escreveríamos como abaixo: <jsp:scriptlet> // código Java </jsp:scriptlet> 126 Grupo Multitecnus© , 2013 As declarações de variáveis e métodos devem ser delimitadas por: <%! e %>: <%! int a,b; public String msg(String m) { return "Mensagem= " + m; } %> Em formato XML, escreveríamos como abaixo: <jsp:declaration> int a,b; public String msg(String m) { return "Mensagem= " + m; } </jsp:declaration> 127 Grupo Multitecnus© , 2013 Uma expressão, após avaliação, produz uma string a ser impressa na página HTML. Deve ser delimitada por: <%= e %>: <%= msg("testando método msg") %> Em formato XML, escreveríamos como abaixo: <jsp:expression> msg("testando método msg") </jsp:expression> Observe que não há ponto e vírgula ao final da expressão, pois trata-se de uma string que será adicionada à página. 128 Grupo Multitecnus© , 2013 Comentários em JSP são delimitados por: <%-- e --%>: <%-- Esta parte do código será ignoradapor JSP. --%> Exemplo: gerando uma tabela com a tabuada de 10: <body> Tabuada de 10 <table border="1"> <tr> <td>número</td><td> número x 10 </td> </tr> <% for (int i = 0; i <= 10; i++) { %> <%-- início do for --%> <tr> <td> <%= i %> </td> <td> <%= i*10 %> </td> </tr> <% } %> <%-- fim do for --%> </table> </body> 129 Grupo Multitecnus© , 2013 3.2. Diretivas São configurações informadas ao conteiner sobre a página JSP na sua compilação a servlet, sendo delimitadas por <%@ e %>. São três as diretivas: page, include e taglib. 3.2.1. Diretiva: <%@ page %> Informa uma lista de atributos de uma página JSP, tais como: - buffer: se contiver um valor igual a "none", a página de resposta é enviada diretamente ao cliente sem uso de buffer. Do contrário, deve-se especificar um tamanho, por exemplo: "8kb" (o padrão) - contentType: informa o conteúdo MIME (por padrão "text/html") e o conjunto de caracteres a ser utilizado (“ISO-8859-1", por exemplo) 130 Grupo Multitecnus© , 2013 - errorPage: especifica a URL de outra JSP a ser carregada no caso de ocorrerem exceções no JSP atual - import: especifica uma lista de pacotes ou classes, separados por vírgula, a serem utilizados pelo JSP - info: string contendo informações que podem ser resgatadas pelo método getServletInfo() - language: string contendo o nome da linguagem utilizada pelo código (por padrão, " java ") - pageEncoding: informa a codificação de caracteres a ser utilizado (por exemplo, “ISO-8859-1 ") Por exemplo: <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" info="Página de exemplo de JSP" %> 131 Grupo Multitecnus© , 2013 Exemplo 1: JSP gerado no Eclipse: <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <% out.println("Teste de JSP"); %> </body> </html> 132 Grupo Multitecnus© , 2013 Exemplo 2: especificação de página de erro a) Criar os arquivos: arq.jsp e erro.jsp (pasta WebContent) 133 Grupo Multitecnus© , 2013 b) Conteúdo do arquivo arq.jsp: <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" errorPage= “erro.jsp" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Página com erro</title> </head> <body> <% int n1=1, n2=0, n3; // A linha abaixo causará um erro de divisão por zero n3 = n1/n2; %> </body> </html> 134 Grupo Multitecnus© , 2013 c) Conteúdo do arquivo erro.jsp: <%@ page language="java" contentType="text/html; charset=ISO-8859-1« pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title> Página de tratamento de erro </title> </head> <body> <% out.println ("Ocorreu um erro em arq.jsp!"); %> </body> </html> 135 Grupo Multitecnus© , 2013 d) Ao executar arq.jsp, o conteúdo de erro.jsp é exibido: Exemplo 3: Importando "java.util" <%@ page import="java.util.*" %> <%= (new java.util.Date()).toLocaleString() %> 136 Grupo Multitecnus© , 2013 3.2.2. Diretiva: <%@ include %> Utilizada para a inclusão de arquivos: <%@ include file= “uri relativo" %> Por exemplo, se o código presente em arq2.jsp deve ser incluído em arq1.jsp, o arquivo arq1.jsp deve declarar o seguinte: <%@ include file= “arq2.jsp" %> 137 Grupo Multitecnus© , 2013 3.2.3. Diretiva: <%@ taglib %> A JSTL (JavaServer Pages Standard Tag Library) é um conjunto de tags personalizadas que contêm várias funcionalidades (manipulação de documentos XML, execução de cláusulas SQL, etc.) necessárias ao bom funcionamento de aplicações JSP, ou seja, trata-se de uma biblioteca (LIBrary) de tags, cada uma delas executando determinado processamento, permitindo a execução de código Java em uma página JSP sem, contudo, precisar codificar nesta linguagem. Para utilizar uma taglib, deve-se definir qual a taglib desejada (atributo uri) e um nome que se conhece por prefixo que identificará as tags da biblioteca respectiva. Por exemplo, para utilizar a taglib core, faz-se como abaixo: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 138 Grupo Multitecnus© , 2013 Taglibs permitem a construção de páginas JSP mais simples. Por exemplo, seguem abaixo dois códigos JSP para listar os valores de 1 a 10: o da esquerda, contendo scriptlet, o que a torna difícil de ler, ao passo que o código à direita faz uso de Taglibs, tornando-o mais elegante e fácil de manter: <body> <% for(int i=1; i<=10; i++) { %> <%= i %> <br/> <% } %> </body> </html> <body> <c:forEach var="i" begin="1" end="10" > <c:out value="${i}" /> <br /> </c:forEach> </body> </html> 139 Grupo Multitecnus© , 2013 As tags JSTL podem ser agrupadas de acordo com suas funcionalidades: - Core ( prefix: c ) - Internationalization ( prefix: fmt ) - SQL ( prefix: sql ) - XML ( prefix: x ) - Functions ( prefix: fn ) Obs.: Os prefixos entre parênteses são especificados pela convenção Java, de acordo com a documentação da Oracle, encontrada em: http://docs.oracle.com/javaee/1.4/tutorial/doc/JSTL3.html Segue, para cada biblioteca, a uri correspondente: - Core: http://java.sun.com/jsp/jstl/core - Internationalization: http://java.sun.com/jsp/jstl/fmt -SQL: http://java.sun.com/jsp/jstl/sql - XML: http://java.sun.com/jsp/jstl/xml - Functions: http://java.sun.com/jsp/jstl/functions 140 Grupo Multitecnus© , 2013 3.2.3.1. JSTL Core Esta biblioteca fornece funcionalidades úteis para um projeto, sendo: - Operações de uso geral - Operações de repetição - Operações condicionais - Operações de manipulação de URL Para utilizá-la, deve-se inserir, no topo do corpo do JSP, o cabeçalho: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" % > 141 Grupo Multitecnus© , 2013 A seguir, são listadas as tags de Core (JSTL básica). a) <c:out /> : exibe um valor Atributos: value: o que será impresso default: conteúdo a ser exibido caso value seja nulo. escapeXml: "true" se a tag deve gerar uma "sequência de escape" para os casos em que deve-se exibir um caracter especial (como o caractere aspas duplas) Por exemplo: - Crie um projeto web dinâmico no Eclipse. - Insira o cabeçalho: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> e o código: <c:out value="Utilizando JSTL Core"/> no documento. %142 Grupo Multitecnus© , 2013 Observe o erro apontado pelo Eclipse: Para resolvê-lo: - Acesse o endereço: http://tomcat.apache.org/taglibs/standard/ - Clique em download da versão JSTL 1.1 - Clique em binaries/ - Clique em: jakarta-taglibs-standard-1.1.2.zip 143 Grupo Multitecnus© , 2013 - Descompacte o arquivo obtido (jakarta-taglibs-standard-1.1.2.zip) - Copie os arquivos jstl.jar e standard.jar para o diretórioWEB-INF/lib da aplicação - No Eclipse, importe os arquivos .jar por meio do Build Path: 144 Grupo Multitecnus© , 2013 - Não há mais erros no código: Porém, a abaMarkers (parte inferior do Eclipse) mostra duas dependências: 145 Grupo Multitecnus© , 2013- Para resolver a primeira dependência, clique com o botão direito sobre ela e, em seguida, em Quick Fix : 146 Grupo Multitecnus© , 2013 Surge a janela do Quick Fix. Selecione a primeira opção de Select a fix: Mark the associated raw classpath entry as a publish/export dependency. e, por último, no botão Finish. Repita os passos anteriores para a segunda dependência. 147 Grupo Multitecnus© , 2013 Pronto. Só falta executar o JSP (utilizou-se o Apache 7.0), o que exibe a mensagem: Utilizando JSTL Core no navegador, como mostrado abaixo: 148 Grupo Multitecnus© , 2013 Ou, se preferir, gerando o arquivo WAR, carregando o JSP em um navegador fora do ambiente do Eclipse. Abaixo, pode-se ver o resultado no Firefox: 149 Grupo Multitecnus© , 2013 Obs1.: Outra forma de resolver o problema das dependências: - Copie os arquivos jstl.jar e standard.jar para o diretórioWEB-INF/lib da aplicação (no exemplo, \workspace\jstl\dwp.jstl\WebContent\WEB-INF\lib) - Clique em lib (deWEB-INF) e, em seguida, em File -> Refresh (ou dê um toque na tecla F5) para atualizar o ambiente. Observe que os arquivos .jar que faltavam são incorporados ao projeto: 150 Grupo Multitecnus© , 2013 Observe, porém, a sinalização de erro na janela de código: 151 Grupo Multitecnus© , 2013 Para resolver o problema, no diretórioWEB-INF/lib (Project Explorer), clique com o botão direito do mouse sobre jstl.jar e, depois, dê um clique em Add to Build Path: Repita esta ação para standard.jar. 152 Grupo Multitecnus© , 2013 Pronto. O problema está resolvido. Agora, só falta executar o JSP. 153 Grupo Multitecnus© , 2013 Obs2.: Verifique a diferença de código-fonte do HTML gerado, em função do valor do atributo escapeXml. Por exemplo, se o documento contiver o seguinte trecho: <c:out value="Utilizando \"JSTL Core\"" escapeXml="false" /> Será gerado o código-fonte: Utilizando "JSTL Core" Porém, se o trecho do código JSP for como abaixo: <c:out value="Utilizando \"JSTL Core\"" escapeXml="true" /> ou (sem especificar escapeXml explicitamente): <c:out value="Utilizando \"JSTL Core\"" /> Será gerado o seguinte código-fonte: Utilizando "JSTL Core" 154 Grupo Multitecnus© , 2013 Obs3.: Como o valor da variável v necessita exibir as aspas duplas no corpo da mensagem, a string pode ser delimitada, neste caso, por aspas simples: <c:out value= ' Utilizando "JSTL Core" ' /> Neste caso, não é necessário o uso da barra invertida. b) <c:set > : atribui o resultado de uma expressão a uma variável. <c:set var="v" value='Utilizando "JSTL Core"' /> Para exibir o conteúdo da variável "v", basta utilizar c:out e a sintaxe da Expression Language (escrevendo o nome da variável delimitada por chaves, antecedidas por um cifrão ($), tudo delimitado por aspas), como abaixo: <c:out value="${v}" default="Utilizando \"JSTL Core\"" /> 155 Grupo Multitecnus© , 2013 Expression Language - EL São expressões utilizadas para construir páginas dinâmicas, evitando-se o uso de scriptlets. Uma expressão é delimitada pelo marcador ${expressão}, para avaliação imediata (immediate evaluation), ou pelo marcador #{expressão}, para avaliação tardia (deferred evaluation), onde a avaliação da expressão, neste último caso, somente é realizada quando necessário8. Assim, a avaliação pode acontecer em diferentes estágios do ciclo de vida da página, como, por exemplo, nos casos em que se utiliza o framework JSF9. Componentes JSF precisam que a expressão seja avaliada durante o ciclo de vida JSF e não pelo motor (engine) JSP. 8Mais detalhes em: http://docs.oracle.com/javaee/6/tutorial/doc/bnahr.html 9Mais detalhes em: http://www.multitecnus.com/java/framework.pdf 156 Grupo Multitecnus© , 2013 São operadores da EL: Observe que há, para alguns operadores (como o de comparação de igualdade, por exemplo), uma forma alternativa de se executar uma operação. Assim, fazer ${1 == 1} é o mesmo que fazer ${1 eq 1}, e ambas as expressões produzem true como resultado. Operador Descrição + adição - subtração/menos unário * multiplicação / divisão (ou div) % resto da divisão (ou mod) == igual a (ou eq) != diferente de (ou ne) < menor que (ou lt) > maior que (ou gt) <= menor ou igual a (ou le) >= maior ou igual a (ou ge) && E lógico (ou and) || OU lógico (ou or) ! negação booleana unária (ou not) empty verifica se a variável possui valor nulo 157 Grupo Multitecnus© , 2013 c) <c: remove > : elimina a variável. Por exemplo, o código: <c:set var="v" value='Utilizando "JSTL Core"' /> <c:out value="${v}" /> <br /> <c:remove var="v" /> <c:out value="${v}" default="variável removida!" /> produz a seguinte saída: Utilizando "JSTL Core" variável removida! 158 Grupo Multitecnus© , 2013 d) <c:if> : estrutura condicional. O código abaixo: <c:set var="v" value="0" /> <c:if test = "${v == 0 }" > <c:out value='v = ${v}' /> </c:if> produz a seguinte saída: v = 0 Obs1: O atributo "test" logo após "<c:if" tem seu uso obrigatório! Obs2: Não há existe a estrutura else. Caso seja necessário, utilize "choose". 159 Grupo Multitecnus© , 2013 e) <c:catch> : captura exceções ocorridas no corpo do documento. Por exemplo, <%! int x; %> <c:catch var="excecao"> <% int x=1/0; %> </c:catch> <c:if test="${excecao != null}"> <p> Exceção: Classe : tipo => ${excecao} <br /> Mensagem : ${excecao.message} </p> </c:if> produz a seguinte saída: Exceção: Classe : tipo => java.lang.ArithmeticException: / by zero Mensagem : / by zero 160 Grupo Multitecnus© , 2013 f) <c:choose> : estrutura condicional semelhante a switch/case. Por exemplo, - Crie uma página HTML contendo o trecho: <form action="jstl_choose.jsp" method="get"> <input type="text" name="valor" /> <input type="submit" value="Enviar" /> </form> - Crie o arquivo JSP (jstl_choose.jsp) contendo o trecho abaixo: <body> <c:set var="v" value='<%= request.getParameter("valor") %>' /> <c:choose> <c:when test="${v == 0}">Zero</c:when> <c:when test="${v == 1}">Um</c:when> <c:otherwise>${v} está fora do limite!</c:otherwise> </c:choose> </body> - Carregue o arquivo HTML no navegador e envie um inteiro para vê-lo por extenso. 161 Grupo Multitecnus© , 2013 g) <c:forEach> : estrutura de repetição. Por exemplo, - Crie o arquivo JSP (jstl_foreach.jsp) contendo o trecho abaixo (o parâmetro step com valor igual a 1 é opcional): <body> <c:set var="vi" value='<%= request.getParameter("valori") %>' /> <c:set var="vf" value='<%= request.getParameter("valorf") %>' /> <c:forEach var="i" begin="${vi}" end="${vf}" step="1"> <c:out value="${i}" /> <c:if test="${i % 10 == 0}"> <br /> </c:if> </c:forEach> </body> - Crie uma página HTML contendo o trecho abaixo, e o carregue no navegador: <form action="jstl_foreach.jsp" method="get"> Início <input type="text" name="valori" /> <br /> Fim <input type="text" name="valorf" /> <br /> <input type="submit" value="Enviar" /> </form> 162 Grupo Multitecnus© , 2013 h) <c:forTokens> : separa um token (um conjunto de símbolos) em partes de acordo com o delimitador especificado. Por exemplo, considerando-se que a string "str1;str2;str3" é formada por substrings separadas pelo caractere ponto e vírgula (;), atribuir a string (ou variável que contenha a string) ao parâmetro item, e ";" ao parâmetro delims. O parâmetro var recebe cada uma das substrings, a cada etapa da separação: - Crie o arquivo JSP (jstl_fortokens.jsp) contendo o trecho abaixo: <body> <c:forTokens items="str1;str2;str3" delims=";" var="str"> <c:out value="${str}"/> <%= "<br />" %> </c:forTokens> </body> 163 Grupo Multitecnus© , 2013 i) <c:import> : importa uma URL (absoluta ou relativa) e a exibe na página corrente. Por exemplo, - Crie o arquivo JSP (jstl_import.jsp) contendo o trecho abaixo: <body> <p>Taglib import</p> <c:import url="http://www.multitecnus.com/java" /> </body> Obs.: Se você desejar recuperar o conteúdo da página, ao invés de exibi-la, especifique a variável (atributo var) que irá receber o conteúdo da página, <body> <c:import var="local" url="http://www.multitecnus.com/java" /> <c:out value="${local}" /> </body> 164 Grupo Multitecnus© , 2013 j) <c:url> : cria uma URL automatizando a codificação de caracteres especiais e a reescrita de URL (URL rewriting). Obs.1: URL rewriting é a capacidade de a Servlet utilizar sessões mesmo que o navegador não esteja habilitado para o uso de cookies. Para resolver este problema, é necessário que a URL contenha o valor de identificação da sessão (JSESSIONID) na requisição. Por exemplo, criar uma URL com a linha abaixo, <c:url var="ender" value="./destino.jsp" /> Faz com que a requisição de destino.jsp em localhost, na porta 9080, seja executada como: http://localhost:9080/dwp.jstl/destino.jsp;jsessionid=E1BE0BE30257B0AEF45566CBDDA62D4C Obs.2: Também pode ser utilizado: HttpServletResponse.encodeURL (String url). 165 Grupo Multitecnus© , 2013 k) <c:param> : adiciona um parâmetro à URL. Por exemplo: <c:url var="ender" value="./destino.jsp"> <c:param name="v1" value="1" /> <c:param name="v2" value="2" /> </c:url> faz com que a URL contenha cada parâmetro e seu valor (v1=1 & v2=2): http://localhost:9080/dwp.jstl/destino.jsp;jsessionid=C82419CCF9FE7C741FC5816D3FA3DB38?v1=1&v2=2 l) <c:redirect > : redireciona para a URL especificada. Por exemplo: <c:redirect url="http://www.multitecnus.com" /> 166 Grupo Multitecnus© , 2013 3.2.3.2. JSTL Formatting Para utilizar esta biblioteca, deve-se inserir, no topo do corpo do JSP, o cabeçalho: <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> Por meio de Formatting pode-se: a) Exibir messagens especificando-se o idioma (português, inglês, etc.); b) Formatar datas e números; c) Especificar o fuso horário (time zone). 167 Grupo Multitecnus© , 2013 Exemplo 1: Exibir mensagens em função do idioma do usuário (pt_BR: português do Brasil ou en_US: inglês americano): a) Dê um clique em File -> File: 168 Grupo Multitecnus© , 2013 b) Na janela que surge, dê um clique em src: c) No campo File name, digite:messages_pt_BR.properties. Clique em Finish. 169 Grupo Multitecnus© , 2013 d) Como conteúdo deste arquivo, digite: c1=Campo 1 c2=Campo 2 c3=Campo 3 Salve-o. 170 Grupo Multitecnus© , 2013 e) Repita as operações anteriores para o arquivo messages_en_US.properties: c1=Field 1 c2=Field 2 c3=Field 3 f) Crie, ainda, o arquivo messages.properties: c1=Sem descrição de campo 1 c2=Sem descrição de campo 2 c3=Sem descrição de campo 3 Este último arquivo é carregado se o idioma especificado não possuir um arquivo de propriedades, podendo carregar informações do idioma local por padrão. 171 Grupo Multitecnus© , 2013 g) Dê um clique com o botão direito sobreWebContent: Clique, em seguida, em JSP File. 172 Grupo Multitecnus© , 2013 Na janela que surge, digite: jstlFmt.jsp e, em seguida, clique em Finish. 173 Grupo Multitecnus© , 2013 Adicione ao código-fonte, logo após a cláusula <%@ page, o cabeçalho: <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> No corpo do documento (entre as tags <body> e </body>) digite o seguinte conteúdo: <fmt:setLocale value="pt_BR" /> <fmt:bundle basename="messages" > <fmt:message key="c1" /><br/> <fmt:message key="c2" /><br/> <fmt:message key="c3" /><br/> </fmt:bundle> <fmt:setLocale value="en_US" /> <fmt:bundle basename="messages" > <fmt:message key="c1" /><br/> <fmt:message key="c2" /><br/> <fmt:message key="c3" /><br/> </fmt:bundle> Execute o arquivo JSP. 174 Grupo Multitecnus© , 2013 Caso surja a janela Server para reiniciar o servidor, clique em OK . 175 Grupo Multitecnus© , 2013 Se tudo ocorrer bem, será produzida a saída abaixo: sendo: Campo 1 Campo 2 Campo 3 produzido por <fmt:setLocale value="pt_BR" />, e Field 1 Field 2 Field 3 produzido por <fmt:setLocale value="en_US" />. 176 Grupo Multitecnus© , 2013 Especificar um idioma sem arquivo .properties, como, o espanhol (value="es"): <fmt:setLocale value="es" /> <fmt:bundle basename="messages" > <fmt:message key="c1" /><br/> <fmt:message key="c2" /><br/> <fmt:message key="c3" /><br/> </fmt:bundle> Faz com que o arquivomessages.properties seja acionado, o que resulta em: 177 Grupo Multitecnus© , 2013 Exemplo 2: Exibir números em um formato especificado: <ftm:formatNumber Parâmetros: value : valor a ser formatado var : variável que receberá o valor numérico formatado minFractionDigits : quantidade mínima de dígitos decimais maxFractionDigits : quantidade máxima de dígitos decimais minIntegerDigits : quantidade mínima de dígitos da parte inteira maxIntegerDigits : quantidade máxima de dígitos da parte inteira groupingUsed : utilizar separador de dígitos (no Brasil, "." a cada 3 dígitos) currencySymbol : símbolo representativo da moeda currencyCode : código de 3 letras baseado no padrão ISO 4217. O real é representado pelo código BRL. pattern : padrão (como os utilizados em planilhas eletrônicas) a ser utilizado na formatação. type : tipo de formatação: currency (moeda), number (número) ou percent (porcentagem) 178 Grupo Multitecnus© , 2013 Os códigos abaixo produzem os resultados respectivos: < fmt:formatNumber type="number" value="89.999" /> : 89,999 <fmt:formatNumber type="number" pattern="000.000" value="9.99" /> : 009,990 < fmt:formatNumber type="number" pattern="#00.000" value="9.99" /> : 09,990 < fmt:formatNumber type="number" pattern="##0.0" value="9.99" /> : 10,0 < fmt:formatNumber type="number" pattern="##00.0#" value="1000" /> : 1000,0 < fmt:formatNumber type="number" maxFractionDigits="2" value="99.999" /> : 100 < fmt:formatNumber type="number" maxFractionDigits="2" value="10.100" /> : 10,1 <fmt:formatNumber type="number" maxFractionDigits="2" value="10.991" /> : 10.99 < fmt:formatNumber type="number" maxIntegerDigits="2" value="99.999" /> : 99,999 < fmt:formatNumber type="number" maxIntegerDigits="2" value="979.999" /> : 79,999 Obs.: Os valores utilizam a notação em ponto flutuante (ponto separando a casa decimal), enquanto que a saída será formatada de acordo com o padrão da localidade (por exemplo, vírgula separando as casas decimais no Brasil). 179 Grupo Multitecnus© , 2013 <fmt:formatNumber type="currency" value="12.34" /> : R$ 12,34 < fmt:formatNumber type="currency" value="12.345" /> : R$ 12,34 < fmt:formatNumber type="currency" value="12.346" /> : R$ 12,35 < fmt:formatNumber type="percent" value="0.10" /> : 10% < fmt:setLocale value="en_US" /> < fmt:formatNumber value="123456789.00" type="currency" /> : $123,456,789.00 < fmt:setLocale value="pt_BR" /> < fmt:formatNumber value="123456789.00" type="currency" /> : R$ 123.456.789,00 < fmt:formatNumber value="123456789.00" type="currency" groupingUsed="true" /> : R$ 123.456.789,00 < fmt:formatNumber value="123456789.00" type="currency" currencySymbol="T#" /> : T# 123.456.789,00 180 Grupo Multitecnus© , 2013 Exemplo 3: Converter strings em número: <fmt:parseNumber Parâmetros: value : valor a ser convertido var : variável que receberá o valor numérico integerOnly: converter apenas o trecho que representa a parte inteira parseLocale : especifica a localidade (formato) pattern : padrão (como os utilizados em planilhas eletrônicas) a ser utilizado na formatação. type : tipo de formatação: currency (moeda), number (número) ou percent (porcentagem) 181 Grupo Multitecnus© , 2013 Por exemplo: a) Criar um arquivo HTML contendo o seguinte: <form action="jstlFmt.jsp" > N1: <input type="text" name="n1" /><br /> N2: <input type="text" name="n2" /><br /> <input type="submit" value="Enviar" /> </form> b) Criar o arquivo jstlFmt.jsp contendo o seguinte: 1) <fmt:parseNumber value="${param.n1}" type="number" /><br /> 2) <fmt:parseNumber value="${param.n1}" type="number" integerOnly="true"/><br /> 3) <fmt:parseNumber value="${param.n2}" type="number" /><br /> c) Executar o arquivo HTML enviando: N1: 123,45 (com a vírgula como separador da casa decimal) N2: 123.45 (com o ponto como separador da casa decimal) produz o seguinte: 1) 123.45 2) 123 3) 12345 182 Grupo Multitecnus© , 2013 Exemplo 4: Formatação de datas: <fmt:formatDate Parâmetros: value : valor a ser convertido var : variável que receberá a data formatada type : data (date), hora (time) ou ambos (both) dateStyle : pode ser: full, long, medium short ou default timeStyle : pode ser: full, long, medium short ou default pattern : padrão (como os utilizados em planilhas eletrônicas) a ser utilizado na formatação. timeZone : fuso horário da data a ser exibida 183 Grupo Multitecnus© , 2013 Pro exemplo, o trecho de código abaixo: <c:set var="d" value="<%=new java.util.Date()%>" /> 1) <fmt:formatDate type="date" dateStyle="medium" value="${d}" /> 2) <fmt:formatDate type="date" value="${d}" /> 3) <fmt:formatDate type="time" value="${d}" /> 4) <fmt:formatDate type="both" value="${d}" /> 5) <fmt:formatDate type="both" dateStyle="short" value="${d}" /> 6) <fmt:formatDate type="both" timeStyle="short" value="${d}" /> 7) <fmt:formatDate type="both" dateStyle="short" timeStyle="short" value="${d}" /><br /> 8) <fmt:formatDate type="both" dateStyle="long" timeStyle="long" value="${d}" /> 9) <fmt:formatDate pattern="dd-MM-yyyy" value="${d}" /> produz o seguinte: 1) 23/11/2012 2) 23/11/2012 3) 10:23:41 4) 23/11/2012 10:23:41 5) 23/11/12 10:23:41 6) 23/11/2012 10:23 7) 23/11/12 10:23 8) 23 novembro de 2012 10h23min41s BRST 9) 23-11-2012 184 Grupo Multitecnus© , 2013 Exemplo 5: Formatação de datas: <fmt:parseDate Parâmetros: value : valor a ser convertido var : variável que receberá a data type : data (date), hora (time) ou ambos (both) dateStyle : pode ser: full, long, medium short ou default timeStyle : pode ser: full, long, medium short ou default pattern : padrão a ser utilizado na formatação. timeZone : fuso horário da data a ser exibida parseLocale : especifica a localidade (formato) 185 Grupo Multitecnus© , 2013 Por exemplo, o trecho de código abaixo: <c:set var="ds" value="23/11/2012" /> <fmt:parseDate value="${ds}" var="d" pattern="dd/MM/yyyy" type="date" /> <fmt:formatDate type="date" dateStyle="medium" value="${d}" /> produz o seguinte: 23/11/2012 Obs.1: O resultado obtido é uma data e não uma string contendo o formato de uma data. Assim, fazer: <c:set var="ds" value="23/11/2012" /> <fmt:parseDate value="${ds}" var="d" pattern="dd/MM/yyyy" type="date" /> equivale a fazer: <c:set var="d" value="<%=new java.util.Date() %>" /> 186 Grupo Multitecnus© , 2013 Obs.2: O parâmetro pattern utiliza: H : hora no formato 24 horas (3 horas da madrugada = 3h e 3 horas da tarde = 15h) h : hora no formato 12 horas (3 horas da madrugada = 3h e 3 horas da tarde = 3h) Assim, assumindo como hora atual: 13h51, o código: <c:set var="d" value="<%=new java.util.Date() %>" /> 1) <fmt:formatDate pattern="dd-MM-yyyy HH:mm:ss" value="${d}" /><br /> 2) <fmt:formatDate pattern="dd-MM-yyyy hh:mm:ss" value="${d}" /> exibe o seguinte: 1) 23-11-2012 13:51:23 2) 23-11-2012 01:51:23 187 Grupo Multitecnus© , 2013 3.2.3.3. JSTL SQL Para utilizar a biblioteca Database, deve-se inserir, no topo do corpo do JSP, o cabeçalho: <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> Por meio desta biblioteca pode-se manipular bancos de dados. 188 Grupo Multitecnus© , 2013 Exemplo: a. Utilizando o MySQL como SGBD: - Criar o BD multitecnus - Criar a tabela produto: CREATE TABLE `multitecnus`.`produto` ( `id` INTEGER(11) NOT NULL AUTO_INCREMENT, `nome` VARCHAR(20) COLLATE latin1_swedish_ci DEFAULT NULL, `preco` DOUBLE(15,3) DEFAULT NULL, PRIMARY KEY USING BTREE (`id`) COMMENT '' ) ENGINE=InnoDB AUTO_INCREMENT=1 AVG_ROW_LENGTH=1638 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci' COMMENT='' ; 189 Grupo Multitecnus© , 2013 - Popular a tabela : INSERT INTO `produto` (`id`, `nome`, `preco`) VALUES (1,'martelo',25.3), (2,'prego',0.05), (3,'alicate',29.8), (4,'chave de fenda',11.45), (5,'fita isolante',5.25); COMMIT; 190 Grupo Multitecnus© , 2013 b. Criar o arquivo context.xml no diretório META-INF com o conteúdo abaixo: <?xml version="1.0" encoding="UTF-8" ?> <Context > <Resource name="DSMultitecnus" auth="Container" driverClassName="com.mysql.jdbc.Driver" type="javax.sql.DataSource" maxActive="20" maxIdle="10" maxWait="100" url="jdbc:mysql://localhost/multitecnus" username="root" password="mysql" description="JSTL - SQL" closeMethod="close" /> </Context> 191 Grupo Multitecnus© , 2013 c. Criar um arquivo JSP com o conteúdo abaixo: <body> <sql:query var="retorno" dataSource="DSMultitecnus" sql="select * from `produto`" /> Produto<br /> <c:forEach var="campo" items="${retorno.rows}"> <p> Id : <c:out value="${campo.id}" /><br /> Nome: <c:out value="${campo.nome}" /><br /> <fmt:formatNumber type="currency" value="${campo.preco}" /> </p> </c:forEach> </body> d. Executar o arquivo JSP. 192 Grupo Multitecnus© , 2013 O arquivo JSP executado produz como saída: Produto Id : 1 Nome: martelo R$ 25.30 Id : 2 Nome: prego R$ : 0.05 Id : 3 Nome: alicate R$ : 29.8 Id : 4 Nome: chave de fenda R$ : 11.45 Id : 5 Nome: fita isolante R$ : 5.25 193 Grupo Multitecnus© , 2013 3.2.3.1. JSTL XML Para utilizar a biblioteca XML, deve-se inserir, no topo do corpo do JSP, o cabeçalho: <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %> Por meio desta biblioteca pode-se manipular dados XML. Antes, porém, copie os arquivos xalan.jar10 e xercesImpl.jar11 para o projeto, incluindo-os em seu CLASSPATH (Build Path -> Add to Build Path). 10Obtido de xalan-j_2_7_1-bin-2jars.zip, disponível em: http://archive.apache.org/dist/xml/xalan-j/binaries/ 11Obtido de xerces-J-bin.2.11.0.zip, disponível em: http://www.apache.org/dist/xerces/j/ 194 Grupo Multitecnus© , 2013 As tags de XML são: parse : analisa dados XML out : exibição de valores (para expressões do tipo XPath12) set : atribui a uma variável o valor de uma expressão XPath if : execução condicional (se) forEach : repetição sobre os nós de um documento XML choose : execução condicional junto com when e otherwise transform : Aplica uma transformação XSL em um documento XML param : define um parâmetro na folha de estilo XSLT 12XPath é uma linguagem de manipulação de nós em arquivos XML. Seus principais operadores são: / e //. Veja mais sobre o assunto em: http://www.w3.org/TR/xpath/ 13XSLT (eXtensible Stylesheet Language Transformation) permite transformar documentos XML em outros documentos XML (como XHTML, por exemplo). Veja mais em: http://www.w3.org/TR/xslt 195 Grupo Multitecnus© ,
Compartilhar