64
Desenvolvimento de Aplicações WEB Desenvolvimento de Aplicações WEB na plataforma J2EE na plataforma J2EE Prof. Giuliano Prado de Morais Giglio, M.Sc. [email protected] http://www.giulianoprado.xpg.com.br Plataforma Java Plataforma Java Programação Programação Web Web em Java em Java Instalação e preparação Instalação e preparação do ambiente do ambiente Prof. Giuliano Prado de Morais Giglio, M.Sc. Plataforma Java Plataforma Java Programação Programação Web Web em Java em Java

Desenvolvimento de Aplicações WEB na plataforma J2EEEE · n A instalação do Tomcatrequer que o pacote básico Java já esteja ... a primeira etapa é instalar o pacote ... •

Embed Size (px)

Citation preview

Desenvolvimento de Aplicações WEBDesenvolvimento de Aplicações WEBna plataforma J2EE na plataforma J2EE

Prof. Giuliano Prado de Morais Giglio, [email protected]

http://www.giulianoprado.xpg.com.br

Plataforma JavaPlataforma JavaProgramação Programação WebWeb em Javaem Java

Instalação e preparaçãoInstalação e preparaçãodo ambientedo ambiente

Prof. Giuliano Prado de Morais Giglio, M.Sc.

Plataforma JavaPlataforma JavaProgramação Programação WebWeb em Javaem Java

Instalação e configuração do Tomcat

n Atenção: para evitar atrasos o tomcat já está instalado e configurado nas máquinas.

n A instalação do Tomcat requer que o pacote básico Java já esteja instalado na máquina. Portanto, a primeira etapa é instalar o pacote jdk1.5 ou superior.

n Faça o download do site http://jakarta.apache.org ou utilize a cópia do CD do módulo.

n Descompacte a cópia para um diretório que será o diretório padrão do Tomcat e referido como <%catalina_home%>.

n Inclua as seguintes variáveis de ambiente:n Ex:

JAVA_HOME = C:\Arquivos Programas\Java\jdk1.5.0_09JAVA = C:\Arquivos Programas\Java\jdk1.5.0_09CLASSPATH = .;JAVA_HOMECATALINA_HOME= C:\Arquivos de programas\Apache Software Foundation\Tomcat 4.1

n Inclua a seguinte biblioteca no classpathCLASSPATH=%CLASSPATH%;c:\.....\Tomcat-4.1.24\common\lib\servlet.jar

Instalação e configuração do Tomcat

n Executando o Tomcatn Para iniciar o servidor basta executar o arquivo

c:\jakarta-tomcat-4.0.1\bin\startup.batn Para interromper a execução servidor basta executar

o arquivoc:\jakarta-tomcat-4.0.1\bin\shutdown.bat

n OBS:• Caso ao iniciar o servidor apareça a mensagem de falta de

espaço de memória, clique com o botão direito do mouse no arquivo .bat e edite as propriedades definindo o ambiente inicial com 4096.

• Ao entrar em execução o servidor lê as configurações do constantes no arquivo server.xml e por default se anexa à porta 8080 (podemos mudar a porta se quisermos)

Instalação e configuração do Tomcat

n Chamando através do browsern Para acessarmos o servidor Web, bastar abrirmos o

browser utilizado (IE no nosso caso) e digitarmos o seguinte endereço:

n http://localhost:8080

Instalação e configuração do Tomcatn Diretórios do Tomcat

Instalação e configuração do Tomcat

n Para criarmos um aplicativo servlet ou jsp, devemos colocá-lossob o diretório webapps

n Para isso, devemos criar, abaixo do diretório webapps, um diretório com o nome do seu aplicativo.

n Dentro deste diretório, devemos criar o diretório WEB-INFn Dentro de WEB-INF temos obrigatoriamente que ter o diretório

classes e o diretório lib(para o caso de utilizarmos alguma biblioteca. Ex: dirvers de conexão com BD).

n Devemos também copiar o arquivo web.xml de algum aplicativo exemplo que vem com o tomcat para o nosso diretório WEB-INF. (Depois veremos que devemos fazer algumas modificações no mesmo)

JSP JSP Java Java Server PageServer Page

Prof. Giuliano Prado de Morais Giglio, M.Sc.

Plataforma JavaPlataforma JavaProgramação Programação WebWeb em Javaem Java

Tecnologias Java para WEB

n Servlets• Programas escritos em JAVA que são

executados no lado servidor.n Java Server Page (JSP)

• Tecnologia que permite a mistura permite misturar código HTML estático com conteúdo dinâmico gerado pelos Servlets.

n Applets• Programas escritos em JAVA que são

executados no lado cliente.

JSP e Servlets

n Rodam no servidor com o objetivo de monitorar requisições

n Web Servers para Servlets/JSP• Apache Tomcat• IBM Websphere• JBoss• BEA Weblogic• Sun Application Server• Mais Servidores:ühttp://java.sun.com/products/servlet/industry.html

JSP

n O texto HTML é escrito junto com as tags JSP e código Java

n Não é uma idéia nova sendo usado em tecnologias concorrentes: ASP, PHP.

<HTML><HEAD></HEAD><BODY>

<% OUT.PRINTLN(“Jsp é muito fácil”); %></BODY></HTML>

Uso de JSP

n Páginas JSP também necessitam de Web Servers específicos.

n Em geral, um servidor de servlets também é um servidor de JSP (no nosso caso, o Tomcat)

n Para disponibilizar um arquivo JSP basta gravá-lo em qualquer pasta visível do servidor com extensão jsp

Execução de JSP

n Quando um usuário faz uma requisição a uma página JSP:• Se for a primeira, a página jsp é convertida em um

servlet e compilada• Este servlet é invocado e retorna como resposta

uma string HTML• Esta string é retornada para o cliente• O servlet gerado é colocado no diretório works do

Tomcat.n Todo o processamento ocorre no servidor,

apenas o Html é retornado

Como os dados são passados do cliente para o servidor

Primeiro exemplo de JSP

n Crie no bloco de notas um arquivo, agradecimento.jsp e o salve no diretório root de webapps com o seguinte conteúdo

