Desenvolvimento de Sistemas Web - ?· Quando o servidor recebe uma requisição, ela é repassada para…

  • Published on
    11-Nov-2018

  • View
    212

  • Download
    0

Embed Size (px)

Transcript

<ul><li><p>Desenvolvimento de Sistemas Web</p><p>Introduo</p><p>Prof. Fellipe Aleixo (fellipe.aleixo@ifrn.edu.br)</p></li><li><p>Modelo de Aplicaes Web</p><p> Modelo cliente-servidor</p><p> Clientes so navegadores Web</p><p> Servidores estendem a funcionalidade de servidores Web</p></li><li><p>Protocolo HTTP</p><p> Protocolo baseado no modelo requisio-resposta</p><p> Protocolo sem estado</p><p> Requisies HTTP - GET, POST, PUT, etc.</p><p> Retorno textual baseado em HTML ou outros contedos MIME</p></li><li><p>CGI-BIN</p><p> Possibilidade de invocar "comandos" atravs de requisies HTTP</p><p> Base para uns srie de tecnologias para desenvolvimento de sistemas Web</p></li><li><p>Frameworks de Desenvolvimento Web</p><p> Java Tecnologia de Servlet (interface Java)</p><p> Evolues na forma de JavaServer Pages e JavaServer Pages</p><p> Rails Framework para o desenvolvimento de aplicaes </p><p>Web em Ruby</p><p> Linguagem de script orientada a objetos</p><p> Aplicao do modelo MVC</p></li><li><p>Modelo MVC</p><p> Model-View-Controller</p></li><li><p>Controle de Sesses</p><p> Supre uma deficincia do protocolo HTTP (no guardar informaes de estado do cliente)</p></li><li><p>Cookies</p></li><li><p>SERVLETSTecnologia de Servlets</p></li><li><p>O que so Servlets?</p><p> Extenso de servidor escrita em Java Podem ser usados para estender qualquer tipo de aplicao do </p><p>modelo requisio-resposta</p><p> Todo servlet implementa a interface javax.servlet.Servlet Tipicamente estende GenericServlet</p><p> Servlets HTTP Extenses para servidores Web</p><p> Estendem javax.servlet.http.HttpServlet</p><p> Lidam com caractersticas tpicas do HTTP como mtodos GET, POST, Cookies, etc.</p></li><li><p>API: Fundamental</p><p> Principais classes e interfaces de javax.servlet Interfaces</p><p> Servlet, ServletConfig, ServletContext Filter, FilterChain, FilterConfig ServletRequest, ServletResponse SingleThreadModel RequestDispatcher</p><p> Classes abstratas GenericServlet</p><p> Classes concretas ServletException UnavailableException ServletInputStream e ServletOutputStream</p></li><li><p>Ciclo de Vida</p><p>1. Quando o servidor recebe uma requisio, ela repassada para o container que a delega a um servlet</p><p>2. O container1. Carrega a classe na memria2. Cria uma instncia da classe do servlet3. Inicializa a instncia chamando o mtodo init()</p><p>3. Depois que o servlet foi inicializado, cada requisio executada em um mtodo service()</p><p>1. O container cria um objeto de requisio (ServletRequest) e de resposta (ServletResponse) e depois chama service() passando os objetos como parmetros</p><p>2. Quando a resposta enviada, os objetos so destrudos</p><p>4. Quando o container decidir remover o servlet da memria, ele o finaliza chamando destroy()</p></li><li><p>Ciclo de Vida</p><p>[Argonavis]</p></li><li><p>Como Escrever um Servlet?</p><p> Um servlet genrico deve estender GenericServlet e seu mtodo service()</p><p>import javax.servlet.*;</p><p>import java.io.*;</p><p>public class Generico extends GenericServlet {</p><p>public void service (ServletRequest request, ServletResponse response)</p><p>throws IOException {</p><p>PrintWriter out = response.getWriter();</p><p>out.println("Hello, World!");</p><p>out.close();</p><p>}</p><p>}</p></li><li><p>Inicializao de um Servlet</p><p> Inicializao: sobrescrever o mtodo init(config) com Carregar parmetros de inicializao, dados de configurao</p><p> Obter outros recursos</p><p> Falha na inicializao deve provocar UnavailableException (subclasse de ServletException)</p><p>public void init(ServletConfig config)</p><p>throws ServletException {</p><p>String dirImagens = config.getInitParameter("imagens");</p><p>if (dirImagens == null) {</p><p>throw new UnavailableException(</p><p>"Configurao incorreta!");</p><p>}</p><p>}</p></li><li><p>Finalizao</p><p> Quando um continer decide remover um servlet da memria, ele chama o seu mtodo destroy() Com o objetivo de liberar recursos (ex.: conexo de banco de dados)</p><p> O servlet geralmente s destrudo quando todos os seus mtodos service() terminaram ou depois de um timeout</p><p>public void destroy() {</p><p>banco.close();</p><p>banco = null;</p><p>}</p></li><li><p>Mtodos de Servio</p><p> Implementam operaes de resposta executadas quando o cliente envia uma requisio</p><p> Recebem dois parmetros: um objeto ServletRequeste outro ServletResponse</p><p> Tarefas usuais de um mtodo de servio Extrair informaes da requisio Acessar recursos externos Escrever a resposta (HTTP (i) preencher os cabealhos </p><p>de resposta, (ii) obter um stream de resposta e (iii) escrever os dados no stream</p></li><li><p>Mtodos de Servio</p><p> O mtodo de servio de um servlet genrico abstratopublic void service(ServletRequest, ServletResponse)</p><p>definido em javax.servlet.Servlet.</p><p> Sempre que um servidor repassar uma requisio a um servlet, ele chamar o mtodo service(request, response)</p><p> Um servlet genrico dever sobrepor este mtodo e utilizar os objetos ServletRequest e ServletResponse</p></li><li><p>Servlets Genricos</p><p> Servlets genricos servem como componentes para servios tipo requisio-resposta em geral No se limitam a servios HTTP</p><p> Podem ser usados para estender um servio existente: preciso implementar um "container" para rodar o servlet</p><p> Para servios Web deve-se usar Servlets HTTP API criada especificamente para lidar com caractersticas </p><p>prprias do HTTP</p><p> Mtodo service() dividido em mtodos especficos para tratar os diferentes mtodos do HTTP</p></li><li><p>API: Servlets HTTP</p><p> Classes e interfaces mais importantes do pacote javax.servlet.http Interfaces</p><p> HttpServletRequest</p><p> HttpServletResponse</p><p> HttpSession</p><p> Classes abstratas HttpServlet</p><p> Classes concretas Cookie</p></li><li><p>Como Escrever um Servlet HTTP</p><p> Para escrever um servlet HTTP, deve-se estender HttpServlet e implementar um ou mais de seus mtodos de servio e anotar com @WebServlet para mapear uma URL</p><p>import javax.servlet.annotation.WebServlet;</p><p>import javax.servlet.http.HttpServlet;</p><p>import java.io.PrinterWriter;</p><p>@WebServlet(/hello)</p><p>public class ServletWeb extends HttpServlet {</p><p>public void doGet (HttpServletRequest request,</p><p>HttpServletResponse response)throws IOException {</p><p>response.setContentType("text/html");</p><p>PrintWriter out = response.getWriter();</p><p>out.println("Hello, World!");</p><p>out.close();</p><p>}</p><p>}</p></li><li><p>Mtodos de Servio HTTP</p><p> A classe HttpServlet redireciona os pedidos encaminhados para service() para mtodos que refletem os mtodos HTTP (GET, POST, etc.):public void doGet(HttpServletRequest, HttpServletResponse)</p><p>public void doPost(HttpServletRequest,HttpServletResponse)</p><p>...</p><p> Um servlet HTTP dever implementar pelo menos um dos mtodos doGet() ou doPost()</p></li><li><p>Mtodos de Servio HTTP</p></li><li><p>Inicializao</p><p> A inicializao de um HttpServlet, pode (e deve) ser feita com a verso de init() sem argumentos</p><p> Todos os mtodos de config esto no servlet, pois GenericServlet implementa ServletConfig</p><p>public void init() throws ServletException {</p><p>String dirImagens = getInitParameter("imagens");</p><p>if (dirImagens == null) {</p><p>throw new UnavailableException ("Configurao incorreta!");</p><p>}</p><p>}</p></li><li><p>Parmetros de Inicializao</p><p>exemploexemplo.PrimeiroServlet</p><p>JDBCDriversun.jdbc.odbc.JdbcOdbcDriver</p><p>1</p></li><li><p>A Requisio HTTP</p><p> Uma requisio HTTP feita pelo browser tipicamente contm vrios cabealhos RFC822*</p><p> Os mtodos de HttpServletRequest permitem extrair informaes de qualquer um deles Pode-se tambm identificar o mtodo e URL</p></li><li><p>Obteno de Dados de Requisies</p><p> Alguns mtodos de HttpServletRequest1. Enumeration getHeaderNames() - obtm nomes dos cabealhos</p><p>2. String getHeader("nome") - obtm primeiro valor do cabealho</p><p>3. Enumeration getHeaders("nome") - todos os valores do cabealho</p><p>4. String getParameter(param) - obtm parmetro HTTP</p><p>5. String[] getParameterValues(param) - obtm parmetros repetidos</p><p>6. Enumeration getParameterNames() - obtm nomes dos parmetros</p><p>7. Cookie[] getCookies() - recebe cookies do cliente</p><p>8. HttpSession getSession() - retorna a sesso</p><p>9. setAttribute("nome", obj) - define um atributo obj chamado "nome</p><p>10. Object getAttribute("nome") - recupera atributo chamado nome</p><p>11. String getRemoteUser() - obtm usurio remoto (se autenticado, caso contrrio devolve null)</p></li><li><p>A Resposta HTTP</p><p> Uma resposta HTTP enviada ao browser e contm informaes sobre os dados anexados</p><p> Os mtodos de HttpServletResponse permitem construir um cabealho</p></li><li><p>A Resposta HTTP</p><p> Alguns mtodos de HttpServletResponse1. addHeader(String nome, String valor) - adiciona cabealho HTTP2. setContentType(tipo MIME) - define o tipo MIME que ser usado </p><p>para gerar a sada (text/html, image/gif, etc.)3. sendRedirect(String location) - envia informao de </p><p>redirecionamento para o cliente (Location: url)4. Writer getWriter() - obtm um Writer para gerar a sada. Ideal para </p><p>sada de texto.5. OutputStream getOutputStream() - obtm um OutputStream. Ideal </p><p>para gerar formatos diferentes de texto (imagens, etc.)6. addCookie(Cookie c) - adiciona um novo cookie7. encodeURL(String url) - envia como anexo da URL a informao de </p><p>identificador de sesso (sessionid)8. reset() - limpa toda a sada inclusive os cabealhos9. resetBuffer() - limpa toda a sada, exceto cabealhos</p></li><li><p>doGet() e doPost()</p><p> Use doGet() para receber requisies GET Links clicados ou URL digitadas diretamente</p><p> Alguns formulrios que usam GET</p><p> Use doPost() para receber dados de formulrios</p><p> Se quiser usar ambos os mtodos, no sobreponha service() mas implemente tanto doGet() como doPost()</p><p>public class ServletWeb extends HttpServlet {</p><p>public void doGet (HttpServletRequest request,</p><p>HttpServletResponse response) {</p><p>processar(request, response);</p><p>}</p><p>public void doPost (HttpServletRequest request,</p><p>HttpServletResponse response) {</p><p>processar(request, response);</p><p>}</p><p>public void processar(HttpServletRequest request,</p><p>HttpServletResponse response) {</p><p>...</p><p>}</p><p>}</p></li><li><p>Parmetros da Requisio</p><p> Parmetros so pares nome=valor que so enviados pelo cliente concatenados em strings separados por &amp;</p><p> Duas formas para passar parmetros: Se o mtodo for GET, os parmetros so passados em uma nica linha </p><p>no query string, que estende a URL aps um "?</p><p> Se o mtodo for POST, os parmetros so passados como um streamno corpo na mensagem</p><p>GET /servlet/Teste?id=agente007&amp;acesso=3 HTTP/1.0</p><p>POST /servlet/Teste HTTP/1.0Content-length: 21Content-type: x-www-form-urlencoded</p><p>id=agente007&amp;acesso=3</p></li><li><p>Lendo Parmetros da Requisio</p><p> Caracteres reservados e maiores que ASCII-7 bit so codificados em URLs: Ex: = %E3 Formulrios HTML codificam o texto ao enviar os dados</p><p> Seja o mtodo POST ou GET, os valores dos parmetros, podem ser recuperados pelo mtodo getParameter() String parametro = request.getParameter("nome");</p><p> Parmetros de mesmo nome podem ser repetidos. Neste caso getParameter() retornar apenas a primeira ocorrncia. Para obter todas use String[] getParameterValues() String[] params = request.getParameterValues("nome");</p></li><li><p>Gerando uma Resposta</p><p>1. Para gerar uma resposta, primeiro necessrio obter, do objeto HttpServletResponse, um fluxo de sada, que pode ser de caracteres (Writer) ou de bytes (OutputStream) Writer out = response.getWriter(); // ou OutputStream out = response.getOutputStream(); Apenas um deve ser usado - correspondem ao mesmo stream</p><p>1. Definir o tipo de dados a ser gerado (Content-type) para que o navegador saiba como exibir as informaes response.setContentType("text/html");</p><p>1. Depois, pode-se gerar os dados (HTML), imprimindo-os no objeto de sada (out) obtido anteriormente</p></li><li><p>Processando Formulrios</p><p>Um Formulrio Bsico</p><p>Entre com seus dados:</p></li><li><p>Processando Formulrios</p><p>public class ProcessaFormulario extends HttpServlet {</p><p>private void processa(HttpServletRequest req, HttpServletResponse res) </p><p>throws IOException {</p><p>ServletOutputStream out = res.getOutputStream();</p><p>res.setContentType("text/html");</p><p>String tratamento = req.getParameter("titulo");</p><p>String nome = req.getParameter("nome");</p><p>String cidade = req.getParameter("cidade");</p><p>String interesses[] = req.getParameterValues("interesses");</p><p>out.println("Resp do Servlet");</p><p>out.println("");</p><p>out.println("Ol " + tratamento + " " + nome);</p><p>out.println("Voc mora em " + cidade + " e seus interesses so: ");</p><p>out.println("");</p><p>for (String interesse : interesses) {</p><p>out.println("");</p><p>out.println(interesse);</p><p>out.println("");</p><p>}</p><p>out.println("");</p><p>} </p><p>}</p></li><li><p>Redirecionamentos</p><p> Ao receber uma requisio, um servlet pode:1. Respond-la diretamente, produzindo algum contedo </p><p>HTML a ser enviado ao cliente (navegador)2. Encaminh-la para algum outro recurso responsvel por </p><p>responder a esse tipo de requisio</p><p> Duas formas de encaminhamento:1. Chamada ao mtodo </p><p>HttpServletResponse.sendRedirect(String url)2. Criao de um objeto do tipo RequestDispatcher e </p><p>chamada ao mtodo forward(HttpServletRequest, HttpServletResponse)</p></li><li><p>Redirecionamentos</p><p> A chamada do mtodo sendRedirect(String url) faz com que o servidor envie ao cliente uma mensagem para que este envie a solicitao a uma nova URL O servidor envia ao cliente uma mensagem HTTP com </p><p>cdigo 302 (o recurso foi movido para outra URL)</p><p> O redirecionamento atravs da classe RequestDispatcher interno ao servidor No h comunicao com o cliente</p></li><li><p>Redirecionamentos</p><p> Em termos de prticos, para o cliente a primeira opo modifica o endereo URL no navegador, enquanto que a segunda no</p><p> Em aplicaes web, redirecionamentos so utilizados entre Servlets/JSPs como um mecanismo de delegao de tarefas</p></li><li><p>Escopo</p><p> O escopo de um objeto indica quanto tempo o objeto existe depois de ter sido criado</p><p> Estes variam do tempo de vida do continer at o tempo de vida de uma pgina individual</p><p> Quatro nveis de escopos: (i) Aplicao, (ii) Sesso, (iii) Requisio e (iv) Pgina</p></li><li><p>Escopo</p></li><li><p>Escopo Aplicao</p><p> Objetos compartilhados por todos os servlets em uma dada aplicao</p><p> Exemplo: conexo com banco de dados, lista de produtos numa aplicao de controle de estoque, etc.</p></li><li><p>Escopo Aplicao</p><p> A classe HTTPServlet possui um mtodo getServletContext() que retorna um objeto do tipo ServletContext</p><p> Este objeto nos permite, por exemplo, criar atributos que existiro enquanto o servidor estiver no ar</p><p> Outra alternativa atravs do mtodo init() de HTTPServlet, o qual possui um parmetro que uma instncia da classe ServletConfig; esta classe possui um mtodo denominado getServletContext() que retorna a mesma referncia citada no sub-item anterior </p></li><li><p>Escopo Sesso</p><p> Objetos compartilhados numa sesso vinculada a um usurio</p><p> Exemplo: carrinho num site de compras</p></li><li><p>Escopo Sesso</p><p> A classe HTTPServletRequest (primeiro parmetro dos mtodos doGet()/doPost()) possui o mtodo getSession(), que retorna uma referncia para a sesso corrente</p><p> Caso no exista sesso corrente ativa, uma nova criada</p></li><li><p>Escopo Pgina</p><p> Objetos compartilhados entre JSPs e servlets na pgina de execuo atual</p><p> Exemplo: variveis locais declaradas em pginas JSPs</p></li><li><p>Escopo Requisio</p><p> Objetos compartilhados disponveis para JSPs/Servlets numa solicitao</p><p> Difere do escopo de pgina por permitir o compartilhamento tambm para JSPs/Servlets includas ou redirecionadas</p><p> Exemplo: parmetros de campo de formulrio</p></li><li><p>Exerccio em Sala de Aula</p><p> Acompanhe na sua mquina a construo de um servlet HelloWorld</p><p> Acompanhe a construo da classe (no Eclipse)</p><p> Analise o web.xml</p><p> Implante em um continer</p><p> Execute e verifique o resultado</p></li><li><p>Exerccios</p><p>1. Escreva um servlet que receba o nome e o telefone do usurio e retorne tais dados formatados em uma stringpassada ao servlet como parmetro de inicializao.</p><p>i. Use o mtodo esttico format da classe String</p><p>2. Crie um servlet que imprima, em uma tabela, todos osnomes de parmetros enviados e seus valores.</p><p>3. Crie um servlet que imprima, em uma tabela, todos osnomes de cabealhos HTTP da requisio e seusvalores.</p><p>4. Crie um servlet que retorne uma imagem.</p></li><li><p>Exerccios</p><p>5. Escreva um servlet simples que devolva uma pgina contendo o dia, ms, ano e hora.</p><p>6. Desenvolva a seguinte aplicao Web com as seguintes caractersticasi. Dois formulrios para fazer autenticao de um usurio</p><p>a. O primeiro deve obter o nome do us...</p></li></ul>