1 Programação para Web em Java II Prof. Maurício Rodrigues de Morais [email protected] 2 Aula 2 e 3 Principais elementos na camada Web 3 Conteúdo Principais elementos da camada Web Programando para a web Uma visão mais detalhada de Servlets JSPs na prática Usando taglibs 4 Programando para a Web A criação de aplicativos web utilizando Java faz uso maciço dos conceitos de orientação a objetos. Naturalmente distribuídas, as aplicações web necessitam que a arquitetura componentizada seja bem definida. Um modelo muito utilizado é o de camadas, no qual são separados elementos de visualização, controle e modelo. Esse é um padrão de projeto conhecido como MVC (Model, View, Controller) 5 Programando para a Web Um aplicativo web com java 6 Programando para a Web Em um aplicativo java para a web, o servido de aplicações tem um papel fundamental. É ele quem faz a ligação entre os elementos criados pelo programador e as solicitações dos usuários. Para que isso funcione, é necessário que a aplicação seja disponibilizada, dentro do servidor de aplicações, em uma estrutura de diretórios padronizada. Além disso, é necessário que se escreva um arquivo de configuração - a ser lido pelo servidor - que descreva a forma como este vai interagir com a aplicação. A tarefa de publicar uma aplicação java em um servidor é chamada de Deploy. 7 Programando para a Web O deploy dever ser feito da seguinte forma: 1. Criar um diretório que deverá ter o nome da aplicação. Este diretório deverá estar dentro da pasta $<tomcat_home>\webapps 2. Dentro desse diretório, deverá ser criada uma pasta WEB-INF e, dentro dessa, uma pasta classes e outra lib. A pasta WEB-INF\classes conterá as classe java compiladas da aplicação. Já a pasta WEB-INF\lib conterá eventuais bibliotecas utilizadas 3. Ainda dentro do diretório WEB-INF, deverá ser criado um arquivo web.xml, também chamado deployment descriptor, que conterá as configurações da aplicação para publicação no servidor (container) 8 Tecnologias para o desenvolvimento web Estrutura de pastas no Tomcat 9 Tecnologias para o desenvolvimento web Exemplo de arquivo de deploy (web.xml) 10 Programando para a Web Uma vez instalado o aplicativo no tomcat, ele poderá ser acessado a partir de um browser, utilizando-se como URL o endereço IP da máquina, a porta padrão 8080 e o nome da aplicação. Por exemplo: aplicação> http://localhost:8080/<nome 11 da Uma visão mais detalhada de Servlets Como já foi dito, as servlets são componentes instalados no servidor de aplicação e que são acionados por este em resposta a uma requisição do usuário. A definição sobre qual servlet responderá a qual requisição é feita no arquivo de deploy (web.xml). As classes servlet são providas pelos pacotes javax.servlet e javax.servlet.http (ambos da distribuição JEE). Esses pacotes contem as classes e interfaces necessárias para a criação de aplicativos web. 12 Tecnologias para o desenvolvimento web Pacotes Java para servlets 13 Uma visão mais detalhada de Servlets A interface javax.servlet.Servlet é que provê o padrão da programação Servlet, fazendo o papel de abstração geral da tecnologia. Todo servlet acaba por implementar essa interface, ainda que indiretamente. A interface possui 5 métodos importantes: – init (ServletConfig conf) – chamado pelo servidor de aplicação para iniciar o servlet – service( ServletRequest req, ServletResponse res) – chamado em resposta a requisições repassadas pelo servidor de aplicação. – destroy() - chamado pelo servidor de aplicação para a destruição do servlet. – ServletConfig getServletConfig() - retorna um objeto de configurações do servlet – String getServletInfo() - quando chamado, deve retornar 14 informações sobre o servlet. Uma visão mais detalhada de Servlets O ciclo de vida do servlet inicia-se quando o servidor de aplicação carrega o servlet em sua iniciação. Nesse momento, é chamado o método init(). Durante o tempo em que o servidor de aplicação estiver no ar, qualquer chamada que for redirecionada ao servlet acionará o método service(), que contém a lógica interna do aplicativo. Quando for solicitado o desligamento do servidor de aplicação, este chamará o método destroy do servlet, a fim de liberar eventuais recursos que tenham sido alocados. 15 Uma visão mais detalhada de Servlets O método service é onde a magia da servlet acontece. Esse método recebe dois parâmetros essenciais dos ServletRequest e o ServletResponse, um representando a requisição e o outro a resposta http. A classe ServletRequest possui uma série de métodos que possibilitam a extração dos dados enviados pelo usuário e que deverão ser processadas pelo servlet. A classe ServletResponse possibilita uma forma de comunicação com o cliente, seja disponibilizando dados que deverão ser exibidos, ou mesmo o próprio código HTML da resposta. 16 Tecnologias para o desenvolvimento web Exemplo de um servlet simples 17 Uma visão mais detalhada de Servlets No pacote javax.servlet.http estão os componentes servlet voltados especificamente para o protocolo HTTP. Normalmente, são essas que utilizamos para aplicativos web. Assim, o conjunto de classes a ser utilizado passa a ser HttpServlet, HttpServletRequest e HttpServletResponse. Em atendimento as especificidades do protocolo HTTP, a classe HttpServlet permite a implementação de alguns métodos específicos, de acordo com os métodos HTTP. São eles: doGet(), doPost(), doHead(), doPut(), doDelete(), doTrace() e doOptions(). Todos esses método são chamados a partir do método service(). 18 Tecnologias para o desenvolvimento web Exemplo de um HttpServlet 19 Tecnologias para o desenvolvimento web Para se testar um servlet como esse, seria possível utilizar uma página como: Um clique no link “Chamar TesteServlet via GET” acionaria o método doGet(), enquanto um clique no botão “Chamar via POST” acionaria o método doPost(). 20 Uma visão mais detalhada de Servlets O acesso às informações enviadas pelo usuário na requisição é feito por uma série de métodos da classe HttpServletRequest. Existem 6 métodos importantes: 21 Uma visão mais detalhada de Servlets A devolução de dados ao usuário é feita a partir da classe HttpServletResponse. Existem 9 métodos importantes: 22 Uma visão mais detalhada de Servlets Em alguns casos, é necessário apresentar ao usuário uma página HTML ou JSP já existente. Esse envio é chamado de dispatch e utiliza uma classe chamada RequestDispatcher. Exemplo: 23 Uma visão mais detalhada de Servlets Quando, em resposta a solicitação, se deseja enviar dados ao usuário (normalmente para uso por um JSP), é utilizado um método específico da classe HttpServletRequest: – void setAttribute(String nome, Object valor) – Adiciona o objeto valor à sessão, associando-se ao nome informado. Para ser recuperado o dado, o JSP utiliza um outro método da classe HTTPServletRequest: – Object getAttribute(String nome) – Busca na sessão um objeto que seja referenciado pelo nome informado. 24 JSP na prática Uma página JSP permite mesclar códigos HTML e códigos Java. Normalmente, são utilizadas para a criação de páginas dinâmicas a partir de informações processadas e enviadas por servlets. Os blocos de código Java existentes nas páginas JSP são chamados de scriptlets e são demarcados por tags bem definidas <% e %>. Desse modo, é possível retirar o código HTML de dentro do servlet (que, de outro modo, teria que ser enviado por lá) e tornar a edição das páginas mais amigável. Cada JSP, ao ser compilada pelo servidor de aplicação, torna-se uma servlet. Mas, tudo isso ocorre de maneira transparente para o programador. 25 Uma visão mais detalhada de Servlets Exemplo de um JSP simples: 26 Uma visão mais detalhada de Servlets O JSP apresentado seria equivalente ao seguinte servlet: 27 JSP na prática Os scriptlets podem ser usados de duas formas: – Para a inclusão de código java puro: <% String nome = “Maria Madalena”; out.println(nome); %> – Para a exibição do valor de uma variável já declarada: <%=nome%> 28 JSP na prática Tal como na programação Java convencional, ao ser necessária a utilização de alguma classe, deverá ser feito um import da mesma. Para isso, é utilizada um diretiva logo no início do arquivo JSP com a seguinte sintaxe: – <%@ page language=”java” import=”java.util.Date” %> Outra diretiva permite que se componha a página JSP com a inclusão de outros blocos JSP ou HTML. Para isso, é utilizada a diretiva include: <%@ include file=”outraPagina.html” %> Há ainda mais uma diretiva útil, que permite a configuração de uma página padrão para o tratamento de erros: <%@ page errorPage=”erro.jsp” %> 29 JSP na prática Páginas JSP possuem acesso a objetos implícitos similares aos utilizados explicitamente em servlets. Esses objetos permitem a interação com informações importantes da requisição e resposta: 30 JSP na prática Exercícios (crie novas versões do programas feitos no módulo anterior para uma versão web) – Crie um programa que escreva na tela a frase “Olá Mundo” – Crie um programa que leia uma mensagem do usuário e escreva de volta esta mesma mensagem – Crie um programa que leia do usuário 2 números inteiros e devolva o valor da soma dos mesmos – Crie um programa que leia do usuário 2 números inteiros e o símbolo de uma das quatro operações aritiméticas, efetue a operação e devolva o resultado – Crie um programa que preencha um vetor de 10 posições, exiba-o, ordene-o e exiba-o novamente já ordenado. 31 Usando TagLibs A tecnologia JSP permite que se crie facilmente páginas dinâmicas. Mas, pode trazer problemas: – Dificuldade em construir páginas bem organizadas – Páginas JSP com muito código Java – Webdesigners se assustam com scriptlets – Problemas na interação entre programadores e webdesigners Em contrapartida, o que seria ideal: – Criar páginas dinâmicas complexas e sem scriptlets – Utilizar tags que minimizem e simplifiquem a construção – Facilitar a interação entre programadores e webdesigners A solução é usar TAGLIBs 32 Usando TagLibs Existem vários pacotes de tags criados por várias pessoas ou comunidades. Porém a arquitetura padrão de Java já provê alguns pacotes que tornam a escrita de JSPs muito mais simples. Esse conjunto de tags é chamado JSTL (JSP Standard Tag Library). JSTL é uma coleção de bibliotecas, com propósitos bem definidos, que permitem escrever páginas JSP sem código Java, tornando o código mais legível e evitando problemas de comunicação entre programadores e webdesigners. Cada tag realiza um determinado processamento, que seria equivalente a um scriptlet. Cada tag está ligada a uma biblioteca e é possível utilizar mais de uma biblioteca no mesmo JSP. 33 Usando TagLibs Exemplo de uma página JSP com JSTL: 34 Usando TagLibs No exemplo atenção: apresentado, 4 linhas chamam a <%@ taglib prefix=”fmt” uri=”http://java.sun.com/jsp/jstl/fmt” %> Utilizado para declarar a biblioteca a ser usada; – <jsp:useBean id=”agora” class=”java.util.Date” /> Utilizado para a criação de um objeto ou o uso de um que esteja em algum escopo (request ou session) – <fmt:formatDate value=”${agora}” /> Utilizado para formatar a informação do tipo Date – <fmt:formatDate value=”${agora}” dateStyle=”full”/> Utilizado para formatar a informação do tipo Date, utilizando o formato longo. – 35 Usando TagLibs Nas últimas duas linhas é apresentada também uma construção ainda desconhecida: ${agora} Esse tipo de construção (EL – Expression Language) permite que se acesse o valor de qualquer expressão, inclusive com o uso de alguns operadores: 36 Usando TagLibs Exemplos de E-L 37 Usando TagLibs As bibliotecas padrão da tecnologia JSTL são: 38 Usando TagLibs Taglibs mais utilizadas: – Tag <c:forEach> Permite a execução de loops (iteração) similar aos comandos for e while. – Tag <c:forTokens> – Permite quebrar uma String maior em várias substrings separadas por um delimitador. Além disso, percorre a lista de substrings. – Tag <c:if> – Permite a execução de desvios condicionais, similares ao comando If. 39 Usando TagLibs Taglibs mais utilizadas: – Tag <c:import> Permite a importação de páginas web já prontas. – Tag <c:set> Permite alterar o valor de uma variável armazenada em memória (request ou session). – – Tag <c:if> Permite a execução de desvios condicionais, similares ao comando If. 40 Usando TagLibs A lista completa de tags proporciona ainda mais funcionalidades: 41 Usando TagLibs Exercícios (crie novas versões do programas feitos anteriormente, utilizando JSTL) – – – – Crie um programa que leia uma mensagem do usuário e escreva de volta esta mesma mensagem Crie um programa que leia do usuário 2 números inteiros e devolva o valor da soma dos mesmos Crie um programa que leia do usuário 2 números inteiros e o símbolo de uma das quatro operações aritiméticas, efetue a operação e devolva o resultado Crie um programa que preencha um vetor de 10 posições, exiba-o, ordene-o e exiba-o novamente já ordenado. 42