<HMTL><HEAD> <TITLE> Usando JSP </TITLE> </HEAD><BODY BGCOLOR=#DADADA>Obrigada por acessar a página do<I><%= request.getParameter("titulo") %></I></BODY></HTML>

n Execute o tomcat e chame a página jsp através da seguinte url:

http://localhost:8080/agradecimento.jsp?titulo=Curso+de+Desenvolvimento+WEB

ASP x JSP

n Active Server Pages (ASP) é uma tecnologia similar desenvolvida pela Microsoft.

n A primeira vantagem de JSP sobre ASP é que a parte dinâmica é escrita em Java e não Visual Basic ou outra linguagem proprietária da Microsoft

n Em segundo lugar JSP é mais portável para outros sistemas operacionais e servidores WEB que não sejam Microsoft.

Elementos JSP

n Uma página JSP pode ter três tipos de elementos:• Elementos de Script que são inseridos

diretamente no servlet• Diretivas que permitem a manipulação do

código gerado como servlet• Ações que possibilitam o uso de outros

componentes, como Java Beans

Objetos que podem ser usados empáginas Jsp diretamente

n Para simplificar o código JSP existem um conjunto de objetos implícitos que podem ser usados pelo programador. Os mais importantes são:• HttpServletRequest request• HttpServletResponse response• HttpSession session• PrintWriter out• ServletContext application• ServletConfig config• PageContext pageContext• HttpJspPage page• Thorwable exception

n ExemploHost: <%request.getServerName()%>

Objetos Implícitos

n request e response• Este objetos funcionam como em um Servlet. Podemos

fazer requisições de seus métodos como fazíamos em um Servlet

• Exemplos:<% String nome = request.getParameter(“nome”);

