Sunteți pe pagina 1din 31

Desenvolvimento de Sistemas

Corporativos
Aula 1.7 Solicitaes e Respostas

Prof. Bruno Moreno


bruno.moreno@ifrn.edu.br
Prtica da aula anterior
Complemente o exemplo anterior de modo a
apresentar todos os dados do contato no
seguinte formato:
Nome:
E-mail:
Endereo:
Data de Nascimento:

2
Exerccio da aula anterior
Crie uma pgina HTML chamada login.html que
possua um formulrio (method post) com dois
campos de texto (login e senha) e um boto
submit;
Ao clicar no boto, a pgina dever ser
direcionada para o servlet AutenticaUsuario;
O servlet deve apresentar uma mensagem de boas
vindas caso o usurio seja igual a Maria e a senha
igual a 123;
Caso contrrio, deve exibir a mensagem: Dados
incorretos.
3
Transaes Idempotentes
No geral:
doGet() utilizado para solicitaes simples;
doPost() utilizado para aceitar e processar
dados;
O GET utilizado apenas para conseguir
alguma informao
No altera o estado do servidor;
Por essa razo, o GET considerado idempotente
pois pode ser refeita;

4
Transaes Idempotentes
Uma transao idempotente se pode ser
executada mais de uma vez;
Como o GET usado apenas para obter dados,
ele considerado idempotente;
O POST no idempotente
Dados submetidos no corpo do POST podem ser
destinados a uma transao;
Essa transao no pode ser desfeita
Lembre-se das propriedades ACID de transaes;

5
Transaes Idempotentes
O conceito bastante discutido:
Protocolo HTTP;
Padres de Projeto SOA (Arquitetura Orientada a
Servios)
Definio de servios idempotentes;
Sistemas Distribudos
Um mtodo idempotente o que pode ser
chamado repetidamente com os mesmos
argumentos e alcanar os mesmos
resultados.
Uma operao idempotente aquela que
pode ser efetuada repetidamente com o
mesmo efeito, como se tivesse sido
executada exatamente uma vez.

6
Enviando solicitaes
Como o browser sabe se a solicitao um
GET ou um POST?
Um hyperlink simples sempre um GET
<a href=http://www.ifrn.edu.br>IFRN</a>

Um POST precisa ser explicitamente definido:


<form method=POST action=DefineCampus>
Selecione o campus<p>
<select name=campus size=1>
<option>Natal Central
<option>Currais Novos
<option>Nova Cruz
<option>Parnamirim
</select>
<center>
<input type= SUBMIT>
</center> 7
Enviando solicitaes
Como
<formomethod=POST
browser sabe se a solicitao um
action=DefineCampus>
Selecione o campus<p>
GET ou umname=campus
<select POST? size=1>
<option>Natal Central
Um<option>Currais
hyperlink simples
Novos sempre um GET
<option>Nova Cruz
<a href=http://www.ifrn.edu.br>IFRN</a>
<option>Parnamirim
</select>
Um<center>
POST precisa ser explicitamente definido:
<input type= SUBMIT>
</center>
</form>

8
Enviando solicitaes
O servlet deve tratar a solicitao do HTML
Se o HTML define a solicitao como GET, o
doGet() tem que ser implementado;
Se o HTML define a solicitao como POST, o
doPost() tem que ser implementado;
Se o mtodo tratado no HTML no for
implementado no servlet, dar erro.

9
Enviando solicitaes
Exemplo de manipulao errada:
<form method=POST action=DefineCampus>
Selecione o campus<p>
<select name=campus size=1>
<option>Natal Central
<option>Currais Novos
<option>Nova Cruz
<option>Parnamirim
</select>
<center>
<input type= SUBMIT>
</center>
</form>

public class DefineCampus extends HttpServlet{

public void doGet(HttpServletRequest request,


HttpServletResponse response)
throws IOException, ServletException{
//codigo aqui
}
}
10
Enviando solicitaes
Para dar suporte a ambas solicitaes, basta
invocar um mtod dentro de outro:

public class DefineCampus extends HttpServlet{

public void doPost(HttpServletRequest request,


HttpServletResponse response)
throws IOException, ServletException{
doGet(request, response);
}
}

11
Enviando solicitaes
O que mais pode ser
obtido atravs do request?
ServletRequest API:
http://docs.oracle.com/javaee/
6/api/javax/servlet/ServletReq
uest.html
HttpServletRequest API
http://docs.oracle.com/javaee/
6/api/javax/servlet/http/HttpSe
rvletRequest.html

12
Enviando solicitaes
Outras informaes obtidas a partir do Request:
A plataforma do cliente e a informao do browser
String client = request.getHeader(
User-Agent);
Os cookies associados a esta solicitao
Cookie[] cookies = request.getCookies();
A sesso associada a este cliente
HttpSession session = request.getSession();
O mtodo HTTP da solicitao
String theMethod = request.getMethod();
Um stream de dados da solicitao
InputStream input = request.getInputStream();
13
Enviando Respostas
A resposta o que volta para o cliente
O browser recebe do servidor;
O objeto resposta utilizado para tratar as
respostas ao cliente;
Respostas podem ser implementadas:
Stream de sada (geralmente um Writer)
Utilizado para escerever o HTML;
Utilizando um JSP.

14
Enviando Respostas
Na resposta, basicamente
dois mtodos so utilizados:
setContentType()
getWriter()
Depois disso,
basicamente I/O para
escrever o stream de HTML.

