Desenvolvimento WEB I Camila Nunes [email protected] [email protected] Agenda • Servlets • JSP © LES/PUC-Rio 2 Servlets Fundamentos • Alternativa Java para os scripts CGI • Um Servlet é uma classe Java que extende as capacidades de servidores que suportam aplicações através do modelo requestresponse. • Embora servlets possam ser utilizados para responder qualquer tipo de request, geralmente são usados em web servers. A tecnologia Java define uma classe para tratar este tipo de requisição (HttpServlet). © LES/PUC-Rio 4 Servlet x CGI Script • Extensibilidade – Java é orientada a objetos – Servlets foram projetados para serem simples – Arquitetura permite que os Servlets sejam facilmente estendidos • Independência de plataforma – São programas escritos em Java • Performance – São bem mais rápidos que programas CGI – São carregados na memória apenas uma vez – Executam pedidos concorrentemente © LES/PUC-Rio 5 A API de Servlet • A API de Servlet é um conjunto de classes Java que define uma interface padrão entre o cliente web e o servidor web. • • • • • • • java.lang.Object | +----javax.servlet.GenericServlet implements javax.servlet.Servlet | +----javax.servlet.http.HTTPServlet | +----br.com.puc.MeuServlet © LES/PUC-Rio 6 A interface Servlet • javax.servlet.Servlet – destroy() • Método chamado pelo container onde o servlet está sendo executado para indicar que o servlet terminou. – getServletConfig() • Método que retorna um objeto ServletConfig, que contém os parametros de inicializacao passados no arquivo web.xml – getServletInfo() • Retorna informações sobre a aplicação, como autor, versão e copyright. – init(ServletConfig config) • Metodo chamado na inicialização do servlet. – service(ServletRequest req, ServletResponse res) • Método que trata as requisições feitas a um servlet bem como a criação das respostas. A implementação para HTTP • javax.servlet.http.HttpServlet – Deve-se estender os 2 métodos abaixo para tratar requisições do tipo POST e GET. • doGet • doPost Arquitetura Básica Servidor Web Browser Servlet BD Arquitetura Básica NewClass7 NewClass3 NewClass NewClass2 HTTP browser NewClass8 NewClass9 NewClass10 Servlet NewClass5 © LES/PUC-Rio NewClass6 NewClass4 10 HttpServlet • Tratador de requisições HTTP • Trata métodos HTTP específicos: – doGet(HttpServletRequest req, HttpServletResponse resp) – doPost(HttpServletRequest req, HttpServletResponse resp) • doGet e doPost são chamados pelo método service() da interface Servlet. • Subclasses reescrevem os métodos doGet, doPost e podem reescrever os métodos init() e destroy() © LES/PUC-Rio 11 HttpServletRequest e HttpServletResponse • Os métodos doGet(), doPost() recebem dois parâmetros: – HttpServletRequest • encapsula os parâmetros da requisição – HttpServletResponse • encapsula a resposta ao cliente © LES/PUC-Rio 12 HttpServletRequest • Interface que encapsula a requisição feita pelo cliente através do protocolo HTTP • Possui métodos que permitem recuperar os dados da requisição: – cabeçalho – dados de formulários ou parâmetros enviados – informações sobre a sessão do cliente © LES/PUC-Rio 13 HttpServletRequest • Alguns métodos definidos em HttpServletRequest – Manipulação de Parâmetros • java.util.Enumeration getParameterNames() – Obtém listagem, contendo nomes de parâmetros da requisição • java.lang.String[] getParameterValues(java.lang.String name) – Obtém valores do parâmetro “name” da requisição • java.lang.String getParameter(java.lang.String name) – Obtém valor do parâmetro “name” da requisição – Manipulação de Atributos • void setAttribute( java.lang.String name, java.lang.Object) – Coloca ou sobreescreve atributo no request identificado por “name” • java.util.Enumeration getAttributesNames() – Obtém listagem, contendo nomes de atributos da requisição • java.lang.String getAttribute(java.lang.String name) – Obtém valor do atributo “name” da requisição © LES/PUC-Rio 14 HttpServletResponse • Interface que encapsula a resposta ao cliente • Possui um método responsável por recuperar o canal de resposta com o cliente – getWriter() • retorna um PrintWriter • Ex: PrintWriter out = response.getWriter(); out.println( “Escrevendo no cliente” ); • Também é possível configurar qual é o tipo dos dados que estão sendo enviados de volta ao cliente – setContentType( String type ) – Os tipos mais comuns são text/html, text/xml – O método setContentType deve ser chamado antes do método getWriter © LES/PUC-Rio 15 Hello World! Hello World! © LES/PUC-Rio 16 Segundo Exemplo © LES/PUC-Rio 17 Gerenciamento de sessão (I) • O protocolo HTTP é um protocolo sem estado • Não é possível a princípio conhecer o estado do cliente anterior à uma requisição • O gerenciamento de sessão provê uma maneira de identificar usuários através de várias requisições HTTPs e recuperar suas informações – Dados do estado do cliente • Para obter uma sessão: • HttpSession getSession() – Obtém sessão existente, caso não exista retorna uma nova sessão. • HttpSession getSession(boolean create) – Obtém sessão existente ou cria uma nova sessão dependendo do valor de o parâmetro create • Funciona a base de cookie ou reescrita de URL © LES/PUC-Rio 18 Gerenciamento de sessão (II) • Principais métodos – Métodos para manipulação de objetos em sessão • void removeAttribute(java.lang.String name) – Retira objeto da sessão • void setAttribute(java.lang.String name, java.lang.Object value) – Coloca ou sobreescreve objeto na sessão identificado por name • java.lang.Object getAttribute(java.lang.String name) – Obtém objeto da sessão • java.util.Enumeration getAttributeNames() – Obtém os nomes de todos os objetos armazenados na sessão © LES/PUC-Rio 19 Gerenciamento de sessão (III) • Tempo de duração da sessão – As sessões em geral têm intervalo máximo de tempo que podem ficar inativas – public int getMaxInactiveInterval() – public void setMaxInactiveInterval(int interval) • As sessões também podem ser encerradas explicitamente pelo programador: – public void invalidate() © LES/PUC-Rio 20 Jakarta Tomcat • Servidor gratuito baseado em java • Configurável de maneira simples via XML • Oferece suporte a Java (Servlets e JSP) © LES/PUC-Rio 21 Jakarta Tomcat • Você irão precisar do Tomcat – Pode ser gratuitamente obtido em http://www.apache.org – Utilizem a versão 5.x ou superior © LES/PUC-Rio 22 Publicação de Servlets • Imagine que você implementou um Servlet, gerou o .java e compilou para ter o .class. • E agora? Como o Servlet é publicado no servidor? • Na verdade, existe um local para colocar as classes de sua aplicação © LES/PUC-Rio 23 Configurando o Tomcat • Onde colocar as classes dos Servlets? – Primeiro, é preciso criar uma aplicação web • Cria-se um diretório em %TOMCAT_HOME%\webapps\, sem espaços no nome. • Dentro desse diretório, cria-se a pasta WEB-INF • Dentro de WEB-INF, criam-se 2 pastas: lib e classes • Dentro de WEB-INF, cria-se o arquivo web.xml (deployment descriptor web) Obs: TOMCAT_HOME é o nome do diretório aonde está sua instalação do TomCat © LES/PUC-Rio 24 Configurando o Tomcat • O arquivo web.xml deverá ter conteúdo similar ao presente em %TOMCAT_HOME%webapps\ROOT\WEB-INF – Trata-se de um arquivo já pronto, que servirá como base para a criação de nosso arquivo © LES/PUC-Rio 25 Configurando o Tomcat • As classes são colocadas no diretório: – %TOMCAT_HOME%\webapps\DIRETÓRIO_APLICAÇÃO\WEBINF\classes – A partir deste diretório devem ser colocadas em seus próprios pacotes • As libs (arquivos .jar) devem ser colocadas no diretório: – %TOMCAT_HOME%\webapps\DIRETÓRIO_APLICAÇÃO\WEB-INF\lib © LES/PUC-Rio 26 Configurando o Tomcat • Registrando os Servlets – Os servlets devem ser chamados com seu nome completo (pacotes e classe) – Muitas vezes o nome se torna grande demais – Pode-se então dar um nome ao servlet através do qual o servidor redirecionará a chamada à classe específica © LES/PUC-Rio 27 Configurando o Tomcat • Registrando Servlets (1) – O arquivo web.xml • Localizado no diretório: – %TOMCAT_HOME%\webapps\DIRETÓRIO_APLICAÇÃO\WEB-INF © LES/PUC-Rio 28 Configurando o Tomcat • Registrando Servlets (2) <web-app> <servlet> <servlet-name>ServletSes</servlet-name> <servlet-class>interfPesquisa.ServletSes</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletSes</servlet-name> <url-pattern>/exemplo</url-pattern> <servlet-mapping> </web-app> © LES/PUC-Rio 29 Configurando o Tomcat • Agora, o servlet poderá ser acessado através da URL: http://<host>:<porta>/DIRETÓRIO_APLICAÇÃO/exemplo © LES/PUC-Rio 30 Configurando o Tomcat • Outras configurações – O arquivo server.xml • Localizado no diretório: – %TOMCAT_HOME%\conf – Configuração da porta do servidor: <Connector className="org.apache.tomcat.service.SimpleTcpConnector"> … <Parameter name="port" value="8081"/> </Connector> © LES/PUC-Rio 31 Java Server Pages (JSP) O que é JSP • JSP é uma tecnologia que permite combinar informações estáticas com informações geradas dinamicamente. • Script executado no servidor: – Combinação de sintaxe JSP e tags de marcação – Tags estáticas • HTML, XML – Conteúdo dinâmico gerado pelo código do script • Java • Exemplo: – <HTML><HEAD><TITLE>Primeiro JSP</TITLE></HEAD> – <BODY><H1>Data e hora: – <%= new java.util.Date() %></H1> – </BODY></HTML> © LES/PUC-Rio 33 Escopo dos Atributos • O JSP pode acessar objetos em tempo de execução em quatro escopos diferentes: – Página • Objeto PageContext corrente (pageContext) – Requisição • Objeto HttpServletRequest corrente (request) – Sessão • Objeto HttpSession corrente (session) – Aplicação • Objeto ServletContext corrente (servletContext) • Para armazenar informações: setAttribute(String, Object) • Para recuperar informações: getAttribute(String) © LES/PUC-Rio 34 Tags JSP • Diretivas – Configuração do processador JSP – Inclusão estática de conteúdo – Encaminhamento de requisições para outros servidores • Comandos de script – Inserção de código para a programação de conteúdo dinâmico • Tags – Tags de alto nível que encapsulam padrões de programação mais corriqueiros © LES/PUC-Rio 35 Diretivas • <%@ nome-da-diretiva [nome-atributo = “valor-do-atributo”]* %> • Diretivas disponíveis: – <%@ include file=“url-relativa” %> – <%@ taglib uri=“url-relativa-da-biblioteca-de-tags” prefix=“prefixo-das-tags” %> – <%@ page lista-de-atributos %> © LES/PUC-Rio 36 Atributos da Diretiva Page • language=“nome-da-linguagem-de-script” • info=“texto-informativo” - getServletInfo() • session=“true | false” • import=“lista-de-pacotes” • errorPage=“url-página-de-erro” • isErrorPage=“true | false” • contentType=“mime-type | mime-type; charset=nomecharset” • buffer=“none|tamanho-em-kb” • auto-flush=“true | false” • extends=“nome-da-classe-base” • isThreadSafe=“true | false” © LES/PUC-Rio 37 Exemplos de Diretivas • Diretiva Include • Diretiva Taglib © LES/PUC-Rio 38 Exemplos de Diretivas • Diretiva Page • Ou © LES/PUC-Rio 39 Tags de Script • Declarações – <%! declaração %> • Scriptlets – <% comandos %> • Expressões – <%= expressão %> • Comentários – <!-- comentário html --> – <%-- comentário jsp --> © LES/PUC-Rio 40 Declarações • <%! declarações %> Exemplos: <%! int i = 0; public void metodo {...} %> <%! int a, b, c; %> <%! Circle a = new Circle(2.0); %> Declara variáveis ou métodos a serem utilizados no código JSP. © LES/PUC-Rio 41 Scriptlets • <% fragmento_de_código_válido %> Exemplo: <% String name = null; if (request.getParameter(“nome") == null) { %> <%@ include file="error.html" %> <% } else { foo.setName(request.getParameter(“nome")); } %> Um scriptlet pode conter qualquer número de instruções, variáveis, métodos, declarações ou expressões válidos. © LES/PUC-Rio 42 Expressão • <%= expressão %> Exemplo: O mapa tem <font color="blue"><%= mapa.getCount() %></font> entradas. Esta tag contém uma expressão que é avaliada e convertida para string, depois de processada. © LES/PUC-Rio 43 Comentários • <!-- comentário [ <%= expressão %> ] --> Exemplo: <!-- Comentário --> <!-- Esta página foi carregada em <%= (new java.util.Date()).toLocaleString() %> --> O processador JSP trata um comentário como texto HTML não interpretado, retornando-o ao cliente. Uma expressão pode ser incluída em um comentário, sendo avaliada e seu resultado é retornado ao usuário juntamente com o HTML de resposta. © LES/PUC-Rio 44 Comentários para Desenvolvimento • <%-- comentário --%> Exemplo: <%@ page language="java" %> <html> <head><title>Um teste - comentário</title></head> <body> <h2>Um teste - comentário</h2> <%-- Este comentário não estará disponível para o cliente --%> </body> </html> O processador JSP simplesmente ignora este tipo de comentário e não processa nenhum código ou expressão contida entre os delimitadores. Este tipo de comentário não será enviado para o cliente. © LES/PUC-Rio 45 Objetos Pré-Definidos • Disponíveis para scriplets e expressões – request – response – session – out – exception (somente em páginas de erro) – page © LES/PUC-Rio 46 Exemplo JSP © LES/PUC-Rio 47 Tags • jsp:useBean • jsp:setProperty • jsp:getProperty • jsp:include • jsp:forward © LES/PUC-Rio 48 jsp:useBean • Cria ou recupera uma instância de um bean. • <jsp:useBean lista_de_atributos> • Principais atributos – id: “nomeDaInstânciaDoBean” – scope:”page|request|session|application” – class: “*{pacotes}.NomeClasse” • Exemplo: © LES/PUC-Rio 49 jsp:include e jsp:forward • Ações utilizadas para o encadeamento de páginas jsp. • <jsp:include page=“url-relativa-da-página” /> – suspende o processamento da página chamadora; – repassa o controle para a página chamada até que o retorne. • <jsp:forward page=“url-relativa-da-página” /> – o processamento da página chamadora é terminado; – controle repassado sem espera de retorno para a página chamada. © LES/PUC-Rio 50 jsp:include • <jsp:include page="{URLrelativa |<%=expressão%>}"/> Exemplo: © LES/PUC-Rio 51 jsp:forward • <jsp:forward page="{URLrelativa|<%=expressão%>}"/> Exemplo: A tag <jsp:forward> repassa o objeto request enviado para o arquivo JSP para que seja processado por outra aplicação. O processador JSP não executa o restante das instruções contidas após a tag. © LES/PUC-Rio 52 JSP Standard Tag Library • A JSTL encapsula tarefas comumente encontradas em aplicações web (iteração, manipulação de xml, etc). • Versão JSTL (Java 1.4) lançada em meados de 2002 impulsionou o desenvolvimento com JSP. • Requer servlet container que suporte Servlet 2.4 and JSP 2.0 (tomcat 5.x) • Provê 4 standard Tag Libs: – core, internationalization/format, XML, and SQL • Provê uma Expression Language (EL). © LES/PUC-Rio 53 JSTL EL © LES/PUC-Rio 54 JSTL – Core Tag Lib > © LES/PUC-Rio 55 JSTL - Format tag lib © LES/PUC-Rio 56