Java para Web
231 pág.

Java para Web


DisciplinaOrientação A Objetos184 materiais1.094 seguidores
Pré-visualização45 páginas
class="br.com.caelum.jdbc.dao.ContatoDAO"/>
<c:forEach var=&quot;contato&quot; items=&quot;${dao.lista}&quot;>
<li>
nome: ${contato.nome},
email ${contato.email},
endereço ${contato.endereco}
</li>
</c:forEach>
</c:catch>
<c:if test=&quot;${not empty error}&quot;>
Ocorreu algum erro ao acessar o banco de dados.
</c:if>
Repare que a própria JSTL nos apresenta uma solução que não se mostra boa para esse tipo de erro que
queremos tratar. É importante deixar claro que desejamos tratar o tipo de erro que não tem volta, devemos
mostrar uma mensagem de erro para o cliente e pronto, por exemplo quando a conexão com o banco cai ou
quando ocorre algum erro no servidor.
Esses são erros do servidor (ou do programador) e não erros do cliente, como problemas de validação de
campo, que trataremos no capítulo do Struts.
9.3 - Exercício opcional
1) Trate o erro da listagem de contatos com <c:catch> criando um arquivo chamado testa-catch.jsp.
<%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %>
<html>
<h1>Tratando erro com c:catch </h1>
</br>
Capítulo 9 - Controle de erro - JSTL é a solução? - Página 66
Material do Treinamento Java para Desenvolvimento Web
<c:catch var=&quot;error&quot;>
<jsp:useBean id=&quot;dao&quot; class=&quot;br.com.caelum.jdbc.dao.ContatoDAO&quot;/>
<c:forEach var=&quot;contato&quot; items=&quot;${dao.lista}&quot;>
<li>
nome: ${contato.nome},
email ${contato.email},
endereço ${contato.endereco}
</li>
</c:forEach>
</c:catch>
<c:if test=&quot;${not empty error}&quot;>
Ocorreu algum erro ao acessar o banco de dados.
</c:if>
</html>
9.4 - Quando acontece um erro em uma página JSP
É muito simples controlar erros em páginas JSP. Imagine a página a seguir que simula um erro de conexão
ao banco de dados:
<%@ page errorPage=&quot;/erro.jsp&quot; %>
<html>
<%
java.sql.DriverManager.getConnection(&quot;jdbc:teste:invalido&quot;,&quot;usuario&quot;,&quot;senha&quot;);
%>
</html>
Agora que já configuramos, quando ocorrer uma SQLException, a página erro.jsp será mostrada se nada
for feito pelo programador: não precisamos fazer nada na página jsp que pode gerar um erro, exceto dizer qual
a página que controla os erros dela. Simples, não?
Quem trata o erro é o servlet container, que lê o jsp e envia o fluxo da requisição para a página de erro
indicada na tag page.
9.5 - Página de erro
Começamos criando uma página JSP chamada erro.jsp que utiliza uma diretiva para indicar que é uma
página de controle de erro, isto é, quando erros ocorrem, o fluxo será redirecionado para essa página.
A diretiva a ser utilizada é a mesma que usamos para importar classes e pacotes. Nesse caso utilizamos o
atributo isErrorPage para disponibilizar o erro (exception) que ocorreu para o nosso código jsp.
<%@ page isErrorPage=&quot;true&quot;%>
Agora podemos mostrar a mensagem de erro usando EL. Lembre-se que a variável a seguir só será criada
se o erro for uma exception!
${pageContext.errorData.throwable}
Portanto a página chamada erro.jsp acaba sendo o cabeçalho com a mensagem de erro:
Capítulo 9 - Controle de erro - Quando acontece um erro em uma página JSP - Página 67
Material do Treinamento Java para Desenvolvimento Web
<%@ page isErrorPage=&quot;true&quot; %>
<html>
Um erro ocorreu.<br/>
${pageContext.errorData.throwable}
</html>
9.6 - Exercícios
1) Crie o arquivo WebContent/testa-erro.jsp:
<html>
<%
java.sql.DriverManager.getConnection(&quot;jdbc:teste:invalido&quot;);
%>
</html>
a) Teste a url http://localhost:8080/jspteste/testa-erro.jsp
b) Altere sua página, adicionando o cabeçalho:
<%@ page errorPage=&quot;/erro.jsp&quot; %>
2) Crie o arquivo WebContent/erro.jsp.
<%@ page isErrorPage=&quot;true&quot; %>
<html>
<h1>Um erro ocorreu.</h1><br/>
${pageContext.errorData.throwable}
</html>
Capítulo 9 - Controle de erro - Exercícios - Página 68
Material do Treinamento Java para Desenvolvimento Web
3) Teste a url http://localhost:8080/jspteste/testa-erro.jsp
9.7 - Erros comuns
No exercício anterior, é muito comum errar no seguinte detalhe: errar na página de erro (como o texto da
Expression Language), e visualizar a página de erro normal do Tomcat.
Capítulo 9 - Controle de erro - Erros comuns - Página 69
CAPÍTULO 10
Servlets
\u201cVivemos todos sob o mesmo céu, mas nem todos temos o mesmo horizonte.\u201d
\u2013 Konrad Adenauer
Neste capítulo, você aprenderá a criar pequenos objetos que funcionam como aplicações web.
10.1 - Servlet
Uma servlet funciona como um pequeno servidor (servidorzinho em inglês) que recebe chamadas de diver-
sos clientes.
Uma primeira idéia da servlet seria que cada uma delas é responsável por uma página, sendo que ela lê
dados da requisição do cliente e responde com outros dados (html, gif etc). Como no Java tentamos sempre que
possível trabalhar orientado a objetos, nada mais natural que uma servlet seja representada como um objeto.
Resumindo, cada servlet é um objeto java que recebe tais requisições (request) e retorna algo (response),
como por exemplo uma página html ou uma imagem do formato jpg.
Diversas requisições podem ser feitas à uma mesma servlet ao mesmo tempo em um único servidor, por
isso ela é mais rápida que um programa CGI comum. A especificação da servlet cita algumas vantagens que
possui sobre o antigo CGI.
O diagrama abaixo mostra três clientes acessando o mesmo servidor web/container de servlets através do
protocolo http.
A página a ser retornada pela servlet pode ser um jpg, um gif, um arquivo html etc: arquivos de texto ou
simplesmente binários.
70
Material do Treinamento Java para Desenvolvimento Web
O comportamento das servlets que iremos ver neste capítulo foi definido na classe HttpServlet do pacote
javax.servlet. Eles se aplicam às servlets que trabalham através do protocolo Http.
A interface Servlet é a que define exatamente como uma servlet funciona, mas não é necessariamente o que
vamos utilizar neste capítulo uma vez que ela possibilita o uso de qualquer protocolo baseado em requisições e
respostas.
É importante frisar que a mesma instância de uma servlet (o mesmo objeto) pode ser chamada mais de
uma vez para diferentes requisições ao mesmo tempo, justamente para obter as vantagens mencionadas ante-
riormente contra o uso de CGI.
O funcionamento básico de uma servlet compreende:
\u2022 sua inicialização (veremos com mais detalhes mais adiante)
\u2022 chamadas a métodos de serviço, essas chamadas passam dois argumentos para o método service, a
requisição que o cliente faz e a resposta que permite enviar dados para o mesmo:
void service(HttpServletRequest req, HttpServletResponse res);
\u2022 finalização (veremos com detalhes mais adiante),
O exemplo a seguir mostra uma servlet implementando o método de service.
Um primeiro exemplo de método service seria aquele que não executa nada e mostra uma mensagem de
bem vindo para o usuário. Para isso precisamos \u201calterar\u201d a resposta que a servlet enviará para o cliente.
O writer de saída do cliente pode ser obtido através do método getWriter da variável response e então fica
simples utilizar um PrintWriter para imprimir algo como resposta para o cliente:
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// recebe o writer
PrintWriter out = response.getWriter();
// escreve o texto
out.println(&quot;<html>&quot;);
out.println(&quot;Caelum explica&quot;);
out.println(&quot;</html>&quot;);
}
Servlet x CGI
\u2022 Fica na memória entre requisições, não precisa ser reinstanciada;
\u2022 O nível de segurança e permissão de acesso pode ser controlado;
\u2022 em CGI, cada cliente é representado por um processo, enquanto que com Servlets, cada
cliente é representado por uma linha de execução.
Esse capítulo está focado na HttpServlet, um tipo que gera aplicações web baseadas no protocolo
HTTP, mas vale lembrar que a api não foi criada somente para este protocolo, podendo ser facil-
mente estendida para outros.
Capítulo 10 - Servlets - Servlet - Página 71
Material do Treinamento