15
Enviando Respostas
Considere uma resposta de um arquivo PDF:
//um monte de imports aqui
public class RetornaPDF extends HttpServlet {

public void doGet(HttpServletRequest request,


HttpServletResponse response)
throws IOException, ServletException{
response.setContentType(application/pdf);

ServletContext ctf = getServletContext();


InputStream is = ctf.getResourceAsStream(/files/notas.pdf);

int read = 0;
byte[] bytes = new byte[1024];

OutputStream os = response.getOutputStream();
while((read=is.read(bytes))!=-1)
os.write(bytes, 0, read);
os.flush();
os.close();
}
}
16
Enviando Respostas
Considere uma resposta de um arquivo PDF:
//um monte de imports aqui
public class RetornaPDF extends HttpServlet {

public void doGet(HttpServletRequest request,


HttpServletResponse response)
throws IOException, ServletException{
response.setContentType(application/pdf);

ServletContext ctf = getServletContext();


InputStream is = ctf.getResourceAsStream(/files/notas.pdf);

int read = 0;
byte[] bytes = new byte[1024];

OutputStream os = response.getOutputStream();
while((read=is.read(bytes))!=-1)
os.write(bytes, 0, read);
os.flush();
os.close(); I/O simples: leitura e escrita de
} stream.
}
17
Enviando Respostas
O tipo de contedo definido no response
response.setContentType(application/pdf);
necessrio informar ao browser o que est sendo
devolvido;
O browser precisa saber como tratar a resposta;
Neste caso, abrir um leitor de PDF;

18
Enviando Respostas
Tipo de contedo nada mais do que o MIME
type;
MIME types mais comuns:

19
Enviando Respostas
Tipo de contedo nada mais do que o MIME
type;
MIME types mais comuns:

20
Enviando Respostas
Tipo de contedo nada mais do que o MIME
type;
MIME types mais comuns:

21
Enviando Respostas
A interface ServletResponse oferece apenas
duas opes de stream:
PrintWriter
Pelo mtodo getWriter();
Utilizado para exibir dados de texto para uma stream de
caracteres;
Um objeto PrintWriter tem o mtodo println() ou
print();
OutputStream
Pelo mtodo getOutputStream();
Utilizado para escrever qualquer coisa;
Um objeto OutputStream tem um mtodo write();
22
Enviando Respostas
comum, tambm, que respostas no sejam
tratadas por um servlet
Elas podem ser redirecionadas!
Repostas podem ser redirecionadas para outro
componente da aplicao
Outro servlet;
Um JSP (mais comum).
O redirecionamento ocorre via mtodo
sendRedirect() de HttpServletResponse;

23
Redirecionamento
Exemplo de sendRedirect():
public class DemoServlet extends HttpServlet {

public void doGet(HttpServletRequest req,


HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html");

PrintWriter pw = res.getWriter();
response.sendRedirect("http://www.google.com");
pw.close();
}
}

24
Prtica - Redirecionamento
Crie uma pgina que permita fazer uma pesquisa na
Internet;
Redirecione o termo persquisado para o google;

Dicas:
Utilize getParameter() de HttpServletRequest para
obter o termo pesquisado;
Utilize sendRedirect() de HttpServletResponse
para redirecionar a buca.
25
Request Dispatch
O redirecionamento (sendRedirect()) faz o
cliente realizar o trabalho
Baseado no redirecionamento o browser acessa
outra URL;
O request dispatch um mecanismo em que
entega o processamento para outro componente
do servidor
Outro servlet;
Um JSP;

26
Request Dispatch
O mtodo getRequestDispatcher() de
ServletRequest retorna um objeto de
RequestDispatcher:
RequestDispatcher rs = request.getRequestDispatcher(aloMundo.html);
rs.forward(request,response);

O mtodo forward() encaminha o request e o


response para aloMundo.html;
RequestDispatcher rs = request.getRequestDispatcher(aloMundo.html);
rs.include(request,response);

O mtodo inlcude() inclui o response da pgina


aloMundo.html no response do servlet corrente.

27
Prtica - Request Dispatch
Considere que o formulrio a seguir est em
uma pgina index.html:
<form method="post" action="Validacao">
Nome:<input type="text" name="usuario" /><br/>
Senha:<input type="password" name="senha" ><br/>
<input type="submit" value="submit">
</form>

Considere o servlet BemVindo a seguir:


public class BemVindo extends HttpServlet {

protected void doPost(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<h2>Bem vindo!</h2>");
}
}

28
Prtica - Request Dispatch
Considere ainda o DD a seguir:
<web-app>
<servlet>
<servlet-name>Validacao</servlet-name>
<servlet-class>Validacao</servlet-class>
</servlet>
<servlet>
<servlet-name>BemVindo</servlet-name>
<servlet-class>BemVindo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Validacao</servlet-name>
<url-pattern>/Validacao</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>BemVindo</servlet-name>
<url-pattern>/BemVindo</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
29
Prtica - Request Dispatch
Diante disso, implemente o servlet Validacao
de modo que:
Se os parmetros usuario e senha forem diferentes
O usurio deve ser informado que os dados esto errados;
O RequestDispatcher deve ser executado de modo a
incluir a pxina index.html na resposta;
Se os parmetros usuario e senha forem iguais
O RequestDispatcher deve ser executado de modo a
encaminhar a requisio para o servlet BemVindo.

30
Deus amou tanto o mundo que deu
seu Filho, seu nico filho, pela
seguinte razo: para que
ningum precise ser condenado; para
que todos, crendo nele, possam ter
vida plena e eterna.
Joo 3:16
(A Mensagem)

31

S-ar putea să vă placă și