Você está na página 1de 30

Agenda de Compromisso

Colgio: Universidade Tiradentes


Curso: Introduo aplicao web com conexo a banco de dados
Prof.: Silvio Fernandes M. Vasconcelos
Agenda de Compromisso

1. Construindo a aplicao
Iniciando a construo da aplicao, vamos criar um formulrio de cadastro de compromisso, um bean que
representa as regras de negcios, e um arquivo JSP que processa o formulrio. Criaremos tambm um
formulrio idntico ao primeiro mas que mostra possveis erros ocorridos no cadastro. E por ltimo, uma
pgina HTML simples que indica se o cadastro foi realizado ou no.

1.1. Construindo a tela inicial


Aqui iremos criar a tela inicial da nossa aplicao de agenda de compromisso. Ele feito em JSP.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-


1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Agenda de Compromisso</title>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%">
<tr>
<td><img src="imagens/cabecalho.jpg" width="100%" height="100"></td>
</tr>
<tr>
<td><%pageContext.include("menu.html");%></td>
</tr>
<tr>
<td align="center" valign="middle">
<iframe name="corpoTela" width="950" height="420" scrolling="auto" frameborder="0"
align="center"></iframe>
</td>
</tr>
<tr>
<td><img src="imagens/rodape.jpg" width="100%" height="50"></td>
</tr>
</table>
</body>
</html>

1.2. Criando um JavaBean (Regra de Negcio)


Vamos criar nosso beans que ter as informaes da agenda e seu controle. Ele deve ter todos os
atributos do formulrio que construmos, e todos os mtodos set e get para acess-los.

1.2.1. Bean Diversos


package br.se.agenda;
/*
Classes Diversos (Bean)
Autores: Silvio Fernandes M. Vasconcelos
*/
import java.sql.ResultSet;
import java.sql.Connection;
import java.sql.DriverManager;
Agenda de Compromisso
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import java.util.Vector;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.naming.Context;
import javax.naming.InitialContext;

public class BeanDiversos {

private String camPath = getClass().getResource("").getPath();


private String caminhoAplic = camPath.substring(1,camPath.indexOf("WEB-INF"));
// Variaveis publicas
public Connection con = null;
public Statement stmt = null;
// public String camPath=((Object) application).toString();

// Metodo que checa se o campos e nulo e retorna a uma String no formato carreto
public String RetString(String campo,String tipo) {
String resultDados="";
if ((campo == null) || (tipo.trim().equals("D"))) {
if (tipo.trim().equals("D")) {
if (campo == null) {resultDados = "";}
else {resultDados =
campo.substring(8,10)+"/"+campo.substring(5,7)+"/"+campo.substring(0,4);}
}
else if (tipo.trim().equals("N")) {
if (campo == null) {resultDados = "0";}
}
else {resultDados = "";}
}
else {resultDados = campo;}
return resultDados;
}

// Metodo que checa o campo e retorna a uma String no formato correto


public String Chec(String campo,String tipo) {
String resultDados="";
if (tipo.trim().equals("N")) {
if (campo.trim().length() == 0) {resultDados = "0";}
else {resultDados = campo;}
}
if (tipo.trim().equals("C")) {
if (campo.trim().length() == 0) {resultDados = "null";}
else {resultDados = "'"+campo+"'";}
}
if (tipo.trim().equals("D")) {
if (campo.trim().length() == 0) {resultDados = "null";}
else {resultDados = "'"+campo.substring(3,6)+campo.substring(0,3)+campo.substring(6)+"'";}
}
return resultDados;
}

// Metodo que retorna a data do servidor


public String DataSistema() {
Date dt = new Date();
SimpleDateFormat data = new SimpleDateFormat("dd/MM/yyyy");
return data.format(dt);
Agenda de Compromisso
}

// Metodo que retorna a hora do servidor


public String HoraSistema() {
Calendar data = Calendar.getInstance();
return (data.getTime().toString().substring(11,19));
}

// Metodo que cria a conexao com o banco de dados


public void Conexao() {
try {
Class.forName("org.firebirdsql.jdbc.FBDriver");
con =
DriverManager.getConnection("jdbc:firebirdsql:localhost/3050:"+caminhoAplic+"data/DB_AGENDA.GD
B","SYSDBA", "masterkey");
con.setAutoCommit(false);
stmt = con.createStatement();
}
catch (Exception ex) {ex.printStackTrace();}
}
}
}

1.2.2. Bean Agenda


package br.se.agenda;

import java.util.Vector;
import java.sql.ResultSet;

/*
Classes Agenda (Bean)
Autores: Silvio Fernandes M. Vasconcelos
*/

