Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ricardo Terra
HTTP
uma
sequncia
de
Isto , o cliente pede uma coisa, o servidor responde, o cliente pede outra coisa, o servidor responde...
Requisio e resposta
Principais elementos do fluxo de requisio:
mtodo HTTP endereo da pgina (URL) que est sendo acessada parmetros do formulrio
Requisio e resposta
Requisio HTTP
A primeira coisa que voc encontrar o nome do mtodo HTTP
O nome do mtodo informa ao servidor o tipo de solicitao que est sendo feita e como o resto da mensagem ser formatada.
O protocolo HTTP possui diversos mtodos, mas usaremos e aprenderemos os mais comuns: GET e POST
10
Requisio e resposta
Mtodo GET
o mtodo mais simples do HTTP e seu principal trabalho pedir um recurso
Pode ser qualquer tipo de recurso: uma pgina, uma imagem, um PDF, etc
O caminho at o recurso e quaisquer parmetros adicionados URL sero includos na prpria barra de endereos Podemos usar o GET para formulrios, porm com desvantagens:
O total de caracteres do GET limitado Os dados que voc envia utilizando HTTP GET so anexados URL, portanto, seja o que for que voc estiver transmitindo, ficar exposto
11
Requisio e resposta
Mtodo POST
um mtodo mais poderoso. um GET++. Com o POST, voc pode solicitar algo e, ao mesmo tempo, enviar os dados de um formulrio para o servidor Os dados a serem enviados ao servidor esto localizados na carga til (payload) da mensagem e podem ser bem extensos
Pacote IPv4
Requisio e resposta
Enfim, para acesso a recursos utiliza-se GET e aplicaes que utilizam formulrios utiliza-se POST
13
Requisio e resposta
Resposta HTTP
uma resposta HTTP composta de um cabealho (header) e o corpo
o cabealho informa ao browser o mtodo que est sendo utilizado, se a solicitao obteve xito (cdigo) e o tipo de contedo est includo no corpo corpo possui o contedo (por exemplo, HTML) que o browser exibir
14
15
16
17
19
request.getParameter("idade"));
String nomes[] = request.getParameterValues("nomes"); String numeros[] = request.getParameterValues("n");
20
Setar o tipo de contedo da resposta (setContentType) Colocar os parmetros em variveis locais (veja slide anterior) Obter a escrita na resposta (out = response.getWriter()) Utilizar Java SE para gerar o HTML de resposta (out.print(...)) Fechar a escrita na resposta (out.close())
2.
3.
4.
5.
21
e depois os
22
23
Exemplo 02 Somar
Vamos submeter a seguinte URL, isso seria via o mtodo GET:
/Somar?x=3&y=7
Para iniciarmos a passagem de parmetros, inserido um parmetros so separados por &.
? e depois os
Exemplo 02 Somar
Como seria o cdigo interno do mtodo doGet (caso seja via URL) ou do mtodo doPost (caso seja via formulrio)?
public [doPost|doGet](...) throws ... { response.setContentType("text/html"); int x = Integer.parseInt(request.getParameter("x")); int y = Integer.parseInt(request.getParameter("y")); PrintWriter out = response.getWriter(); ... out.printf("%d + %d = %d", x, y, (x+y)); ... out.close(); }
25
Recordando:
o mtodo getParameter() retorna uma string
usado para recuperar parmetros simples com apenas um valor
27
30
31
32
34
S Servlets?
At agora estamos desenvolvendo aplicaes somente utilizando servlets Qual o maior problema ou dificuldade encontrada em se desenvolver um servlet?
Escrever todo o cdigo HTML no prprio servlet
Imagina ainda se fosse um servlet cuja resposta seria uma enorme pgina HTML? Como resolver esse problema?
35
Utilizando JSP
A soluo para no ficar escrevendo todo o cdigo HTML dentro do servlet utilizar pginas JSP (Java Server Pages) Muitos utilizam o servlet para fazer a lgica de negcio (query no banco de dados, inserir um registro, registrar um emprstimo) e, ento, encaminham a solicitao para um JSP que apresentar o HTML de resposta Trabalhando da maneira acima, observa-se uma separao entre a lgica de negcio que est sendo realizada pelos servlets e a apresentao que est sendo realizada pelas pginas JSP
Isso pode parecer o MVC, mas ainda no
36
Utilizando JSP
Uma pgina JSP muito mais gil para a gerao de um documento HTML como sada do que um servlet
Podemos pensar em uma pgina JSP como um documento HTML com algumas tags especiais
37
Utilizando JSP
Uma pgina JSP facilita o desenvolvimento da camada de apresentao uma vez que permite que os templates em HTML possam ser reaproveitados pelo desenvolvedor J que uma pgina JSP um servlet e j que um servlet uma classe Java, ento uma pgina JSP pode conter cdigos Java Uma pgina JSP composta basicamente por elementos HTML e tags que delimitam cdigos Java (chamados scripts)
38
Utilizando JSP
So as tags JSP:
<%@ %> Diretiva JSP: define parmetros para o container (no caso para o Tomcat Scriptlet: tudo o que tiver dentro desta regio considerado cdigo Java. Uso no recomendado, preferir EL ou JSTL Declarao: utilizada para definir mtodos e declarar variveis. Uso no recomendado, preferir EL ou JSTL Expresso: o mesmo que chamar <% out.print() %>. No tem ponto-e-vrgula (;) no final. Uso no recomendado, preferir EL ou JSTL
<%
%>
<%! %>
<%= %>
39
40
Resultado:
41
Encaminhar ou redirecionar
Como j vimos que o JSP ser responsvel pela apresentao, devemos saber como encaminhar uma requisio ou redicionar um cliente Portanto:
Voc pode encaminhar (forward) a requisio para ser completada
Um exemplo depois de realizar todos os processamentos no servlet devemos encaminhar a requisio uma pgina JSP para que ela apresente os dados dessa requisio
42
Encaminhar (forward)
Ao encaminhar, o controle permanece dentro do container. Um servlet envia a requisio para o prximo servlet ou JSP e os objetos HttpServletRequest e HttpServletResponse so encaminhados juntamente Para o usurio, ele no conhece os servlets pelo qual ele foi encaminhado, e sim, somente o que ele acessou
A URL do navegador no alterada
Encaminhamentos (forwardings) podem ocorrer apenas dentro do contexto web da aplicao, isto , somente entre servlets e pginas JSP
Tpicos Especiais em Informtica III - Prof. R. Terra 43
Encaminhar (forward)
Servlet ou JSP Servlet ou JSP
est qu
Re
Fo r war d
Response
...
request.getRequestDispatcher("/resultListagem.jsp") .forward(request, response); ... }
44
Redirecionar (redirect)
O servlet envia um cdigo HTTP 303 como resposta informando uma nova URL deve ser acessada Redirecionamento usado quando precisa-se sair do contexto (acessar um recurso externo como o site do google, por exemplo)
Com redirect, perde-se todas as variveis que existiam dentro do request, sendo necessrio repass-las nova URL
45
Redirecionar (redirect)
Servlet ou JSP
st eque R ct edire R
Request
46
Exemplo encaminhamento
JSP com formulrio de submisso (formSoma.jsp)
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %> <html> <body> <font type="red">${requestScope.msgErro}</font> <br /> <form action="${pageContext.request.contextPath}/Somar" method="POST"> X: <input type="text" name="x" value="${param.x}" size="6"/> Y: <input type="text" name="y" value="${param.y}" size="6"/> <input type="submit" name="evento" value="Somar"/> <input type="reset" value="Limpar"/> </form> </body> </html>
47
Exemplo encaminhamento
Servlet com a lgica de negcio
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int x = 0, y = 0; if (this.isNumber(request.getParameter("x"))) { x = Integer.valueOf(request.getParameter("x")); } else { request.setAttribute("msgErro", "O atributo X invlido"); request.getRequestDispatcher("/formSoma.jsp").forward(request,response); return; } if (this.isNumber(request.getParameter("y"))) { y = Integer.valueOf(request.getParameter("y")); } else { request.setAttribute("msgErro", "O atributo Y invlido"); request.getRequestDispatcher("/formSoma.jsp").forward(request,response); return; } request.setAttribute("z", x + y); // Encaminho para a JSP de resposta request.getRequestDispatcher("/resultSoma.jsp").forward(request,response); }
48
Exemplo encaminhamento
Alm do mtodo doPost, a classe do servlet tambm ter o mtodo isNumber que verificar se uma certa string um nmero inteiro:
private boolean isNumber(String str) { return str.matches("^-{0,1}[0-9]+"); }
49
Escopos
No ltimo exemplo vimos cdigos como:
No servlet:
request.setAttribute(z,x+y)
Na JSP:
${requestScope.z}
Porm, no sabemos exatamente o que era. Isso trata-se da utilizao de escopo para armazenamento de informaes
Escopo de pgina
Escopo de pgina (pageScope)
Esse escopo o mais curto e s existe durante a renderizao da pgina JSP Colocando variveis neste escopo (somente dentro da pgina JSP):
<%pageContext.setAttribute("nomeAtributo",valor);%>
51
Escopo de pgina
Cliente 1
JSP A
Uso comum:
Uso de variveis temporrias usadas somente para a renderizao da pgina JSP
52
Escopo de requisio
Escopo de requisio (requestScope)
Este escopo s existe durante a requisio, isto , seu armazenamento inicia-se no momento em que uma requisio realizada e termina junto com o trmino requisio Colocando variveis neste escopo:
<%request.setAttribute("nomeAtributo",valor);%>
53
Escopo de requisio
Servlet/JSP A
Servlet/JSP B
Uso comum:
Passagem de informaes adquiridas em um servlet para a pgina JSP de resposta
54
Escopo de sesso
Escopo de sesso (sessionScope)
Este escopo nico por sesso (vnculo de um usurio utilizando a aplicao), isto , o escopo existe enquanto a sesso do usurio estiver aberta Colocando variveis neste escopo:
<%request.getSession().setAttribute("nomeAtributo",valor);%>
55
Escopo de sesso
Escopo de sesso requestScope
set
Servlet/JSP A
t ge
Cliente 1
set
Servlet/JSP B
Uso comum:
Armazenamento das informaes do usurio. Por exemplo, nome, histrico de pginas visitadas, permisses de acesso, disciplinas do aluno...
Tpicos Especiais em Informtica III - Prof. R. Terra 56
Escopo de aplicao
Escopo de aplicao (applicationScope)
Este escopo o mais abrangente. o escopo comum s todos os servlets/JSP independente de qual pgina, requisio ou sesso. Pode-se realmente dizer que o escopo da aplicao Colocando variveis neste escopo:
<%this.getServletContext().setAttribute("nomeAtributo",valor);%>
57
Escopo de aplicao
Escopo de aplicao applicationScope
get
Cliente 1
Servlet/JSP A
se t
get
Cliente 2
Servlet/JSP B
Uso comum:
Armazenamento das informaes que devem ser acessadas por qualquer requisio de qualquer usurio. Por exemplo, lista de UF, lista de cidades, lista do nome dos professores...
Tpicos Especiais em Informtica III - Prof. R. Terra 58
Escopos
Observao:
Usando EL (Expression Language), voc pode no dizer qual o escopo que est procurando o atributo, por exemplo:
${x}
Caso seja feito assim, o container ir procurar o atributo com o nome x a partir do escopo mais restrito at o mais amplo:
1. 2. 3. 4.
Por exemplo, se existir a varivel x no escopo de requisio com o valor 4 e no escopo de aplicao com valor 6, ser exibido 4, pois o escopo de requisio mais restrito que o de aplicao
Tpicos Especiais em Informtica III - Prof. R. Terra 59
MVC
O modelo MVC oferece uma forma de separar as trs camadas principais de uma aplicao web:
Viso (responsvel pela apresentao ao usurio) Controle (responsvel por gerenciar os eventos que notificam o modelo) Modelo (responsvel pelas entidades e regras de negcio)
Para desenvolver uma aplicao Java Web no padro arquitetural MVC (Model View Controller), basta utilizar:
JSPs para o HTML (viso) Servlets para controlar o comportamento da aplicao (controle)
Geralmente possuem o sufixo Servlet
MVC
Responsvel pelo acesso ao SGBD Busca os dados conforme solicitao indireta da Viso e os entrega ao Controle Responsvel pela apresentao da resposta Para exibir a resposta, acessa os diversos dados disponibilizados pelo Controle
Responsvel por interpretar a solicitao do usurio Manipula os parmetros, faz o pedido de dados ao Modelo e, ento, os coloca acessvel Viso Tpicos Especiais em Informtica III - Prof. R. Terra 61
MVC
62
MVC
Algumas so as vantagens da utilizao do MVC:
Independncia entre a camada de Viso e a camada de Modelo
O que permite a troca de um sem impacto ao outro
Manutenibilidade
Ocorre um erro na apresentao dos dados, portanto em uma JSP Ocorre um erro de fluxo ou comportamente, portanto em um servlet Ocorre um erro ao acesso ao SGBD, portanto em uma classe de modelo
63
64
/web/inserirFuncionario.jsp
Formulrio de insero do funcionrio
com.terra.modelo.pojo.Funcionario
Armazenar as informaes do funcionrio
com.terra.controle.ManterFuncionarioServlet
Lgica de negcio
com.terra.modelo.FuncionarioDAO
Acesso ao modelo
/web/resultInsercao.jsp
Resultado da insero do funcionrio
65
/ web/ menuFuncionario.jsp
<html> <body> <h1>MENU</h1> <a href="${pageContext.request.contextPath}/inserirFuncionario.jsp"> Inserir </a> <br /> <a href="${pageContext.request.contextPath}/atualizarFuncionario.jsp"> Atualizar </a> <br /> <a href="${pageContext.request.contextPath}/excluirFuncionario.jsp"> Excluir </a> <br /> <a href="${pageContext.request.contextPath}/pesquisarFuncionario.jsp"> Pesquisar </a> <br /> </body> </html>
66
/ web/ inserirFuncionario.jsp
<html> <body> <h1>Inserir Funcionrio</h1> <font color="red"><b>${requestScope.msgErro}</b></font><br /> <form action="${pageContext.request.contextPath}/ManterFuncionario" method="POST"> Nome: <input type="text" name="nome" size="60" maxlength="60" value="${param.nome}" /> <br /> Cargo: <input type="text" name="cargo" size="60" maxlength="60" value="${param.cargo}" /> <br /> <input type="submit" name="evento" value="Inserir" /> <input type="reset" value="Limpar" /> </form> </body> </html>
67
com.terra.modelo.pojo.Funcionario
public class Funcionario { private String nome; private String cargo; public Funcionario(){} public Funcionario(String nome, String cargo) { this.nome = nome; this.cargo = cargo; } public public public public } String getNome(){ return this.nome; } void setNome(String nome){ this.nome = nome; } String getCargo(){ return this.cargo; } void setCargo(String cargo){ this.cargo = cargo; }
68
com.terra.controle.ManterFuncionarioServlet
public class ManterFuncionarioServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String evento = request.getParameter("evento"); if (evento.equals("Inserir")){ this.inserir(request,response); }else if (evento.equals("Atualizar")){ this.atualizar(request,response); }else if (evento.equals("Excluir")){ this.excluir(request,response); }else if (evento.equals("Pesquisar")){ this.pesquisar(request,response); } } //Fim do doPost //Continua no prximo slide
69
com.terra.controle.ManterFuncionarioServlet
private void inserir(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String nome = request.getParameter("nome"); String cargo = request.getParameter("cargo"); if (nome==null || nome.equals("")){ request.setAttribute("msgErro", "O campo 'nome' obrigatrio."); request.getRequestDispatcher("/inserirFuncionario.jsp").forward(request, response); return; }else if (cargo==null || cargo.equals("")){ request.setAttribute("msgErro", "O campo 'cargo' obrigatrio."); request.getRequestDispatcher("/inserirFuncionario.jsp").forward(request, response); return; } Funcionario f = new Funcionario(nome,cargo); FuncionarioDAO.insert(f); request.setAttribute("f", f); request.getRequestDispatcher("/resultInsercao.jsp").forward(request, response); } //Fim do inserir ... } //Fim da classe servlet
70
com.terra.modelo.FuncionarioDAO
public class FuncionarioDAO { public static void insert(Funcionario f){ //Cdigo de insero do funcionrio no SGBD } ... }
71
/ web/ resultInsercao.jsp
<html> <body> <h1>Insero de Funcionrio</h1> O funcionrio <b>${requestScope.f.nome}</b> foi inserido com sucesso no cargo de <b>${requestScope.f.cargo}</b>. <br /><br /> <a href="${pageContext.request.contextPath}/menuFuncionario.jsp"> Voltar ao menu </a> <br /> </body> </html>
72
Referncia Bibliogrfica
BASHAM, Brian; SIERRA, Kathy; BATES, Bert. Head First Servlets and JSP. Sebastopol: O'Reilly, 2008. BASHAM, Brian; SIERRA, Kathy; BATES, Bert. Use a Cabea. Servlets & JSP. Rio de Janeiro: Alta Books, 2005.
73