response.sendRedirect(http://abg.com.br); %>n out

• Este objeto funciona exatamente como o objeto que usamos para escrita em um response do Servlet

• Exemplo:<% out.println(produto.getNome()); %>

Objetos Implícitosn session

• Objetos para controle de sessão.• Exemplo:

<% String contador = (String) session.getAttribute(“contador”); %>n page

• Possui os métodos jspInit() e jspDestroy(), que podem ser chamados no corpo da página jsp para configurar algum recurso na inicialização ou destruição da página JSP. É só implementar estes métodos no corpo da página

• Exemplo:<% public void jspInit(){

System.out.println(“Iniciando”);}

%>n pageContext, page, application e execption são utilizados

da mesma forma que em um Servlet.

JSP

n A maior parte de um arquivo jsp consiste em tags HTML

n São passadas como saída do servletn Páginas jsp são criadas com ferramentas

HTMLn Comentários JSPn <%-- --> não são passados para o clienten Comentários HTMLn <!-- comentário --> Passados para o cliente

JSP – Sintaxe Básica

n Os tags JSP possuem a seguinte forma geral:<% Código JSP %>

• Exemplo<% out.println((String)session.getAtribute(“carrinho”).getNome()); %>

n O primeiro caractere % pode ser seguido de outros caracteres que determinam o significado preciso do código dentro do tag.

n Os tags JSP possuem correspondência com os tags XML.

JSP – Sintaxe Básica

n Expressões<%= expressões %>

n Expressões são avaliadas, convertidas para String e colocadas na página enviada. A avaliação é realizada em tempo de execução, quando a página é requisitada.

n Exemplos:<%= new java.util.Date() %><%= request.getRemoteHost() %>

JSP – Sintaxe Básica

n Scriptlets<% código java %>

n Para tarefas mais complicada existem os Scriptletspermitem inserir trechos de código em Java.

n Exemplo:<%

String queryData = request.getQueryString();out.println(”Dados GET associado: " + queryData);

%>

JSP – Sintaxe Básican Exemplo: Previsão do Tempo<% if (Math.random() < 0.5) { %>

Hoje vai <B>fazer sol</B>!<% } else { %>

Hoje vai <B>chover</B>!<% } %>

n e convertido em (no Servlet gerado pelo JSP)out.println("Previs&atilde;o do Tempo");if (Math.random() < 0.5) {

out.println(" Hoje vai <B>fazer sol</B>!");} else {

out.println(" Hoje vai <B>chover</B>!");}

JSP – Sintaxe Básican Declarações

<%! Código Java %>n Exemplo

<%! private int numAcesso = 0; %>Acessos desde até o momento desde o inicio dasessão:<%= ++ numAcesso %>.

n Uma declaração JSP permite definir variáveis e métodos que são inseridos no corpo do servlet.

n Como as declarações não geram saída, elas são normalmente usadas em combinação com expressões e scriptlets.

n As varíaveis declaradas desta forma são varíaveis de instância. As variáveis declaradas dentro de scriplets são varíaveis locais e não acessíveis os métodos declarados.

JSPn Alternativamente, podemos utilizar a sintaxe XML:

• Expressões<jsp:expression> request.getRemoteHost() </jsp:expression>

• Scriplets<jsp:scriptlet>String queryData = request.getQueryString();out.println(" Dados do Get: " + queryData);

</jsp:scriptlet>• Declarações<jsp:declaration>private int accessCount = 0;</jsp:declaration>

JSP - Considerações

n Os objetos implícitos não são acessíveis para métodos declarados no contexto de uma página JSP.

n Se precisarmos acessar algum objeto implícito de dentro de um método jsp devemos passá-los como parâmetro para o método.

<%!private void metodoXXX(HttpSession s) {processaS(s);}%><% metodoXXX(session); %>

Diretivas JSP

n Afetam a estrutura geral do servlet gerado da página JSP

n Possuem o seguinte formato:<%@diretiva atributo=“valor” %>

n ou em XML<jsp:directive.diretiva atributo=“valor”/>

Tipos de Diretivas

n Existem três tipos de diretivas JSP:n page, para importação de classes, alteração

do tipo do conteúdo, etc.n include, para inclusão de arquivos durante a

execução do JSPn taglib, para definição de tags próprias

usadas em bibliotecas de tags

Propósito da diretiva page

n Permite o controle• Quais classes serão importadas• Quais classes o servlet resultante herda• Como o multiprocessamento é tratado• Se o servlet resultante participará de

sessões• Como tratar erros resultantes

Diretiva page Import

n Atributo importn Usado para importar classes para o servlet gerado

pelo JSPn Pode aparecer várias vezes no JSPn Exemplo:n <%@page import = “java.util.*” %>n Obs: os pacotes a serem importados pela diretiva

import, caso não sejam os pacotes básicos java ou tomcat, devem estar no diretório web-inf/classes de sua aplicação, seguindo a estrutura de diretório do pacote.

Diretiva page contentType

n Atributo contentTypen Usado para alterar o formato MIME do texto

de saídan Exemplo:

<%@page contentType=“text/html”%>

Diretiva page contentType

n Exemplo:<%@ page contentType="text/plain" %>

n possui o mesmo efeito do scriptlet<% response.setContentType("text/plain"); %>

n Exemplo (geração de saída planilha excel):<%@ page contentType="application/vnd.ms-excel" %><%-- Entre as colunas temos tabulação e não espaços,--%>

1997 1998 1999 2000 200112.3 13.4 14.5 15.6 16.7

Diretiva page isThreadSafen Atributo isThreadSafen Controla o uso de múltiplas threads no servlet gerado

• Um valor true (default) indica um processamento normal do Servlet, onde múltiplas requisições são processadas simultaneamente.

• Um valor false indica que o processamento deve ser feito por instancias separadas do Servlet ou serialmente.

n O padrão é usar multithread (true)• Considera-se que os métodos de acesso a campos

atualizáveis é feito de maneira sincronizada (uso do synchronized

• Se setado como falso degrada a performance.n Exemplo:

<%@page isThreadSate=“false”%>

Exemplo de código sincronizado

<%! private int idNum = 0; %><%synchronized(this) {String userID = "userID" + idNum;out.println("Your ID is " + userID + ".");idNum = idNum + 1;}%>n Com o exemplo acima, não precisamos setar a

diretiva isThreadSafe como false.

Diretiva page Session

n Atributo sessionn Indica se a página em questão faz parte de

uma sessão sendo que o seu valor padrão é true

n Ex:<%@page session=“false” %>

n Neste caso a variável pré-definida sessionnão pode ser acessada

Diretiva page Buffer

n Atributo buffern Indica o uso e tamanho do buffer usado pela

variável out.n Exemplo:

<%@page buffer = “32kb”%>n ou

<%@page buffer = “none” %>

Diretiva page autoflush

n Atributo autoflushn Controla o comportamento do buffer

quando ele estiver cheio: true executa um “flush” automático e false gera uma exceção

n Exemplo:n%@page autoflush=“true”%n Um valor true (default) indica que o buffer deve

ser esvaziado quando estiver cheio.

Diretiva page extends

n Atributo extendsn Altera a superclasse do servlet geradon Exemplo:n %@page extends=“MeuServlet.class”%n Deve ser usado com extrema cautela e só

em casos de extrema necessidade.

Diretiva page errorPage

n Atributo errorPagen Indica o nome da página que deve ser

mostrada em caso de erron Exemplo:

<%@page errorPage=“URL relativa”%>

Diretiva page isErrorPage

n Atributo isErrorPagen Indica se a página atual pode ser usada

como página de erron O valor padrão deste atributo é falsen Exemplo:

<%@page isErrorPage=“true”%>

Exemplo errorPage(página Computers.jsp)...<BODY><%@ page errorPage="SpeedErrors.jsp" %><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS="TITLE">Computing Speed</TABLE><%!private double toDouble(String value) {return(Double.valueOf(value).doubleValue());}%>

Exemplo isErrorPage(Página SpeedErros.jsp)...<BODY><%@ page isErrorPage="true" %><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS="TITLE">Error Computing Speed</TABLE><P>ComputeSpeed.jsp executou o seguinte erro:<I><%= exception %></I>. Este problema ocorreu na

seguinte parte:<PRE><% exception.printStackTrace(new java.io.PrintWriter(out)); %></PRE>...

Diretiva include

n Usada para incluir outros arquivos em páginas JSP

n Possui dois formatos, o primeiro inclui arquivos em tempo de compilação e o segundo em tempo de requisição

n A diretiva deve aparecer no ponto em que o arquivo será incluído

Incluindo arquivos (compilação)

n Sintaxe:<%@include file=“URL relativa”%>

n Arquivos incluídos podem ser arquivos JSP

n Se o arquivo incluído mudar, todos os JSP que o utilizam devem ser recompilados

Incluindo arquivos (requisição)

n Sintaxe:<jsp:include page=“URL relativa” flush=“true”%>

n Os arquivos incluídos não podem conter comandos JSP

n Se o arquivo mudar, ele será lido novamente.

Exemplo de JSP – acesso abanco de dados

<%@ page session="false" %><%@ page import="java.sql.*"%><%try{Class.forName(" sun.jdbc.odbc.JdbcOdbcDriver ");System.out.println(“driver carregado");}catch (Exception ex){}%><%@ include file="header.html" %>

<% String sql = "select username, senha from usuarios";try{Connection con =

DriverManager.getConnection("jdbc:odbc:empresa", "", "");Statement st = con.createStatement();System.out.println(sql);ResultSet rs = st.executeQuery(sql);

while(rs.next()){out.println("<TR>");out.println("<TD>" + rs.getString(1) + "</TD>");out.println("<TD>" + rs.getString(2) + "</TD>");out.println("</TR>"); }

rs.close();st.close();con.close(); }catch (Exception e) {}%><%@ include file="footer.html" %>

Header.html<HTML><HEAD><TITLE>Teste Jsp</TITLE></HEAD><BODY><CENTER><BR><TABLE><TR><TH> Login </TH><TH> Senha </TH></TR>

Footer.html</TABLE></CENTER></BODY></HTML>

Técnicas para gerenciamento de sessão

n Cookiesn Objetos de sessãon Outras adaptadas (envio de campos

hidden, envio de identificadores junto com a chamada dos servlets).

Uso de Cookiesn Um cookie é uma informação que é passada para a

frente e para trás na solicitação http e resposta.n Cookies não são usados apenas para gerenciamento

de sessão. São também usados para lembrar qualquer informação que desejarmos.

n Uso indiscriminado traz problemas.....n Como funciona

• O servlet envia um nome e um valor para o cliente.• O cliente retorna o mesmo nome e mesmo valor quando ele

se conectar novamente com aquele site ou domínion Usos de cookies

• Identificar um usuário em uma sessão de comércio eletrônico

• Passar login e senha para o usuário.• Customizar um site de acordo com as preferências do

usuário• Propaganda focada

Problemas no uso de cookies

n Privacidade• Servidores podem lembrar suas ações anteriores• Se você disponibiliza informações pessoais, os servidores

podem ligar estas informações com suas ações anteriores.• Servidores podem compartilhar seus cookies com outros....• Sites mal projetados armazenam informação confidencial

(numero de cartão de crédito diretamente em cookies....)

n O que devemos fazer?n Se o uso de cookies não for tão crítico para a

funcionalidade de seu site, evite servlets que falham quando cokkies estão desabilitados nos browsers.

n NÃO COLOQUE INFORMAÇÃO CONFIDENCIAL EM COOKIES.

Criação e recuperação de um cookie

n Criar um objeto da classe Cookie, passando como parâmetros para o método construtor o nome e o valor do cookie (ambos string).

Cookie c1 = new Cookie(“nome”, “giuliano”);n Depois, você pode acrescentar o cookie a saída http.

response.addCookie(c1);n Para tornamos um cookie persistente, usamos o método

setMaxAge(milisegundos).Cookie c = new Cookie("nome","valor");c.setMaxAge(60*60*24*30);//persiste por 30 dias....response.addCookie(c);

n OBS: como os cookies são escritos nos cabeçalhos de solicitação e resposta, não é possível acrescentar um cookie depois de uma saída ter sido escrita ao objeto HttpServletResponse

Cookies persistentes

n Para recuperar cookies, usamos o método getCookies, da interface HttpServletRequest

Cookie[ ] cookies = request.getCookies();

n ExemploCookie[ ] cookies = request.getCookies();

Armazenando em Cookies<%

String u = request.getParameter("user");String s = request.getParameter("senha");

if ((u.equals("giuliano")) && (s.equals("123456"))){

Cookie c1 = new Cookie("usuario",u);c1.setMaxAge(60*60*24*30); response.addCookie(c1);

%>

Recuperando Cookies<%

Cookie[ ] cookies = request.getCookies();if (cookies!= null){

int tamanho = cookies.length;for (int i=0; i<tamanho; i++){

Cookie cookie = cookies[i]; if (cookie.getName().equals("usuario"))

out.println(cookie.getValue());}

} %>

Uso de Session

n Java possui uma classe HttpSession criada especificamente para o gerenciamento de sessão

n Para cada usuário, o JSP possui um objeto da classe HttpSession implícito, que é associado ao usuário e só pode ser acessado por aquele usuário em particular.

n Age como uma hashtable, onde você pode armazenar qualquer quantidade de pares chave/objeto.• Este objeto HttpSession fica acessível para outros arquivos

Jsp ou Servlets no mesmo aplicativo.• Para recuperar um objeto previamente armazenado, você só

precisa passar a chave.

Vantagens

n Geralmente o gerenciamento de sessão com o HttpSession usa “por baixo dos panos” cookies.

n No entanto, caso cookies não esteja habilitado no browser, ele passa automaticamente para reescrita de url, sem intervenção do desenvolvedor.

n Pode armazenar objetos descendentes da classe Object

n Fácil recuperação da sessão do usuário atual

HttpSessionn Contém métodos para:

• Recuperar/criar sessões:

getSession()/getSession(true)• Recuperar/retirar/armazenar dados na sessão:

getAttribute(nome)/removeAttribute(nome)/setAttribute(“nome”, valor)

• Descartar sessões:

setMaxInactiveInterval(segundos)invalidate()

HttpSessionn Recuperando Sessões

session =request.getSession(true);n O valor true indica que uma sessão deve

ser criada se não existirn Para verificar se uma sessão é nova,

utiliza-se o método isNew()

if (session.isNew()){......}

HttpSession

n Associando Valores: podem ser associados objetos de qualquer tipo

n Métodos• getAttribute• setAttribute• removeAttribute• getAttributeNames

ServletsServlets

Prof. Giuliano Prado de Morais Giglio, M.Sc.

Plataforma JavaPlataforma JavaProgramação Programação WebWeb em Javaem Java

Servlets

n Definição: Código Java, carregado em um Servidor Web, que é usado para tratar requisições de clientes,como CGI.

n Características:• Persistente;• Seguro;• Independente de plataforma;• Acessa Banco de Dados; e• Pode ser integrado com Applets, no cliente,

iniciando uma conversação

Servlets

nUso de Servlets• Geração de Conteúdo HTML Dinâmico• Sincronização de requisições• Redirecionamento de requisições• Lê dados enviados explicitamente pelo

cliente (formulários HTML oapplets)• Acessa banco de dados/aplicações

legadas/ regras de negócio e retorna para o cliente (em HTML)

Como executar um servlet

n Como podemos ver, o primeiro passo é a configuração do Tomcat

n Vamos utilizar o Tomcat 4.1.36 inicialmente.n É o mais popular e free....n Versões anteriores a versão 4 do Tomcat não são

recomendáveis pois a arquitetura foi totalmente remodelada para atender as novas especificações Servlet2.3 e JSP 1.2

n O próprio tomcat é um servidor web

Servletsn A API Servletn A API Servlet é composta por um conjunto de interfaces e

Classes. O componente mais básico da API é interface Servlet. Ela define o comportamento básico de um Servlet.

public interface Servlet {public void init(ServletConfig config) throws

ServletException;public ServletConfig getServletConfig();public void service(ServletRequest req,S ervletResponse

res) throws ServletException, IOException;public String getServletInfo();public void destroy();

}

Servletsn A API Servlet

n O método service() é responsável pelo tratamento de todas as requisições dos clientes.

n Os métodos init() e destroy() são chamados quando o Servlet é carregado e descarregado, respectivamente.

n O método getServletConfig() retorna um objeto ServletConfig que contém os parâmetros de inicializaçãodo Servlet.

n O método getServletInfo() retorna um String contendo informações sobre o Servlet, como versão e autor.

Servletsn A API Servletn Tendo como base a interface Servlet o restante

da API Servlet se organiza hierarquicamente como mostra a figura abaixo.

Servlets

n A classe GenericServlet implementa um servidor genérico e geralmente não é usada.

n A classe HttpServlet é mais utilizada e foi especialmente projetada para lidar com o protocolo HTTP.

public abstract class HttpServlet extends GenericServlet implements java.io.Serializable

Servletsn A classe derivada da HttpServlet deve

sobrescrever pelo menos um dos métodos abaixo:• doGet para tratar requisições HTTP GET.• doPost para tratar requisições HTTP POST.• doPut para tratar requisições HTTP PUT.• doDelete para tratar requisições HTTP DELETE.

n O método service(), que recebe todas as requisições, em geral não é sobrescrito, sendo sua tarefa direcionar a requisição para o método adequado.

Servletsn Vamos criar nossa primeira aplicação Servlet herdando da

classe HttpServlet.n Como primeiro passo, vamos criar abaixo do “webapps” um

diretório chamado “desenvweb”.n Dentro deste diretório, vamos criar o diretório obrigatório WEB-

INF e dentro deste o diretório classes.n Copie o arquivo web.xml de algum exemplo disponível e

modifique de forma que este fique com o seguinte conteúdo:

?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"><web-app>

<servlet><servlet-name>Teste</servlet-name><servlet-class>TestaServlet</servlet-class>

</servlet></web-app>

Primeiro Exemplo de Servletsimport javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;public class TestaServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{

response.setContentType(“text/html”);PrintWriter out = response.getWriter();out.println("<HTML>");out.println("<HEAD>");out.println("<TITLE> Teste de Servlet</TITLE>");out.println("</HEAD>");out.println("<BODY>");out.println(“<B>Primeiro Teste de Servlets de Desenvolvimento WEB");out.println(“</BODY>");out.println("</HTML>");} }

Compilando e Executando o Servlet

n Vamos compilar nossa classe Javan javac TestaServlet.java (caso você tenha colocando

a biblioteca servlets.jar no classpath)n javac –classpath c:\jakarta-

tomcat4.0.1\common\lib\servlet.jarn TestaServlet.java (caso não tenha colocar a biblio

no classpath)n Inicialize o tomcatn Chame seu servlet a partir de um browser web:http://localhost:8080/desenvweb/servlet/TestaServlet ouhttp://localhost:8080/desenweb/servlet/Teste

Servletsn Quando implementamos um servlet, geralmente temos que

importar dois pacotes básicos:• javax.servlet: contém classes básicas para a programação servlet• Javax.servlet.http: contém classes e interfaces mais avançadas

para programação.n O método doGet() recebe dois objetos: um da classe

HttpServletRequest e outro da classe HttpServletResponse.n O HttpServletRequest é responsável pela comunicação do

cliente para o servidor e o HttpServletResponse é responsável pela comunicação do servidor para o cliente.

n Primeiramente é usado o método setContentType() para definir o tipo do conteúdo a ser enviado ao cliente. Esse método deve ser usado apenas uma vez e antes de se obter um objeto do tipo PrintWriter ou ServletOutputStream para a resposta.

n Se o programador desejar enviar a resposta em bytes deve usar o método getOutputStream() para obter um objeto OutputStream.

n Uma vez carregado o Servlet não é mais descarregado, a não ser que o servidor Web tenha sua execução interrompida.

Usando parâmetros iniciais no Servlet

import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;public class TestaServlet extends HttpServlet {

ServletConfig servletconfig;String parametro;

public void init() throws ServletException{ servletconfig = getServletConfig();Enumeration parametros = servletconfig.getInitParameterNames();while (parametros.hasMoreElements()) {

parametro = (String) parametros.nextElement();parametro = parametro + ": "+servletconfig.getInitParameter(parametro); }

}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{ response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<HTML>");out.println("<HEAD>");out.println("<TITLE> Teste de Servlet </TITLE>");out.println("</HEAD>");out.println("<BODY>");out.println("<B>"+ parametro );out.println("</BODY>");out.println("</HTML>");

} }

web.xml com parâmetros iniciais

<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems,

Inc.//DTD Web Application 2.3//EN“ "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app><servlet><servlet-name>Teste</servlet-name><servlet-class>TestaServlet</servlet-class><init-param><param-name>adminemail</param-name><param-value>[email protected]</param-value></init-param></servlet>

</web-app>

Servlets - Criação

n Criar uma classe derivada de HTTPServletn Implementar os métodos doGet e/ou doPost

usando os parâmetros:• request para tratamento das requisições• response para tratamento das respostasügetWriter para pegar a stream de saída

n Chamar o servlet a partir do browser

Servlets –Request/Response

n Request - classe HttpServletRequest• Encapsula os dados do cliente: Contém os dados

enviados pelo cliente para serem processados no servidor

• Header, cookies, parâmetrosn Response - classe HttpServletResponse

• Encapsula os dados para o cliente: contém os dados que devem ser enviados como resposta ao cliente

• Header, cookies, conteúdo

Visita.html

<HTML><HEAD>

<TITLE>Segundo Servlet</TITLE></HEAD><BODY><FORM ACTION="http://localhost:8080/desweb/servlet/Visita"METHOD="GET"><H1>Primeiro Servlet</H1><H3>Por favor digite seu Nome: <INPUT TYPE="TEXT“

NAME="NomeVisitante" SIZE="25"></H3><H3><INPUT TYPE="SUBMIT" NAME="Submit" VALUE="Ok">

<INPUT TYPE="RESET" NAME="Reset" VALUE="Limpa"></FORM></BODY></HTML>

import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;public class Visita extends HttpServlet {

int conexoes;public void init(ServletConfig config) throws ServletException {super.init(config);conexoes=0; }//Processa o HTTP Get requestpublic void doGet(HttpServletRequest request, HttpServletResponse

response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter out = new PrintWriter (response.getOutputStream());out.println("<html>");out.println("<head><title>Segundo Servlet </title></head>");out.println("<body>");out.println("Meu Segundo Servlet");out.println("<p> Alô !!!");

out.println(request.getParameter("NomeVisitante"));out.print("<P>Obrigado pela visita !!! ");out.print("<P>") ;out.print("<P>Você é o visitante Número : ");conexoes++; //incrementaConexoes();out.println(Integer.toString(conexoes));out.println("</body></html>");out.close();}public String getServletInfo() //Informação do servlet{

return "Visita";}

}

Servlets – doGet e doPost

n Existem duas maneiras de se enviar dados pelo browser: Get e Post

n Como o tratamento é o mesmo chama-se um método a partir do outro• Get:: dados vem junto com a URL• Post:: dados vem separados da URL

Servlets – doGet e doPost

public void doGet (HttpServletRequest request,HttpServletResponse response)

{String nome = request.getParameter(“nome”);response.setContentType("text/html");PrintWriter out = response.getWriter();out.println(“Texto recebido: ” + nome);out.close();

}

Servlets – Service

n A cada nova requisição o servidor cria um novo thread e chama service

n O método service verifica a requisição e chama o método apropriado

n Se for sobreposto deverá fazer todo o tratamento de verificação e chamada dos métodos

Servlets – HttpServletRequestn Um servlet pode receber parâmetros.n Estes parâmetros são o resultado do envio de dados

de um form html.n Recuperação de parâmetros (a partir do objeto

request):• getParameter: para pegar um parâmetro específico• getParameters: para recuperar todos os parâmetros

passados• getParameterNames: retorna uma enumeração (classe

Enumeration) contendo o nome dos parâmetros.• getQueryString: retorna a string de consulta enviada para o

Servlet.• getParameterValues: retorna mais de um valor selecionado

em parâmetros de formulários com retorno de multiplosvalores. Ex: ComboBoxex, CheckBoxes, etc.

Servlets – HttpServletResponse

n setContentType: método para setar o tipo de dados a ser enviado como resposta;

n getWriter: pegar o contexto para escrita de dados para o objeto response;

n setHeader: permite que se acrescente um campo nome/valor ao cabeçalho de resposta.

n sendRedirect: permite redirecionar o usuário para uma outra página

n sendError: enviar mensagem de erro de acordo com o erro capturado.

Outros métodos interessantesn Existem outros métodos que permitem que se passe

o processamento de uma solicitação.• Include: usado para incluir conteúdo de um outro recurso, tal

como um outro servlet, uma página JSP ou uma página HTML.

• Foward: é usado para encaminhar uma solicitação de um servlet para o outro.üDiferenças entre forward e sendRedirect:

– O sendRedirect faz uma volta completa, passando pelo browserpara chamar o outro servlet. Além disso, o objeto HttpServletRequest é perdido.

– O forward redireciona para o outro servlet sem a ajuda do browser e os objetos HttpServletRequest e HttpServletResponsevão junto.

• Para trabalharmos com este métodos temos que ter um objeto RequestDispatcher

import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;public class Login extends HttpServlet{private void enviaFormLogin(HttpServletResponse resposta,

boolean mensagemErro) throws ServletException, IOException{ resposta.setContentType("text/html");

PrintWriter saida = resposta.getWriter();saida.println("<HTML>");saida.println("<HEAD>");saida.println("<TITLE>Login</TITLE>");saida.println("</HEAD>");saida.println("<BODY>");if (mensagemErro)

saida.println(" Acesso Negado! Por favor, tente novamente.<BR>");

saida.println("<BR>");

Login.java

Dica: não se esqueça de atualizar

o arquivo web.xml com estes servlets

saida.println("<BR>Por Gentileza, entre seu nome e senha. ");saida.println("<BR><FORM METHOD=POST>");saida.println("<BR>Nome do Usuário: <INPUT TYPE=TEXTNAME=nomeUsuario");saida.println("<BR>Senha: <INPUT TYPE=PASSWORDNAME=senha");saida.println("<BR><INPUT TYPE=SUBMIT VALUE=Enviar");saida.println("</FORM>");saida.println("</BODY>");saida.println("</HTML>");}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{ enviaFormLogin(response, false);}

public void doPost(HttpServletRequest request, HttpServletResponse

response) throws ServletException, IOException{

String nomeUsuario = request.getParameter("nomeUsuario");String senha = request.getParameter("senha");if (nomeUsuario != null && senha != null &&

nomeUsuario.equals("giuliano")&& senha.equals(“prado")){RequestDispatcher rd =request.getRequestDispatcher(“Benvindo");rd.forward(request, response); }else{

enviaFormLogin(response, true);}

}}

import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;public class Benvindo extends HttpServlet {public void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException

{ response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("<HTML>");out.println("<HEAD>");out.println("<TITLE> Página Principal </TITLE>");out.println("</HEAD>");out.println("<BODY>");out.println("<B> Benvindos a página de “ +

request.getParameter("nomeUsuario"));out.println("</BODY>");out.println("</HTML>"); } }

Benvindo.java

Conexão com Banco de Dados

n JDBC: Java Database Connectivityn Acesso a Bando de Dados SQL

• Independente da Plataforma e do Banco de Dados;

• Disponível no pacote J2SDKn Vários Drivers disponíveis

• 100% Puro Java• Diversos drivers disponíveis

JDBC – Detalhes de Conexão

Exemplo de Servlet usando ODBCimport javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;import java.sql.*;public class LojaServlet extends HttpServlet{public void doGet(HttpServletRequest request,

HttpServletResponse response)throws ServletException, IOException{response.setContentType("text/html");PrintWriter out = response.getWriter();String driver = "sun.jdbc.odbc.JdbcOdbcDriver";String url = "jdbc:odbc:empresa";String nomeUsuario = "";String senha = "";

String nomeTabela = request.getParameter(“nomeTabela");if ((nomeTabela == null) || (nomeTabela.equals(""))) {nomeTabela = “clientes";}mostraTabela(driver, url, nomeUsuario, senha,nomeTabela, out);out.println("</CENTER></BODY></HTML>");}private void mostraTabela(String driver,

String url,String nomeUsuario,String senha,String nomeTabela,PrintWriter out)

{

try {Class.forName(driver);

Connection connection =DriverManager.getConnection(url, nomeUsuario, senha);

DatabaseMetaData dbMetaData = connection.getMetaData();out.println("<UL>");String nomeBanco = dbMetaData.getDatabaseProductName();out.println(" <LI><B>Database:</B> " +nomeBanco);String versaoBanco =dbMetaData.getDatabaseProductVersion();out.println(" <LI><B>Version:</B> " +versaoBanco +"\n</UL>");

Statement statement = connection.createStatement();String query ="SELECT * FROM " + nomeTabela;ResultSet resultSet = statement.executeQuery(query);out.println("<TABLE BORDER=1>");ResultSetMetaData resultsMetaData =resultSet.getMetaData();int qtdeColunas = resultsMetaData.getColumnCount();

out.println("<TR>");for(int i=1; i<qtdeColunas+1; i++) {

out.print("<TH>" + resultsMetaData.getColumnName(i));}out.println();while(resultSet.next()) {

out.println("<TR>");for(int i=1; i<qtdeColunas+1; i++) {

out.print("<TD>" + resultSet.getString(i));}out.println();

}out.println("</TABLE>");}catch (Exception e){System.out.println(e.toString());}}}

Uso de Uso de JavaBeansJavaBeans

Prof. Giuliano Prado de Morais Giglio, M.Sc.

Plataforma JavaPlataforma JavaProgramação Programação WebWeb em Javaem Java

Uso de JavaBeansn A medida que o código Java dentro do HTML torna-

se cada vez mais complexo o desenvolvedor pode-se perguntar: Java em HTML não é o problema invertido do HTML em Servlet? Em outras palavras, estou novamente misturando conteúdo com forma?

n Para solucionar esse problema pode-se usar Javabeans para manipular a parte dinâmica em Java.

n OBS: um JavaBean deve estar em um diretório classes, abaixo do WEB-INF.• Caso o coloque em um package (o que devo

obrigatoriamente fazer) esta estrutura de diretório do package deve estar abaixo do classes.

Uso de JavaBeans

n Um Javabean nada mais é que uma classe Java que obedece a uma certa padronização de chamada.

n Os atributos de um bean são acessados por meio de métodos que obedecem a convenção getXxxx e setXxxx. Exemplo: getItem()

n Os atributos booleanos seguem a seguinte convenção: isXxx() para acessar seu valor e getXxx() para setar seu valor.

n Todos os atributos de um Bean devem ser privados.n Se houver construtor, pelo menos um deles deve vir

sem argumento.

Uso de get e set

n Assim, você deve modificar qualquer atributo público de uma classe Java.

n Exemplo:public double velocidade;

Devemos substituir por:private double velocidade;public double getVelocidade() {

return(velocidade);}public void setVelocidade(double novaVelocidade) {

velocidade = novaVelocidade;}

Uso de get e setn Porque???n Você colocar algumas restrições em seus valores

public void setVelocidade(double novaVelocidade) {if (novaVelocidade < 0) {

enviaMsgErro(...);novaVelocidade = Math.abs(novaVelocidade);

}velocidade = novaVelocidade;}

n Se os usuários acessarem diretamente os atributos, eles serão os responsáveis por verificar estas restrições.

n Você pode mudar sua representação interna sem mudar seus valores.

n Você pode realizar outras operações (atualização de valores relacionados, por exemplo.

Uso de JavaBeans em páginas JSP

n A sintaxe para o uso de um bean é:<jsp:useBean id=“nome" class="package.class" />n Exemplo de uso:

<jsp:useBean id= "livro" class= “desweb.Livro" />

Que seria equivalente ao Scriptlet<% abg.Livro livro = new desweb.Livro(); %>

n Obs: É por isso que precisamos de um construtor sem parâmetro....

Uso de JavaBeans em páginas JSP

n Você também pode modificar o atributo scope para estabelecer o escopo do beanalém da página corrente.

n <jsp:useBean id="name" scope="session“ class="package.class" />

n Vantagens adicionais no uso de Beans:• Facilita o compartilhamento de objetos entre

páginas e servlets.

Exemplo de uso de um JavaBean com JSP

Dobra.jsp

<jsp:useBean id="CalcBean" class="com.desweb.CalculatorBean"/><HTML><HEAD></HEAD><BODY><%

int i = 4;int j = CalcBean.dobra(i);out.print(" 2* 4=" + j);

%></BODY></HTML>

JavaBean CalculatorBean.java

package com.desweb;

public class CalculatorBean{

public int dobra(int numero){

return 2* numero;}

}

Instalação do Bean

n Instalado como servlet no diretório classes

C:\Arquivos de programas\Apache Software Foundation\Tomcat4.1\webapps\deseweb\WEBINF\classes\com\cursoweb

n Observe que criamos diretórios para refletir o pacote onde está o Bean

n A página jsp pode estar no raiz da nossa aplicação.

Acessando as propriedades de um

Beann Formato<jsp:getProperty name="nome" property="propriedade"/>n Objetivo

• Permitir o acesso as propriedades de um Bean (i.e., chamadas aos métodos getXxx) sem programação javaexplícita

n Exemplo:<jsp:getProperty name=“livro" property=“titulo" />

• Seria o equivalente a seguinte expressão jsp:

<%= livro.getTitulo() %>

Modificando as propriedades de um Bean

n Formato<jsp:setProperty name=“nome“ property=“propriedade”

value=“valor”/>n Objetivo

• Permitir a modificação das propriedades de um Bean (i.e., chamando os método setXxx) sem programação Java explícita.

n Exemplo<jsp:setProperty name=“livro“ property=“titulo“ value="Core

Servlets and JavaServer Pages" />

• É o equivalente ao seguinte scriplet

<% livro.setTitulo("Core Servlets and JavaServer Pages"); %>

Exemplo: página JSP

<HTML> <HEAD>

<TITLE>Uso de beans</TITLE>

</HEAD> <BODY> <CENTER>

<TABLE BORDER=5> <TR><TH CLASS="TITLE"> Uso de JavaBeans

</TABLE> </CENTER> <P>

<jsp:useBean id="test" class=”com.desweb. BeanSimples" />

<jsp:setProperty name="test" property=“mensagem" value=”Ola

mundo!" />

<H1>Mensagem: <I>

<jsp:getProperty name="test" property=“mensagem" /> </I></H1>

</BODY> </HTML>

Exemplo: JavaBean com.desweb/BeanSimples.java

package com.desweb;

public class BeanSimples{private String mensagem = “Nenhuma

mensagem especificada";

public String getMensagem() {return(mensagem);

}public void setMensagem(String mensagem) {

this.mensagem = mensagem;}

}

Modificando as propriedades de um Bean

n Alternativamente, podemos modificar alguma propriedade de um Bean utilizando diretamente algum parâmetro passado pelo cliente

n Exemplo<jsp:setProperty name=“livro“ property=“titulo“ value'<%=

request.getParameter(“tituloBusca“) %>'/>n Se o nome do parâmetro for o mesmo da propriedade, podemos

usar(já se faz a conversão de tipos automaticamente):<jsp:setProperty name=“livro“ property=“titulo“param=“titulo"/>n Se todas as propriedades forem setadas através dos

parâmetros vindos em um request, podemos simplificar da seguinte forma:<jsp:setProperty name="entry" property="*" />

Compartilhamento de Beans

n Podemos compartilhar Beans através do atributo scope da tag jspBean.

n Existem quatro valores possíveis: page, request, session e application.• O default é page.

Compartilhamento de Beans

n scope page• Objetos declarados com nesse escopo são válidos até a

resposta ser enviada ou a requisição ser encaminhada para programa no mesmo ambiente, ou seja, só podem ser referenciados nas páginas onde forem declarados. Objetos declarados com escopo page são armazenados no objeto pagecontext

n O Bean é instanciado como uma variável local da página.• Podemos acessá-lo chamando getAttribute da variável

pageContext.

n Geralmente acessados usando:• jsp:getProperty,• jsp:setProperty,• scriptlets, ou expressions na mesma página.

Compartilhamento de Beans

n scope request• Objetos declarados com nesse escopo são

válidos durante a requisição e são acessíveis mesmo quando a requisição é encaminhada para programa no mesmo ambiente. Objetos declarados com escopo request são armazenados no objeto request.

• Com isso a acessibilidade ao Bean é incluida a páginas referenciadas por jsp:forward e jsp:include. A página encaminhada não precisa ter um elemento de ação jsp:useBean. Podemos usar getProperty e setProperty na página encaminhada sem problemas.

Compartilhamento de Beans

n scope session• Objetos declarados com nesse escopo são

válidos durante a sessão desde que a página seja definida para funcionar em uma sessão. Objetos declarados com escopo session são armazenados no objeto session (objeto implícito da página jsp).

• Assim, podemos recuperar este Bean chamando o método getAttribute do objeto session.

• Se a página jsp estiver definida para não usar sessão, uma exceção ocorrerá.

Compartilhamento de Beans

n scope application• Objetos declarados com nesse escopo são acessíveis por páginas

no mesmo servidor de aplicação. Objetos declarados com escopo application são armazenados no objeto application.

• Assim, o Bean será armazenado em um objeto ServletContextdisponível através do objeto implícito application ou chamando através do métod getServletContext.

• Relembrando, um ServletContext é compartilhado por todos os servlets em uma mesma aplicação WEB.

n Os valores em um ServletContext podem ser acessados através do método getAttribute.• Isso traz uma série de vantagens:

ü Mecanismo que permite que vários servlets e páginas JSP acessem o mesmo objeto.

ü Permite que um servlet crie um Bean que será usado em um JSP, permitindo o uso mais adequado do modelo MVC.

Compartilhamento de Beans

n Importante• Se no setProperty usarmos o valor “*” significa que

toda modificação em elementos do formulário será automaticamente passada para a propriedade do bean de mesmo nome.

• Os valores são automaticamente convertidos para o tipo correto no bean.

Uso de Beans: carrinho de compras

<html><jsp:useBean id= "compra" scope="session"class= "Compras" /><jsp:setProperty name= "compra" property="*" /><% compra.ProcessaRequisicao(request);%><FONT size = 5><br> Voc&ecirc; comprou os seguintes itens:<ol><%

String[] items = compra.getItems();for (int i=0; i<items.length; i++) {

%><li> <%= items[i] %><%

}%></ol></FONT><hr>

<body bgcolor="white"><font size = 5 color="#CC0000"><form type=POST action=compras.jsp><BR>Entre um item para adicionar ou remover:<br>

<SELECT NAME="item"><OPTION>Televis&atilde;o<OPTION>R&aacute;dio<OPTION>Computador<OPTION>V&iacute;deo Cassete</SELECT><br> <br><INPUT TYPE=submit name="submit" value="adicione">

<INPUT TYPE=submit name="submit" value="remova">

</form></FONT></body></html>

O javabean Compras

import javax.servlet.http.*;import java.util.Vector;import java.util.Enumeration;public class Compras {

Vector v = new Vector();String submit = null;String item = null;private void addItem(String name) {

v.addElement(name);}private void removeItem(String name) {

v.removeElement(name);}

public void setItem(String name) {item = name;

}public void setSubmit(String s) {

submit = s;}public String[] getItems() {

String[] s = new String[v.size()];v.copyInto(s);return s;

}private void reset() {

submit = null;item = null;

}

public void processaRequisicao(HttpServletRequest request) {

if (submit == null)return;

if (submit.equals("adicione"))addItem(item);

else if (submit.equals("remova"))removeItem(item);

reset();}

}