public class BeanAgenda {

// Estanciar a classe BeanDiversos


BeanDiversos dv = new BeanDiversos();

// Variaveis privadas
private String ageId;
private String ageDesc;
private String ageData;
private String ageHora;
private String ageStatus;

public String getAgeId() {


return ageId;
}

public void setAgeId(String ageId) {


this.ageId = ageId;
}

public String getAgeDesc() {


return ageDesc;
}
Agenda de Compromisso
public void setAgeDesc(String ageDesc) {
this.ageDesc = ageDesc;
}

public String getAgeData() {


return ageData;
}

public void setAgeData(String ageData) {


this.ageData = ageData;
}

public String getAgeHora() {


return ageHora;
}

public void setAgeHora(String ageHora) {


this.ageHora = ageHora;
}

public String getAgeStatus() {


return ageStatus;
}

public void setAgeStatus(String ageStatus) {


this.ageStatus = ageStatus;
}

// Metodo Construtor
public BeanAgenda() {
LimparVariaveis();
}

// Metodo de incluir/alterar/excluir os compromissos


public String IncAltExcAgenda(String opcao) throws Exception {
String sqlString = "", msg="";
try {
if (opcao.equals("I")) {
sqlString = "Insert Into
Age_Agendamento(AGE_DESC,AGE_DATA,AGE_HORA)
Values("+dv.Chec(ageDesc,"C")+","+dv.Chec(ageData,"D")+","+dv.Chec(ageHora,"C")+")";
}
else if (opcao.equals("A")) {
sqlString = "Update Age_Agendamento Set
AGE_DESC="+dv.Chec(ageDesc,"C")+",AGE_DATA="+dv.Chec(ageData,"D")+",AGE_HORA="+dv.Ch
ec(ageHora,"C")+",AGE_STATUS="+dv.Chec(ageStatus,"C")+" Where AGE_ID="+dv.Chec(ageId,"N");
}
else if (opcao.equals("E")) {
sqlString = "Delete From Age_Agendamento Where
AGE_ID="+dv.Chec(ageId,"N");
}
dv.Conexao();
dv.stmt.executeUpdate(sqlString);
dv.con.commit();
LimparVariaveis();
}
catch (Exception e) {
dv.con.rollback();
msg = e.getMessage();
e.printStackTrace();
}
finally {
Agenda de Compromisso
try {dv.con.close();}
catch (Exception ex) {}
}
return msg;
}

// Metodo de pesquisar comprimisso


public void PesquisaAgenda(String codigo) throws Exception {
try {
dv.Conexao();
ResultSet rs = dv.stmt.executeQuery("Select
AGE_ID,AGE_DESC,AGE_DATA,AGE_HORA,AGE_STATUS From Age_Agendamento Where
AGE_ID = "+dv.Chec(codigo,"N"));
if (rs.next()) {
ageId = dv.RetString(rs.getString("AGE_ID"),"N");
ageDesc = dv.RetString(rs.getString("AGE_DESC"),"C");
ageData = dv.RetString(rs.getString("AGE_DATA"),"D");
ageHora = dv.RetString(rs.getString("AGE_HORA"),"C");
ageStatus = dv.RetString(rs.getString("AGE_STATUS"),"C");
}
else {LimparVariaveis();}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {dv.con.close();}
catch (Exception ex) {}
}
}

// Metodo de listar Tranecedores


public Vector ListarAgenda() throws Exception {
Vector v = new Vector();
try {
dv.Conexao();
ResultSet rs = dv.stmt.executeQuery("Select
AGE_ID,AGE_DESC,AGE_DATA,AGE_HORA,AGE_STATUS From Age_Agendamento Order By
AGE_DATA Desc");
while (rs.next()) {
Vector vAux = new Vector();
vAux.addElement(dv.RetString(rs.getString("AGE_ID"),"N"));
vAux.addElement(dv.RetString(rs.getString("AGE_DESC"),"C"));
vAux.addElement(dv.RetString(rs.getString("AGE_DATA"),"D"));
vAux.addElement(dv.RetString(rs.getString("AGE_HORA"),"C"));
vAux.addElement(dv.RetString(rs.getString("AGE_STATUS"),"C"));
v.addElement(vAux);
}
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {dv.con.close();}
catch (Exception ex) {}
}
return v;
}

// Metodo que limpa todas as variavies


public void LimparVariaveis() {
ageId = "";
Agenda de Compromisso
ageDesc = "";
ageData = "";
ageHora = "";
ageStatus = "";
}

1.3. Construindo o menu


Agora vamos construir o arquivo que mostra um menu simples, feito em HTML.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"


"http://www.w3.org/TR/html4/loose.dtd">
<html>
<body>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td><input type="button" value="Compromisso"
onclick="window.open('agenda.jsp','corpoTela')"></td>
<td><input type="button" value="Sair" onclick="window.close()"></td>
</tr>
</table>
</body>
</html>

1.4. Formulrio da agenda de compromisso


Este arquivo visualmente todos os compromissos cadastrados e deixa disponvel as opes de:
Incluir, Alterar e Excluir um compromisso.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"


"http://www.w3.org/TR/html4/loose.dtd">
<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-
1"%>
<%@page import="br.se.agenda.BeanAgenda,java.util.Vector"%>
<jsp:useBean id="age" scope="session" class="br.se.agenda.BeanAgenda"/>
<%Vector vtAgenda = new Vector();
vtAgenda = age.ListarAgenda();%>
<html>
<body>
<table border="0" cellpadding="2" cellspacing="0" width="100%" height="100%">
<tr>
<td><input type="button" value="Cadastrar" onclick="self.location.href='compromisso.jsp'"></td>
</tr>
<tr bgcolor="#FF4500">
<th width="8%">Data</th>
<th width="73%">Descrio</th>
<th width="8%">Hora</th>
<th width="5%">Exec.</th>
<th width="6%">Ap.</th>
</tr>
<tfoot bgcolor="#FF4500">
<%for (int i=0;i<5;i++) {out.println("<th>&nbsp;</th>");}%>
</tfoot>
<tbody>
<%if (vtAgenda.size() > 0) {
for (int i = 0; i < vtAgenda.size(); i++) {
Vector vAux = (Vector) vtAgenda.get(i);
String vDados[] = new String[vAux.size()];
for (int k=0;k < vAux.size();k++) {vDados[k] = (String) vAux.get(k);}%>
Agenda de Compromisso
<tr>
<td align="right"><%=vDados[2]%></td>
<td align="left"><a href="compromisso.jsp?tipo=A&id=<%=vDados[0]%>" title="Alterar
Compromisso" method="post">&nbsp;<%=vDados[1]%></a></td>
<td align="center"><%=vDados[3]%></td>
<td align="center"><%if (vDados[4].equals("N")) {%>No<%} else {%>Sim<%}%></td>
<td align="center"><a href="compromisso.jsp?tipo=E&id=<%=vDados[0]%>"
method="post"><img src="imagens/apagar.gif" title="Excluir Compromisso" border="0"></a></td>
</tr>
<%}
}%>
</tbody>
</table>
</body>
</html>

1.5 Formulrio de Incluso/Alterao e Excluso de compromisso


Este formulrio utilizado para incluir, alterar e excluir compromisso na agenda.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"


"http://www.w3.org/TR/html4/loose.dtd">
<%@page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-
1"%>
<%@page import="br.se.agenda.BeanDiversos,br.se.agenda.BeanAgenda,java.util.Vector"%>
<jsp:useBean id="dv" scope="session" class="br.se.agenda.BeanDiversos"/>
<jsp:useBean id="age" scope="session" class="br.se.agenda.BeanAgenda"/>
<%String tipo=request.getParameter("tipo"),titulo="",id=request.getParameter("id");
if ((tipo == null) || tipo.equals("I")) {
titulo = "Cadastrar Compromisso";
tipo = "I";
}
else if (tipo.equals("A")) {titulo = "Alterar Compromisso";}
else if (tipo.equals("E")) {titulo = "Excluir Compromisso";}
if (!tipo.equals("I")) {
age.PesquisaAgenda(id);
} else {
age.LimparVariaveis();
}%>
<script>
function submeter () {
if (document.cadComp.opcao.value == "I") {msg= "Confirma o cadastro do compromisso ? "}
else if (document.cadComp.opcao.value == "A") {msg= "Confirma a alterao do compromisso ? "}
else if (document.cadComp.opcao.value == "E") {msg= "Confirma a excluso do compromisso ?
"}
if (confirm(msg)){
document.cadComp.submit()
}
}
</script>
<html>
<body>
<center>
<h3><font size="6"><%=titulo%></font></h3>
</center>
<form name="cadComp" action="confComp.jsp" method="post">
<input type="hidden" name="opcao" value="<%=tipo%>">
<table border="0" cellpadding="0" cellspacing="10" width="100%" height="100%">
<tr>
<td width="5%">Cdigo:</td>
Agenda de Compromisso
<td><input type="text" name="ageId" value="<%=age.getAgeId()%>" size="10" maxlength="10"
readonly></td>
</tr>
<tr>
<td valign="top">Descrio:</td>
<td><textarea name="ageDesc" rows="4" cols="80"><%=age.getAgeDesc()%></textarea></td>
</tr>
<tr>
<td>Data:</td>
<td><input type="text" name="ageData" value="<%=age.getAgeData()%>" size="10"
maxlength="10">&nbsp;DD/MM/AAAA</td>
</tr>
<tr>
<td>Hora:</td>
<td><input type="text" name="ageHora" value="<%=age.getAgeHora()%>" size="5"
maxlength="5">&nbsp;HH:MM</td>
</tr>
<tr>
<td>Executado:</td>
<td>
<select name="ageStatus">
<option value="N" <%if (age.getAgeStatus().equals("N")) {%>selected<%}%>>No</option>
<option value="S" <%if (age.getAgeStatus().equals("S")) {%>selected<%}%>>Sim</option>
</select>
</td>
</tr>
<tr>
<td colspan="2">
<center>
<input type="button" name="botao1" value="Confirmar" onclick="submeter()">&nbsp;&nbsp;
<input type="button" name="botao1" value="Voltar" onclick="history.go(-1)">
</center>
</td>
</tr>
</table>
</form>
</body>
</html>
<script>
document.cadComp.ageDesc.focus()
</script>

1.6 Formulrio de confirmao da gravao dos dados do compromisso


Este formulrio utilizado para pegar os dados do formulrio dos dados do compromisso e executar o
mtodo do nosso BeanAgenda (regra de negcio) que efetuar a incluso, alterao e excluso no
banco de dados de compromisso.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-


1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@page import="br.se.agenda.BeanAgenda,java.util.Vector"%>
<jsp:useBean id="age" scope="session" class="br.se.agenda.BeanAgenda"/>
<jsp:setProperty name="age" property="*"/>
<%String erro = "";
erro = age.IncAltExcAgenda(request.getParameter("opcao"));
out.println("<script>");
if (erro.equals("")) {
out.println(" self.location.href='sucesso.jsp'");
}
Agenda de Compromisso
else {
out.println(" self.location.href='erro.jsp?erro="+erro+"'");
}
out.println("</script>");
%>

1.7 Pgina de sucesso


Vamos fazer uma pgina que nos indica se a operao foi realizada com sucesso. Sempre que houve
xito, redirecionaremos a aplicao para esta pgina.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-


1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<table border="0" cellpadding="5" cellspacing="0" width="50%" align="center">
<tr>
<td bgcolor="#CCDDEE" align="center"><font size="5"><b>Sucesso</b></font></td>
</tr>
<tr>
<td bgcolor="#F7F7F7" align="center"><font size="4">Opera&ccedil;&atilde;o realizada
corretamento.</font></td>
</tr>
<tr>
<td align="center"><input type="button" value=" OK " onClick="self.location.href='agenda.jsp'">
</td>
</tr>
</table>
</body>
</html>

1.8 Pgina de erro

Vamos fazer uma pgina que nos indica se a operao foi realizada com sucesso. Sempre que houve
xito, redirecionaremos a aplicao para esta pgina.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-


1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<table border="0" cellpadding="5" cellspacing="0" width="50%" align="center">
<tr>
<td bgcolor="#CCDDEE" align="center"><font size="5"><b>Erro</b></font></td>
</tr>
<tr>
<td bgcolor="#F7F7F7" align="center"><font size="4">Opera&ccedil;&atilde;o no realizada
corretamento.</font></td>
</tr>
<tr>
<td align="center"><font size="3"><%=request.getParameter("erro")%></td>
Agenda de Compromisso
</tr>
<tr>
<td align="center"><input type="button" value=" Voltar "
onClick="self.location.href='compromisso.jsp'"> </td>
</tr>
</table>
</body>
</html>

2.4.6 Disponibilizando a aplicao


Crie um diretrio chamado locadora no diretrio webapps do Tomcat. Dentro do diretrio locadora, crie
um diretrio cadastro e coloque os arquivos ProcessarMidia.jsp, CadastroMidia.html e RetryMidia.jsp.

No diretrio raiz da aplicao (../locadora) coloque o arquivo sucesso.jsp, e no diretrio WEB-


INF/classes/beans coloque os arquivos BeanMidia.java e BeanMidia.class Agora, inicie o Tomcat,
acesse no navegador a URL http://localhost:8080/locadora e teste a aplicao.

3. Servlets
3.1 Servlets

3.1.1 O que so servlets?


Servlets so programas simples feitos em Java os quais rodam em um Servlet Container. Um
Recipiente (Container) Servlet como um servidor Web que trata requisies do usurio e gera
respostas. Recipiente Servlet diferente de Servidor Web porque ele feito somente para Servlets e
no para outros arquivos (como .html etc). O Recipiente Servlet responsvel por manter o ciclo de
vida do Servlet. Pode ser usado sozinho (standalone) ou conjugado com um servidor Web. Exemplo de
Recipiente Servlet o Tomcat, e de servidor Web o Apache.

Servlets so na verdade simples classes Java as quais necessitam implementar a interface


javax.servlet.Servlet. Esta interface contm cinco mtodos que precisam ser implementados. Na
maioria das vezes voc no precisa implementar esta interface. Por qu ? Porque o pacote
javax.servlet j prov duas classes que implementam esta interface i.e. GenericServlet e HttpSer-vlet.
Ento tudo que voc precisa fazer estender uma dessas classes e sobrescrever o mtodo que voc
precisa para seu Servlet. GenericServlet uma classe muito simples que somente implementa a
interface javax.servlet.Servlet e fornece apenas funcionalidades bsicas. Enquanto HttpServlet uma
classe mais til que fornece mtodos para trabalhar com o protocolo HTTP. Assim se seu servlet usa o
protocolo HTTP (o que ocorrer na maioria dos casos) ento ele deveria estender a classe
javax.servlet.http.HttpServlet para construir um servlet e isto o que faremos na nossa aplicao.
Agenda de Compromisso

Servlets uma vez iniciados so mantidos na memria. Ento toda requisio que chega, vai para o
Servlet na memria e este gera uma resposta. Esta caracterstica de manter na memria faz com que
usar Java Servlets seja um mtodo extremamente rpido e eficiente para construir aplicaes Web.

No ser escrito nenhum Servlet neste curso.

3.2 Usando Java JDBC


JDBC (Java DataBase Connectivity) a API Java para comunicao com bancos de dados. JDBC
especifica a interface necessria para conectar a um banco de dados, executar comandos SQL e queries,
e interpretar resultados. Esta interface independente do banco de dados e da plataforma. As classes
JDBC esto no pacote java.sql, que precisa ser importado para a classe Java que faz uso de alguma
classe desta API.

3.2.1 Acesso ao banco de dados


A API JDBC no pode comunicar-se diretamente com o banco de dados. O acesso fornecido por um
driver JDBC, que uma classe especfica para o banco de dados e implementa a interface definida
pela API. Este driver fornecido pelo vendedor do banco de dados ou por outro provedor de servio.

3.2.2 Especificando o driver JDBC


No seu programa, voc tem que especificar o driver JDBC que vai usar. Faz-se isso com uma simples,
talvez estranha, operao: Class.forName(JDBC-driver-class-name)

O mtodo Class.forName() faz com que a JVM carregue o driver na memria. Voc pode pensar que
tem que instanciar a classe do driver e usar a referncia a ele para acessar o banco de dados, mas
JDBC no funciona desta maneira. Quando o driver carregado na memria da JVM, ele se registra
com a classe java.sql.DriverManager. Ento voc usa mtodos estticos da classe DriverManager para
obter referncia ao objeto Connection, que ento fornecer acesso ao banco de dados.

3.2.3 Estabelecendo a conexo


JDBC segue o paradigma de usar uma URL para conectar a um recurso. O exato formato da URL
depende do driver usado. Mas normalmente a URL segue um formato parecido com este:

jdbc:driver-id://host/database
ou
jdbc:driver-id:database-id

Exemplo de como conectar a um banco de dados MySQL (usado no curso):

Connection connection;
try {
Class.forName("org.gjt.mm.mysql.Driver");
connection = DriverManager.getConnection("jdbc:mysql://servidor/database", user , password );
}
catch (ClassNotFoundException ex) {
System.out.println("N~ ao foi poss vel encontrara classe do Driver do MySQL");
}
catch (SQLException ex) {
System.out.println("N~ ao foi poss vel conectarao servidor");
}
finally {
try { if (connection != null) connection.close(); }
catch (SQLException e) { }
}
Agenda de Compromisso

3.2.4 Encontrando dados em uma tabela

Antes de poder fazer consultas ao banco de dados com JDBC, voc precisa criar um objeto Statement.
Um objeto Statement pode ser reutilizado atravs de mltiplas requisies SQL. criado pelo objeto
Connection e portanto dependente do driver que voc est usando para conectar ao banco de
dados. muito simples, como voc pode ver:

Statement statement = connection.createStatement();

3.2.5 Fazendo consultas com JDBC

Fazer uma consulta com JDBC fcil uma vez que voc tenha o objeto Statement: voc simplesmente
passa a consulta como parmetro do mtodo executeQuery(). A tabela de resultados retornada pelo
mtodo como uma instncia da classe ResultSet da API de JDBC. Abaixo est um exemplo de
consulta:

String query = SELECT * FROM TABELA;


ResultSet resultset = statement.executeQuery(query);

Estes mtodos lanam excees, portanto no seu programa deve estar dentro de um bloco try/catch. O
objeto ResultSet revela o contedo da tabela uma linha por vez e fornece mtodos para acessar dados
de cada coluna da tabela da linha corrente, indicada por um cursor interno. Quando o ResultSet
criado, o cursor de linha no est na primeira linha, mas sim antes dela. Chamando o mtodo next(), o
ResultSet avana o cursor em uma linha, retornando valor verdade se a chamada foi bem sucedida.
Por exemplo, para passar por todas as linhas do ResultSet faramos o seguinte:

while (resultset.next()) {
System.out.println ("Mais uma linha!");
}

Quando o cursor est posicionado em uma linha que voc gostaria de examinar, voc pode chamar
vrios mtodos suportados pelo objeto ResultSet para restaurar dados das colunas e obter
informaes sobre os resultados.

3.3 Interface RequestDispatcher


Esta interface est a presente no pacote javax.servlet e contm dois mtodos:

forward(ServletRequest request, ServletResponse response) transfere uma requisio para outro recurso
no mesmo servidor. Este recurso pode ser um servlet, uma pgina JSP ou uma simples pgina HTML.
include(ServletRequest request, ServletResponse response) atua no lado do servidor, inclui a resposta do
recurso dado (Servlet, pgina JSP ou HTML) dentro da resposta de quem chamou o recurso. Para obter
uma referncia a interface RequestDispatcher temos duas for-mas:
ServletContext.getRequestDispatcher(String resource)
ServletRequest.getRequestDispatcher(String resource) Se o servlet subclasse de HttpServletRequest,
simplesmente chama-se o mtodo getRequestDispatcher(String resource) para pegar uma referncia ao
objeto RequestDispatcher.

RequestDispatcher rd;
rd = request.getRequestDispatcher("caminho do recurso");
rd.forward(request, response);
Se nao for subclasse, utilize a outra maneira.
rd = getServletContext().getRequestDispatcher("caminho do recurso");
rd.forward(request, response);
Agenda de Compromisso

3.4 Construindo a aplicao


3.4.1 Escrevendo uma classe que conecta a um bancode dados
Na aplicao que estamos construindo neste curso, teremos que inserir e restaurar dados do bancos
de dados diversas vezes. Para simplificar nossa vida, criaremos uma classe que conecta ao banco de
dados, e tem mtodos para acess-lo. Assim para fazer a conexo bastar a instanciar um objeto
desta classe.
J no construtor da classe faremos a conexo usando os mtodos descritos na parte de JDBC desta
apostila. Para os outros mtodos, leia os comentrios do arquivo para maiores detalhes.

package conexao;
import java.sql.*;

public class Conexao {

private Connection connection;


private Statement statement;

public Conexao (String servidor,String database,String user,String password) throws SQLException {


try {
Class.forName("org.gjt.mm.mysql.Driver");
connection=riverManager.getConnection("jdbc:mysql://"+servidor+"/"+database,user,password);
}
catch (ClassNotFoundException ex) {System.out.println("No foi possvel encontrar a classe do
"+"Driver do MySQL");}
catch (SQLException ex) {
System.out.println("No foi possvel conectar ao servidor");
throw ex;
}
try {statement = connection.createStatement();}
catch (SQLException ex) {
System.out.println("No foi possvel criar a statement");
throw ex;
}
}

public Conexao() {
try {
Class.forName("org.gjt.mm.mysql.Driver");
connection = DriverManager.getConnection("jdbc:mysql://"+"/locadora", "", "");
}
catch (ClassNotFoundException ex) {System.out.println("No foi possvel encontrar a classe "+"do
Driver do MySQL");}
catch (SQLException ex) {System.out.println("No foi possvel conectar ao servidor");}
try {statement = connection.createStatement();}
catch (SQLException ex) {System.out.println("No foi possvel criar a statement");}
}
/**
* Executa um update na base de dados
* @param update String SQL a ser executado
* @throws SQLException se no for possvel executar

* o update (Erro de SQL).


*/
public synchronized void executeUpdate(String update) throws SQLException {
try {statement.executeUpdate(update);}
catch (SQLException ex) {
System.out.println("No foi possvel executar o update");
throw ex;
Agenda de Compromisso
}
}
/**
* Executa uma consulta na base de dados
* @param query String SQL a ser executado
* @return Um objeto do tipo ResultSet contendo o
* resultado da query
* @throws SQLException se no for possvel executar a query
* (Erro de SQL).
*/
public synchronized ResultSet executeQuery(String query) throws SQLException {
try {return statement.executeQuery(query);}
catch (SQLException ex) {
System.out.println("No foi possvel executar a query");
throw ex;
}
}
/**
* Fecha a conexao com a base de dados.
*/
public void fecharConexao() {
try {statement.close();}
catch (SQLException ex) {ex.printStackTrace();}
}
/**
* Retorna o maior nmero de um campo da tabela se ele
* for um inteiro. Assim, no teremos nenhum ID igual a outro.
*/
public int retornaIDMax(String tabela) {
try {
String sql="SELECT max(ID) as contador FROM "+tabela;
ResultSet rs = this.executeQuery(sql);
rs.next();
return rs.getInt("contador")+1;
}
catch (SQLException e) {
System.out.println("Erro na seleo do ID Mximo");
e.printStackTrace();
return 0;
}
}
}

3.4.2 Cadastrando os dados no banco de dados


Aps verificar se o formulrio foi digitado corretamente (no arquivo Pro-cessarMidia.jsp), vamos
redirecionar a aplicao para um arquivo que vai cadastrar a mdia no banco de dados e redirecionar a
aplicao para a pgina de sucesso. Modifique o arquivo ProcessarMidia.jsp dando um forward para o
arquivo CadMidia.jsp em vez de sucesso.jsp.

<%@ page import="beans.BeanMidia, java.sql.*, conexao.*" %>


<%! String pagina = null; %>
<%
BeanMidia midia = (BeanMidia) request.getAttribute("midia");
Conexao con = null;
try {
con = new Conexao();
con.executeUpdate("insert into Midias values ("+con.retornaIDMax("Midias")+",
"+midia.getTitulo()+" , "+midia.getAno()+" , "+midia.getDescricao()+" ,
Agenda de Compromisso
"+midia.getTipo()+")");
pagina = "/sucesso.jsp";
}
catch (SQLException ex) {
if (ex.getErrorCode() == 1062) {midia.setErros("titulo", "T tulo j a existe.");
pagina = "/cadastro/RetryMidia.jsp";
}
System.out.println(ex);
}
finally {
if (con != null) {
con.fecharConexao();
con = null;
}
if (pagina == null) pagina = "/erro.jsp";
%>
<jsp:forward page=<%= pagina %> />

3.4.3 Pgina de erro


No arquivo CadMidia.jsp, h referncia a pgina /erro.jsp. Vamos cri-la agora. Veja o cdigo:

O atributo isErrorPage da diretiva page usado para marcar uma pgina JSP que serve como a
pgina de erro para uma ou mais pginas. Como resultado disso, a pgina pode acessar o objeto
implcito exception. J que a maioria das pginas JSP no serve como pginas de erro, o valor padro
para este atributo false.

<%@ page isErrorPage="true" %>


<html>
<head>
<title>Erro!</title>
</head>
<body>
<table align="center" border="0" cellspacing="2" cellpadding="2" width="70%">
<tr>
<td bgcolor="#CCDDEE" align=center><h3>Erro</h3></td>
</tr>
<tr>
<td bgcolor="#F7F7F7" align=center>Algum erro inesperado aconteceu.<br></td>
</tr>
<tr>
<td bgcolor="#F0F0F0" align=left>
<li>Pode haver algum erro de conex&atilde;o, tente novamente mais tarde</li>
<li>Contate o administrador para depura&ccedil;&atilde;o do erro.</li>
</td>
</tr>
</table>
</body>
</html>

4. Descritor da aplicao
O arquivo descritor da aplicao chamado de web.xml e reside no diretrio WEB-INF. Este arquivo serve
como um depsito de informaes; os dados que ele armazena sobre ele mesmo so, portanto, considerados
metainformaes, no sentido que so informaes a respeito de informaes. O arquivo web.xml o arquivo
de configurao central da aplicao.
Como sua extenso de arquivo sugere, a linguagem de marcao para os dados no arquivo web.xml XML. O
contedo bsico do descritor e:

<?xml version="1.0" encoding="ISO-8859-1"?>


Agenda de Compromisso
<!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>

</web-app>
Agenda de Compromisso

4.1 Construindo a aplicao


4.1.1 Web.xml
Vamos escrever o arquivo web.xml da nossa aplicao. Colocaremos apenas algumas informaes,
so elas:

O tempo de validade da sesso


Uma lista com nomes de arquivos que so abertos por padro quando um diretrio acessado
Ajustar as pginas de erro padro, para que no apaream as causas do erro para o usurio (se voc
no escreveu alguma pgina corretamente, j deve ter visto a pgina de erro que o Tomcat mostra).

H uma ordem necessria das configuraes usadas no arquivo web.xml. Trocando a ordem, a
aplicao pode no funcionar. Abaixo est o cdigo:

<?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>
<session-config>
<session-timeout>10</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>opcoes.jsp</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/erro404.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/erro.jsp</location>
</error-page>
</web-app>

4.1.2 Pgina de erro


Vamos criar a pgina de erro que especificamos no arquivo web.xml. Crie o arquivo erro404.jsp (404 e
o cdigo de pgina no encontrada) no diretrio raiz da aplicao. Veja o cdigo:

<%@ page isErrorPage="true" %>


<html>
<head>
<title>Erro!</title>
</head>
<body>
<table align="center" border="0" cellspacing="2" cellpadding="2" width="70%">
<tr>
<td bgcolor="#CCDDEE" align=center><h3>Erro</h3></td>
</tr>
<tr>
<td bgcolor="#F7F7F7" align=center>Pgina inexistente.<br></td>
</tr>
</table>
</body>
</html>
Agenda de Compromisso

5. Construindo a aplicao

5.1 Construindo a aplicao


Agora sua vez de construir a aplicao. Crie uma parte da aplicao que faz o cadastro de pessoas, nos
esmos moldes do cadastro de mdias. necessrio para o cadastro obter as seguintes informaes sobre
a pessoa:

nome, endereco, telefone, cidade e bairro onde mora e RG. A tabela dobanco de dados tem o nome de
Pessoas e foi criada (como voce deve lembrar) no comeco do curso.

Nas prximas pginas esto os cdigos fonte para realizar tal processo.

Mas antes de olhar lembre-se que s se aprende fazendo.


Agenda de Compromisso
CadastroPessoa.html

<html>
<head>
<style>p, td { font-family:Tahoma,Sans-Serif; font-size:11pt;padding-left:15; }</style>
<title>Cadastro de Pessoa</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<form action="ProcessarPessoa.jsp" method=post name="pessoas">
<center>
<table cellpadding=4 cellspacing=2 border=0>
<th bgcolor="#CCDDEE" colspan=2>
<font size=5>Cadastro de Pessoas</font><br>
<font size=1><sup>*</sup> Campos necess&aacute;rios</font>
</th>
<tr bgcolor="#F7F7F7">
<td valign=top>
<b>Nome<sup>*</sup></b><br>
<input type="text" name="nome" value="" size=30 maxlength=50>
</td>
<td valign=top><b>Telefone</b><br>
<input type="text" name="telefone" value="" maxlength=15>
</td>
</tr>
<tr bgcolor="#F7F7F7">
<td valign=top colspan=2>
<b>Email<sup>*</sup></b><br>
<input type="text" name="email" value="" size=30 maxlength=50>
</td>
</tr>
<tr bgcolor="#F7F7F7">
<td valign=top>
<b>Endereo<br>
<TEXTAREA NAME="endereco" ROWS="6" COLS="30"></textarea>
</td>
<td valign=top>
<b>RG<sup>*</sup></b></b><br>
<input type="text" name="RG" value="" maxlength=20>
</td>
</tr>
<tr bgcolor="#F7F7F7">
<td valign=top>
<b>Cidade<sup>*</sup></b></b><br>
<input type="text" name="cidade" value="" maxlength=30>
</td>
<td valign=top>
<b>Bairro<sup>*</sup></b></b><br>
<input type="text" name="bairro" value="" maxlength=40>
</td>
</tr>
<tr bgcolor="#F7F7F7">
<td align=center colspan=2>
<input type="submit" value="Confirma">
<input type="reset" value="Limpar">
</td>
</tr>
</table>
</center>
</form>
</body>
</html>
Agenda de Compromisso
ProcessarPessoa.jsp

<%@ page import="beans.BeanPessoa" %>


<jsp:useBean id="pessoa" class="beans.BeanPessoa" scope="request">
<jsp:setProperty name="pessoa" property="*" />
</jsp:useBean>
<%
if (pessoa.ehValido()) {%>
<jsp:forward page="CadPessoa.jsp" />
<%} else {%>
<jsp:forward page="RetryPessoa.jsp" />
<%}%>

RetryPessoa.jsp

<%@ page import="beans.BeanPessoa" %>


<jsp:useBean id="pessoa" class="beans.BeanPessoa" scope="request"/>
<html>
<head>
<style>p, td { font-family:Tahoma,Sans-Serif; font-size:11pt;padding-left:15; }</style>
<title>Cadastro de Pessoa</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<form action="ProcessarPessoa.jsp" method=post name="pessoas">
<center>
<table cellpadding=4 cellspacing=2 border=0>
<th bgcolor="#CCDDEE" colspan=2>
<font size=5>Cadastro de Pessoas</font><br>
<font size=1><sup>*</sup> Campos necess&aacute;rios</font>
</th>
<tr bgcolor="#F7F7F7">
<td valign=top>
<b>Nome<sup>*</sup></b><br>
<input type="text" name="nome" value=<%= pessoa.getNome() %> size=30
maxlength=50><br>
<font color=#FF0000><%=pessoa.getErros("nome")%></font>
</td>
<td valign=top>
<b>Telefone</b><br>
<input type="text" name="telefone" value=<%= pessoa.getTelefone() %> maxlength=15><br>
<font color=#FF0000><%=pessoa.getErros("telefone")%></font>
</td>
</tr>
<tr bgcolor="#F7F7F7">
<td valign=top colspan=2>
<b>Email<sup>*</sup></b><br>
<input type="text" name="email" value=<%= pessoa.getEmail() %> size=30
maxlength=50>><br>
<font color=#FF0000><%=pessoa.getErros("email")%></font>
</td>
</tr>
<tr bgcolor="#F7F7F7">
<td valign=top>
<b>Endereo <br>
<TEXTAREA NAME="endereco" ROWS="6" COLS="30">
<%= pessoa.getEndereco() %>
</textarea><br>
<font color=#FF0000><%=pessoa.getErros("endereco")%></font>
</td>
<td valign=top>
<b>RG<sup>*</sup></b></b><br>
Agenda de Compromisso
<input type="text" name="RG" value=<%= pessoa.getRG() %> maxlength=20><br>
<font color=#FF0000><%=pessoa.getErros("RG")%></font>
</td>
Agenda de Compromisso
</tr>
<tr bgcolor="#F7F7F7">
<td valign=top>
<b>Cidade<sup>*</sup></b></b><br>
<input type="text" name="cidade" value=<%= pessoa.getCidade() %> maxlength=30><br>
<font color=#FF0000><%=pessoa.getErros("cidade")%></font>
</td>
<td valign=top>
<b>Bairro<sup>*</sup></b></b><br>
<input type="text" name="bairro" value=<%= pessoa.getBairro() %> maxlength=40><br>
<font color=#FF0000><%=pessoa.getErros("bairro")%></font>
</td>
</tr>
<tr bgcolor="#F7F7F7">
<td align=center colspan=2>
<input type="submit" value="Confirma">
<input type="reset" value="Limpar">
</td>
</tr>
</table>
</center>
</form>
</body>
</html>

BeanPessoa.java

package beans;
import java.util.Hashtable;
/**
* Implementar a classe Serializable e requisito para ser um Enterprise Bean.
* Um objeto de uma classe que implementa esta interface pode ser escrito em disco ou enviado
* Na aplicao do curso no far diferena.
*/
public class BeanPessoa implements java.io.Serializable {
/**
* Nomes dos atributos preferencialmente iguais aos usados no formul ario
*/
private String nome;
private String endereco;
private String cidade;
private String telefone;
private String bairro;
private String RG;
private String email;
/* Este atributo serve para o controle de erros no formul ario */
private Hashtable erros;
public BeanPessoa() {
/* Iniciamos os atributos com o String nulo */
nome = "";
endereco = "";
telefone = "";
cidade = "";
RG = "";
bairro = "";
email = "";
erros = new Hashtable();
}
/**
* M etodos para acessar os atributos.
Agenda de Compromisso
* getNome() para ver ser valor, e setNome() para ajustar seu valor
*/
public String getNome() {return nome;}
public String getEndereco() {return endereco;}
public String getCidade() {return cidade;}
public String getTelefone() {return telefone;}
public String getRG() {return RG;}
public String getBairro() {return bairro;}
public String getEmail() {return email;}

public void setNome(String valor) {nome = valor;}


public void setEndereco(String valor) {endereco = valor;}
public void setCidade(String valor) {cidade = valor;}
public void setTelefone(String valor) {telefone = valor;}
public void setBairro(String valor) {bairro = valor;}
public void setRG(String valor) {RG = valor;}
public void setEmail(String valor) {email = valor;}
/**
* Verifica se todos os dados exigidos foram digitados,
* al em de outras condi c~ oes desejadas.
*/
public boolean ehValido() {
boolean volta = true;
if ((nome == null) || nome.equals("")) {
erros.put("nome", "Por favor, digite um nome.");
volta = false;
}
if ((endereco == null) || endereco.equals("") ) {
erros.put("endereco", "Por favor, digite o endereco.");
volta = false;
}
if ((cidade == null) || cidade.equals("") ) {
erros.put("cidade", "Por favor, selecione o cidade.");
volta = false;
}
if ((bairro == null) || bairro.equals("") ) {
erros.put("bairro", "Por favor, digite o bairro.");
volta = false;
}
if ((email == null) || email.equals("") || (email.indexOf("@") == -1)) {
erros.put("email", "Por favor, digite o email.");
volta = false;
}
if ((RG == null) || RG.equals("") ) {
erros.put("RG", "Por favor, digite o RG.");
volta = false;
}
return volta;
}
/**
*Usado para ver as mensagens de erro armazaenados na tabela de Hash
*/
public String getErros (String s) {
String msg = (String) erros.get(s);
return (msg == null) ? "" : msg;
}
/**
Usado para colocar algum erro na tabela
*/
public void setErros (String chave, String msg) {erros.put(chave,msg);}
}
Agenda de Compromisso
Agenda de Compromisso
CadPessoa.jsp

<%@ page import="beans.BeanPessoa, java.sql.*, conexao.*" %>


<%! String pagina = null; %>
<%
BeanPessoa pessoa = (BeanPessoa) request.getAttribute("pessoa");
Conexao con = null;
try {
con = new Conexao();
con.executeUpdate("insert into Pessoas values ("+
con.retornaIDMax("Pessoas")+", "+pessoa.getNome()+" , "+pessoa.getEmail()+" , "+
pessoa.getEndereco()+" , "+pessoa.getCidade()+" , "+pessoa.getBairro()+" ,
"+pessoa.getTelefone()+" , "+pessoa.getRG()+")");
pagina = "/sucesso.jsp";
}
catch (SQLException ex) {
if (ex.getErrorCode() == 1062) {
pessoa.setErros("email", "E-mail j a existe.");
pagina = "/cadastro/RetryPessoa.jsp";
}
System.out.println(ex);
}
finally {
if (con != null) {
con.fecharConexao();
con = null;
}
if (pagina == null) pagina = "/erro.jsp";
%>
<jsp:forward page=<%= pagina %> />

6. Passando Objetos
6.1 Passando objetos para outras partes da aplica cao
Para recuperar ou passar objetos de uma pgina JSP para outra, ou de uma pgina para um servlet (e
vice-versa), uma das maneiras (e a mais comum) usar os metodos get/setAttribute(String chave, String
objeto) disponveis para os objetos implcitos pageContext, request, session e applica-tion.

6.2 Construindo a aplicacao


Vamos construir uma pgina de login, onde se o usurio autorizado criada uma sesso para ele.
Precisaremos de um formulrio de acesso, uma pgina JSP para process-lo, e uma pgina JSP para
testar se a sesso vlida ou no. Comearemos com a pgina de acesso. Simples HTML. Veja o cdigo:

<html>
<head>
<title>Pgina de Acesso</title>
</head>
<body>
<center>
<form action="VerificarSenha.jsp" method=POST name=login>
<table width=25%>
<tr>
<td colspan=2 align=center bgcolor="#CCDDEE">Pgina de Acesso</td>
</tr>
<tr>
<td bgcolor="#E0E0E0" width=50%>Usurio:</td>
<td bgcolor="#E0E0E0" width=50%><input type=text name=usuario value=""></td>
Agenda de Compromisso
</tr>
<tr>
<td bgcolor="#F3F3F3" width=50%>Senha:</td>
<td bgcolor="#F3F3F3" width=50%><input type=password name=senha></td>
</tr>
<tr>
<td bgcolor="#F0F0F0" align=center width=50%><input type=submit name=enviar
value="Enviar"></td>
<td bgcolor="#F0F0F0" align=center width=50%><input type=reset name=limpar
value="Limpar"></td>
</tr>
</table>
</form>
</center>
</body>
</html>

Agora o arquivo que valida o formulrio. D o nome de VerificarSenha.jsp.

<%@ page import="java.sql.*, conexao.*" %>


<%
String senha = (String) request.getParameter("senha");
String usuario = (String) request.getParameter("usuario");
boolean login = false;
if (usuario != null && usuario.equals("pet"))
if (senha != null && senha.equals("pet")) login = true;
if (login) {session.setAttribute("sessao", "autorizado");}
%>
<jsp:forward page="/autorizado.jsp" />

Pgina de teste (autorizado.jsp. Note a diretiva include no incio do cdigo. Este arquivo (sessao.jsp) que
nos interessa.

<%@ include file ="/sessao.jsp" %>


<html>
<head>
<title>Autorizado!</title>
</head>
<body>
<table align="center" border="0" cellspacing="2" cellpadding="2" width="70%">
<tr>
<td bgcolor="#CCDDEE" align=center><h3>Autorizado</h3></td>
</tr>
<tr>
<td bgcolor="#F7F7F7" align=center>
Autorizado!<br>
Voc e pode fazer o que quiser agora nesta pgina
</td>
</tr>
</table>
</body>
</html>

A pgina que verifica se a sesso vlida (sessao.jsp) muito simples. Se o objeto implcito session tiver
um atributo chamado de sesso e o valor dele for o String autorizado, este pedao de cdigo da pgina
no faz nada, e ento o cdigo que est a abaixo deste scriptlet ser a mostrado. Caso contrrio,
redireciona para a pgina de erro.

<%String sess = (String) session.getAttribute("sessao");


if (!(sess != null && sess.equals("autorizado"))) {%>
<jsp:forward page="/erro403.jsp" />
<%}%>
Agenda de Compromisso

Colocamos os Strings acima no objeto session no cdigo do arquivo Ver-ficarSenha.jsp lembra? :)

7. Compras
Neste ltimo captulo, vamos construir um carrinho virtual, desses que todo site de loja da internet tem.

7.1 Carrinho de compras


Nosso carrinho vai ser um Bean, que vai ter como atributo principal um vetor (java.util.Vector) que
armazenar as mdias que desejarmos. No caso, vamos armazenar apenas o ttulo da mdia, mas com um
pouco mais de cdigo poderamos armazenar um objeto BeanMidia ou qualquer outra coisa que fizesse
sentido na aplicao. Veja o cdigo para BeanCarrinho.java:

package beans;
import java.util.Vector;
import java.util.Enumeration;
public class BeanCarrinho {
Vector v;
String comando = null;
public BeanCarrinho() {v = new Vector();}
private void adicionarItens(String[] array) {
for (int i = 0; i < array.length; i++) v.addElement(array[i]);
}
private void removerItens(String[] array) {
for (int i = 0; i < array.length; i++) v.removeElement(array[i]);
}
public void setComando(String s) { comando = s;}
public String[] getItems() {
String[] s = new String[v.size()];
v.copyInto(s);
return s;
}
public void processar(String[] itens) {
if (itens != null && comando != null) {
if (comando.equals("adicionar")) adicionarItens(itens);
else if (comando.equals("remover")) removerItens(itens);
reset();
}
}
private void reset() {comando = null;}
}

7.2 Pgina JSP


Vamos mostrar na mesma pgina o carrinho e a pesquisa por palavras-chave. Para isso, basta modificar
um pouco o arquivo pesquisa.jsp. Vamos adicionar um formulrio com checkboxes para o usurio escolher
as fitas que deseja botar no carrinho. E no incio da pgina vamos colocar a parte do carrinho incluindo
uma pgina que vamos criar em seguida. Veja o cdigo para a pgina carrinho.jsp:

<%@ taglib uri="/WEB-INF/tld/TagLib.tld" prefix="pesquisa" %>


<html>
<body>
<center>
Incluso esttica do arquivo carrinho1.jsp. Seria o mesmo que copiar seu cdigo e colar aqui.
<%@ include file ="/carrinho1.jsp" %>
<table align=center width="50%">
<form method="post" action="carrinho.jsp">
<th bgcolor="#CCDDEE" colspan=3>
Agenda de Compromisso

Digite a(s) palavra(s) chave(s) para a pesquisa


</th>
<tr bgcolor="#f7f7f7">
<td align=center>Pesquisa</td>
<td align=center>
<input type="text" name="chave" size=30>&nbsp;&nbsp;
<input type=submit value="Pesquisar >>"> &nbsp;&nbsp;
<input type=reset value="Limpar">
</td>
</tr>
</form>
</table>
<%String tem = (String) request.getParameter("chave");
if (tem != null && !tem.equals("")) {
%><br><br>
<form action=carrinho.jsp method=post>
<table align=center width="70%">
<th bgcolor="#CCDDEE" colspan=2 align=center>Mdias encontradas</th>
<th bgcolor="#CCDDEE" >Carrinho</th>
<pesquisa:mostremidias chave=<%= tem %> >
<tr bgcolor="#E3E3E3">
<td align=center>
<b>Mdia:</b>&nbsp;<%= titulo %>
</td>
<td align=center><b>Ano:</b> <%= ano %></td>
<td><input TYPE=checkbox name=reserva value=<%=titulo %> ></td>
</tr>
<tr bgcolor="#F7F7F7">
<td align=center><%= descricao %></td>
<td align=center><%= tipo %></td>
<td>&nbsp;</td>
</tr>
<tr>
<td colspan="3" bgcolor="#FFFFFF">&nbsp;</td>
</tr>
</pesquisa:mostremidias>
<tr bgcolor="#E0E0E0">
<td align=center><input type="submit" value="Confirma"></td>
<td align=center><input type="reset" value="Limpar"></td>
<td>&nbsp;</td>
</tr>
</table>

Este atributo escondido, diz qual a ao desejada (adicionar ou remover).

<input TYPE=hidden name=comando value=adicionar >


</form>
<% } %>
</center>
</body>
</html>

Vamos ver a parte lgica do carrinho agora. Usa-se um bean vlido por toda a sesso. Com o mtodo
processar(..), inclumos ou removemos mdias do BeanCarrinho. Colocando o valor do atributo property da
ao <jsp:setProperty> como *, ele vai, para todos os parmetros presentes na requisio (objeto
request), tentar usar o mtodo setNomeDoParametro() do Bean.
Agenda de Compromisso

<jsp:useBean id="carrinho" scope="session" class="beans.BeanCarrinho" />


<jsp:setProperty name="carrinho" property="*" />
<%
String[] temp = request.getParameterValues("reserva");
if (temp != null) {carrinho.processar(temp);}
String[] items = carrinho.getItems();
if (items.length > 0) {
%>
<form action=carrinho.jsp method=post>
<table>
<th bgcolor="#CCDDEE">Voc tem no carrinho:</th>
<th bgcolor="#CCDDEE" >Remover</th>
<%
for (int i=0; i<items.length; i++) {
%>
<tr>
<td bgcolor="#F0F0F0"><%= items[i] %></td>
<td bgcolor="#E0E0E0"><input type=checkbox name=reserva value=<%= items[i] %>></td>
</tr>
<% }%>
<tr bgcolor="#E0E0E0">
<td align=center><input type="submit" value="Confirma"></td>
<td align=center><input type="reset" value="Limpar"></td>
<td>&nbsp;</td>
</tr>
</table>
<input type=hidden name=comando value=remover>
</form>
<%}%>

Você também pode gostar