Programação para Internet II



Documentos relacionados
Java na Web. Aplicações Web

Programação Orientada a Objetos JDBC Java Database Connectivity

Faculdades Network Bacharelado em Sistemas de Informação Tópicos Avançados. Aulas 25 e 26 Exemplo de Aplicação usando JSP e MySQL

JDBC Java Database Connectivity

Java na WEB Banco de Dados

Integrando Java com Banco de Dados

Manipulação de Banco de Dados com Java 1. Objetivos

TUTORIAL JSP & SERVLET

Leonardo Gresta Paulino Murta

Fernando Freitas Costa. Pós-Graduando em Gestão e Docência Universitária. blog.fimes.edu.br/fernando nando@fimes.edu.br

Unidade 9: Middleware JDBC para Criação de Beans

Java na WEB Componentes Bean

Manipulação de Banco de Dados com Java. Ms. Bruno Crestani Calegaro Maio/ 2015

Acesso a banco de dados

JDBC. Prof. Márcio Bueno

Autenticação e Autorização

Material de apoio a aulas de Desenvolvimento Web. Tutorial Java WEB JSP & HTML & CSS & CLASSE & OBJETOS. AAS -

Persistência de Classes em Tabelas de Banco de Dados

DSS 08/09. Camada de Dados - JDBC. Aula 1. António Nestor Ribeiro /António Ramires Fernandes/ José Creissac Campos {anr,arf,jfc}@di.uminho.

Módulo 5 - JDBC java.sql - Conexão com Banco de Dados

Acesso a Banco. Conexão em Java. Conexão em Java. Programação Orientada a Objetos Profa. Cristiane e Prof. Daniel

JDBC. Siga as instruções para instalar o banco de dados H2 e criar a tabela Alunos.

JavaServer Faces JSF

Especialização em web com interfaces ricas

Acesso a Bancos de Dados em Java (JDBC)

JDBC. Java DataBase Connectivity

Aplicativos Web com Orientação a Objetos

INTRODUÇÃO. No entanto, o que pode ser considerado um produto (resultado) da criação de BDs?

Java e Conexão com Banco de Dados

Java JDBC - I. Ex. 2: para o SQLServer da Microsoft, o driver JDBC pode ser obtido em

JAVA JDBC COMO FUNCIONA. Programação Orientada a Objetos Flávio de Oliveira Silva 315. Programação Orientada a Objetos Flávio de Oliveira Silva 316

DSS 09/10. DSS 09/10 Que métodos é que fazem parte de cada camada? Aplicações Multi-camada JDBC. Aula 3 DSS 09/10

8. Outros tipos de Transação (Modo de Transação de Autoconfirmação e Modo Implícito)

JPA: Persistência padronizada em Java

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS ARMAZENAMENTO EM BD NO DM. Prof. Angelo Augusto Frozza, M.Sc.

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS ARMAZENAMENTO EM BD NO DM. Prof. Angelo Augusto Frozza, M.Sc.

SISTEMA GERENCIAMENTO DE PRODUTOS PHP E MySQL 1. APRESENTAÇÃO

C# - Conexão com MySQL

JAVA JDBC Java Database Connectivity

Programação Orientada a Objetos II

Primeiro exemplo de uso de páginas JSP

Banco de Dados. Sérgio Luiz Ruivace Cerqueira

PadrãoIX. Módulo II JAVA. Marcio de Carvalho Victorino. JDBC - Java Database Connectivity A,L,F,M

Arquitetura de Aplicações JSP/Web. Padrão Arquitetural MVC

JDBC (Java Database Connectivity) Padrão de Projeto DAO (Data Access Object) Roteiro para instalação do banco de dados e do driver JDBC

!" # # # $ %!" " & ' ( 2

Programação WEB (JSP + Banco Dados) Eng. Computação Prof. Rodrigo Rocha

TUTORIAL DE INTRODUÇÃO AO CEWOLF

Estudo Dirigido - Parte 1

Drive MySql de conexão para Eclipse

Trabalhando com conexão ao banco de dados MySQL no Lazarus. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

Programação para Android. Aula 08: Persistência de dados SQL

JAVA COM BANCO DE DADOS PROFESSORA DANIELA PIRES

Programação para Internet II

Programação com Acesso a Banco de Dados

1. Crie um banco de dados (no MySQL) chamado produtos e um tabela produto. Realise as inserções na tabela produto de acordo com os scripts abaixo.

Desenvolvimento Web TCC Turma A-1

TRANSAÇÕES. Considerando que estes comandos fazem parte de uma TRANSAÇÃO (veremos como indicar isso):

Driver Mysql para Banco de Dados. Conexão com um Banco de Dados

J2EE. Exemplo completo Utilização Servlet. Instrutor HEngholmJr

22/05/2012 CRIANDO UM PROJETO COM TELAS ESTRUTURA DA APLICAÇÃO LOGIN BANCO DE DADOS TAREFAS PHP MYSQL PARTE 2

Laboratório de Banco de Dados Aula 1 Acesso a Banco de Dados. Prof. Josenildo Silva jcsilva@ifma.edu.br

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL.

Scriptlets e Formulários

Padrões de Projeto e Persistência com DAO

Aula 1 Acesso a Banco de Dados

Desenvolvendo Aplicações Web com NetBeans

Construindo um sistema simples de cadastro de fornecedores em PHP e MySQL.

Passos Preliminares: Acessando a máquina virtual via ssh.

De forma simples, para a execução de comandos SQL com JDBC, precisa-se da instancia de três classes Java. São elas: Nome da classe Função

SISTEMA EXPERIMENTALL 15/11/2009. Olá! A partir de agora vamos conhecer a IDE NetBeans efetuando um micro projeto swing.

Java Básico JDBC. Razer Anthom Nizer Rojas Montaño Banco de Dados: JDBC

Basicamente iremos precisar de uma base de dados na qual iremos armazenar os registros feitos pelos vistantes: Vamos armazenar os seguintes dados:

MANUAL INSTALAÇÃO WEB SERVICE

JDBC (Fundamentos) Sang Shin Java Technology Architect Sun Microsystems, Inc.

English Português. By erickalves 25 Julho, :08. Devido à política (#) de segurança. Encontrar Blogs Crie o seu blog de graça Ganhe prêmios

J550. Model View Controller

Tutorial Jogo da Velha WEB

AULA 2 INTERAÇÃO COM O BANCO DE DADOS

PHP INTEGRAÇÃO COM MYSQL PARTE 1

JDBC Acessando Banco de Dados

Persistência de Objetos no SGBD PostgreSQL, Utilizando as APIs: JDBC, JDK, Swing e Design Patteners DAO.

MANUAL DE UTILIZAÇÃO Aplicativo Controle de Estoque Desktop

JSP e Servlet Princípio de MVC

Gravando uma Áudio Conferência

Bool setcookie (string nome [, string valor [, int validade [, string caminho [, string dominio [, int seguro]]]]] )

Prof. Carlos Majer Aplicações Corporativas UNICID

Faculdades Integradas Santa Cruz. Tutorial de Java MVC WEB Criando uma tela de Login com Banco de Dados

Persistência Java para Web com MySQL

Curso de Java. Acesso a banco de dados através de JDBC. Todos os direitos reservados Klais

Programação WEB II. PHP e Banco de Dados. progweb2@thiagomiranda.net. Thiago Miranda dos Santos Souza

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza

Acessando bancos de dados com o JDBC

BI Citsmart Fornece orientações necessárias para instalação, configuração e utilização do BI Citsmart.

Como criar um banco de dados usando o mysql

Java Beans e Servlets

Controle de transações em SQL

Transcrição:

Programação para Internet II Aulas 07 e 08 Fernando F. Costa professor.fimes.edu.br/fernando nando@fimes.edu.br

Como tratar de grandes conjuntos de resultados Quando temos uma grande quantidade de registros a ser exibida para um usuário, provavelmente não vamos querer que todos eles sejam carregados e exibidos de uma única vez. Uma alternativa seria filtrar a consulta para reduzir os dados a serem exibidos. Contudo paginar os resultados em pequenas quantidades também pode ser uma boa solução.

A interface RowSet Uma boa alternativa para trabalhar com a paginação de resultados é fazer uso da interface RowSet que foi introduzida na especificação JDBC 2.0 para definir um meio padrão para acessar dados armazenados em cache através de um componente JavaBeans ou através de sistemas distribuídos.

O Bean CachedRowSet Portanto, para tratar consultas que são maiores que uma tela inteira e não tão grande para serem verdadeiras devoradoras de memória, o Bean CachedRowSet se mostra como boa opção. Ele faz parte da interface RowSet contida na implementação JDBC 2.0 fornecida pela Sun.

O Bean CachedRowSet Diferente de ResultSet, CachedRowSet é uma conexão offline que armazena em cache todas as linhas de sua consulta no objeto. Nenhuma conexão ativa é necessária porque todos os dados foram pegos do banco de dados. Para fazer uso deste Bean, basta configurar suas propriedades de acesso ao Banco, sua consulta SQL e pronto. A partir deste ponto é só navegar pelos resultados obtidos.

Vejamos como trabalhar com a paginação de resultados em JSP utilizando o Bean CachedRowSet. Para isto, crie um novo projeto web chamado Conferencia. No MySQL crie uma base de dados chamada conf para ilustrar nosso exemplo.

No MySQL, digite os seguintes comandos para criar o banco e as tabelas. create database conf; create table conference( id integer not null auto_increment, cidade varchar(80), aeroporto char(3), assentos integer, primary key (id) ); create table shuttles( id integer not null auto_increment, aeroporto char(3), hora time, assentos integer, primary key (id) );

Digite os seguintes comandos para preencher as tabelas criadas: INSERT INTO conference (cidade, aeroporto, assentos) VALUES ('Austin', 'AUS', 45); INSERT INTO conference (cidade, aeroporto, assentos) VALUES ('Las Angeles', 'LAX', 37); INSERT INTO conference (cidade, aeroporto, assentos) VALUES ('New York', 'JFK', 0); INSERT INTO conference (cidade, aeroporto, assentos) VALUES ('Houston', 'IAH', 11); INSERT INTO conference (cidade, aeroporto, assentos) VALUES ('Boston', 'BOS', 0); INSERT INTO conference (cidade, aeroporto, assentos) VALUES ('San Francisco', 'SFO', 12); INSERT INTO shuttles (aeroporto, hora, assentos) VALUES ('AUS', '9:40', 10); INSERT INTO shuttles (aeroporto, hora, assentos) VALUES ('AUS', '12:00', 12); INSERT INTO shuttles (aeroporto, hora, assentos) VALUES ('AUS', '14:15', 0); INSERT INTO shuttles (aeroporto, hora, assentos) VALUES ('LAX', '12:15', 10); INSERT INTO shuttles (aeroporto, hora, assentos) VALUES ('LAX', '16:35', 10); INSERT INTO shuttles (aeroporto, hora, assentos) VALUES ('IAH', '9:30', 0); INSERT INTO shuttles (aeroporto, hora, assentos) VALUES ('JFK', '12:15', 10); INSERT INTO shuttles (aeroporto, hora, assentos) VALUES ('BOS', '16:35', 10); INSERT INTO shuttles (aeroporto, hora, assentos) VALUES ('SFO', '9:30', 10);

Concluído a parte de criação e preenchimento do banco, é hora de criarmos nosso arquivo JSP que fará a paginação dos resultados obtidos. No exemplo a seguir, os resultados serão paginados de 5 em 5 registros. Você pode definir a quantidade que desejar, basta definir no loop quantos registros serão exibidos por vez.

<%@page import="java.sql.*" %> CachedResults.jsp (parte 1/3) <%@page import="javax.sql.*" %> <%@page import="com.sun.rowset.*" %> <jsp:usebean id="crs" class="com.sun.rowset.cachedrowsetimpl" scope="session"> <% try { Class.forName("com.mysql.jdbc.Driver"); catch (ClassNotFoundException e) { System.err.println("Error" + e); %> <jsp:setproperty name="crs" property="url" value="jdbc:mysql://localhost:3306/conf" /> <jsp:setproperty name="crs" property="username" value="root" /> <jsp:setproperty name="crs" property="password" value="adminadmin" /> <jsp:setproperty name="crs" property="command" value="select * from shuttles order by id" /> <% try { crs.execute(); catch (SQLException e) { out.println("sql Error: " + e); %> </jsp:usebean>

<html> <body> CachedResults.jsp (parte 2/3) <center> <h2>resultados da Consulta em Cache</h2> <P> <table border="2"> <tr bgcolor="tan"> <th>id</th><th>aeroporto</th><th>hora de Partida </th><th>assentos</th></tr> <% try { if ("first".equals(request.getparameter("action"))) crs.beforefirst(); for (int i=0; (i < 5) && crs.next(); i++) { %> <tr> <td><%= crs.getstring("id") %></td> <td><%= crs.getstring("aeroporto") %></td> <td><%= crs.getstring("hora") %></td> <td><%= crs.getstring("assentos") %></td> </tr> <% %> </table>

CachedResults.jsp (parte 3/3) <br> <% if (crs.isafterlast()) { crs.beforefirst(); %> Fim dos registros<br><br> <% catch (SQLException e) { out.println("sql Error" + e); %> <a href="<%= HttpUtils.getRequestURL(request) %>?action=first"> [Início]</a> <a href="<%= HttpUtils.getRequestURL(request) %>?action=next"> [Próximo]</a> </center> </body> </html>

Resultado Esperado

Valor: 2,0 pontos Data apresentação: 11/04/2011 Trabalho em Grupo (3 pessoas) Descrição: Utilizando os conceitos já apresentados, e enfatizando o conceito de Beans e Rowset, crie uma aplicação web para fazer o controle de produtos de uma empresa. A aplicação web deve conter uma parte administrativa na qual deverá ser possível: Cadastrar, Alterar e Remover um produto Na parte de usuário, deve existir apenas uma lista dos produtos cadastrados com as respectivas informações: Nome (String) Preço (Double) Quantidade (Integer) Quando o usuário clicar em comprar um produto, ele deve informar a quantidade. Após confirmar a quantidade, a aplicação deve remover esta quantidade do estoque. Observações: A área administrativa só pode ser acessada mediante login. Não deve ser permitido a compra de uma quantidade superior a quantidade em estoque. Se um produto estiver esgotado (quantidade = 0) deve aparecer a mensagem esgotado no local do preço e não deve ser mostrado o botão Comprar.

Como manter conexões persistentes A conexão com o BD normalmente é a parte mais lenta de uma aplicação web. Contudo, manter várias conexões em aberto pode ser inviável, uma vez que o banco de dados pode suportar uma quantidade limitada de conexões. Desta forma, uma boa alternativa para solucionar este impasse é fazer uso dos Pools de Conexões que são implementados pelo driver do banco de dados, ou por classes de Pool de Conexões.

Pool de Conexões Os pools de conexões mantêm um número fixo de conexões ativas e as empresta quando solicitado pelas suas páginas JSP ou Beans. Logo se tornam uma boa alternativa entre ter muitas conexões abertas e pagar o preço por conexões e desconexões frequentes.

Pool de Conexões A seguir veremos o código que cria um Bean responsável por encapsular uma conexão de banco de dados. Isto permite isolar nossas páginas JSP dos detalhes de conexão com o BD, assim como permite manter nossa conexão através de diversas páginas ao armazená-la na sessão. Desta maneira não precisamos sempre nos reconectar no banco de dados.

ConnectionBean public class ConnectionBean implements HttpSessionBindingListener { private Connection connection; private Statement statement; private static final String driver="com.mysql.jdbc.driver"; private static final String dburl="jdbc:mysql://localhost:3306/conf"; private static final String login="root"; private static final String password="adminadmin"; public ConnectionBean() { try { Class.forName(driver); connection=drivermanager.getconnection(dburl,login,password); statement=connection.createstatement(); catch (ClassNotFoundException e) { System.err.println("ConnectionBean: driver unavailable"); connection = null; catch (SQLException e) { System.err.println("ConnectionBean: driver not loaded"); connection = null;

ConnectionBean public void valuebound(httpsessionbindingevent event) { System.err.println("ConnectionBean: in the valuebound method"); try { if (connection == null connection.isclosed()) { connection = DriverManager.getConnection(dbURL,login,password); statement = connection.createstatement(); catch (SQLException e) { connection = null; public void valueunbound(httpsessionbindingevent event) { try { connection.close(); catch (SQLException e) { finally { connection = null; protected void finalize() { try { connection.close(); catch (SQLException e) {

Processamento de Transações As operações efetuadas em um BD nem sempre são atômicas, ou seja, na maioria das vezes ela envolve duas ou mais operações que precisam acontecer com sucesso para garantir a integridade do banco de dados. Ex: transação bancária.

Processamento de Transações Os Bancos de Dados fornecem um mecanismo conhecido como transações para tratar deste assunto. Em JSP devemos efetuar um commit() no objeto Connection para concluir uma operação que ocorreu sem erros, ou efetuar um rollback() do objeto Connection para retornar o banco ao estado em que ele se encontrava no inicio da transação.

Processamento de Transações Como padrão o JDBC assume que cada instrução SQL é uma transação, e portanto, efetua um autocommit a cada instrução que é emitida. Para que esse controle seja feito manualmente, devemos desativar o recurso autocommit. A seguir temos um exemplo desta situação em uma operação de transação bancária entre as contas de Bob e Sue.

Desativando o recurso autocommit Observação: Lembrem-se de reativar o recurso autocommit ao concluírem suas transações. connection.setautocommit(false); try { Statement st = connection.createstatement(); st.executeupdate( "UPDATE ACCTS SET BALANCE=(BALANCE-100) WHERE OWNER = "Bob"); st.executeupdate( "UPDATE ACCTS SET BALANCE=(BALANCE + 100) WHERE OWNER = "Sue"); connection.commit(); catch (SQLException e) { connection.rollback(); finally { connection.setautocommit(true);

A seguir criaremos um exemplo para trabalhar com os assuntos tratados na aula de hoje. O objetivo do exemplo que será criado é permitir que sejam feitas reservas de vagas em conferências de computação que ocorrerão em todo o mundo. Contudo, o sistema deve garantir que além de reservar uma vaga na conferência, também seja possível reservar uma vaga na ponte aérea com destino a conferência selecionada.

Neste exemplo utilizaremos o projeto Conferencia criado anteriormente, juntamente com a base de dados conf que foi criada.

import java.sql.*; import javax.servlet.http.*; ConnectionBean.java (parte 1 de 3) public class ConnectionBean implements HttpSessionBindingListener { private Connection connection; private Statement statement; private static final String driver="com.mysql.jdbc.driver"; private static final String dburl="jdbc:mysql://localhost:3307/conf"; private static final String login="root"; private static final String password="adminadmin"; public ConnectionBean() { try { Class.forName(driver); connection=drivermanager.getconnection(dburl,login,password); statement=connection.createstatement(); catch (ClassNotFoundException e) { System.err.println("ConnectionBean: driver unavailable"); connection = null; catch (SQLException e) { System.err.println("ConnectionBean: driver not loaded"); connection = null;

ConnectionBean.java (parte 2 de 3) public Connection getconnection() { return connection; public void commit() throws SQLException { connection.commit(); public void rollback() throws SQLException { connection.rollback(); public void setautocommit(boolean autocommit) throws SQLException { connection.setautocommit(autocommit ); public void valuebound(httpsessionbindingevent event) { System.err.println("ConnectionBean: in the valuebound method"); try { if (connection == null connection.isclosed()) { connection = DriverManager.getConnection(dbURL,login,password); statement = connection.createstatement(); catch (SQLException e) { connection = null;

ConnectionBean.java (parte 3 de 3) public ResultSet executequery(string sql) throws SQLException { return statement.executequery(sql); public int executeupdate(string sql) throws SQLException { return statement.executeupdate(sql); public void valueunbound(httpsessionbindingevent event) { try { connection.close(); catch (SQLException e) { finally { connection = null; protected void finalize() { try { connection.close(); catch (SQLException e) {

index.jsp <%@page contenttype="text/html" pageencoding="utf-8"%> <!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=utf-8"> <title>jsp Page</title> </head> <body> <center> <h1>conferência Mundial de Computação</h1> <a href="cachedresults.jsp" target="_self">vagas Disponíveis</a><br><br> <a href="conference.jsp" target="_self">fazer minha inscrição</a> </center> </body> </html>

conference.jsp (parte 1 de 2) <%@page import="java.sql.*" errorpage="error.jsp" %> <jsp:usebean id="connection" class="com.taglib.wdjsp.databases.connectionbean" scope="session"/> <html> <body> <center> <font size="+2" face="arial"><b>conferência - Registros</b></font> <form action="shuttle.jsp" method="post"> <table border=1 bgcolor="tan" width="50%" align="center"> <tr> <td> <table border="0" bgcolor="white" cellspacing=0 width="100%"> <tr bgcolor="tan"> <th> </th><th>cidade</th><th>vagas Restantes</th></tr> <tr><% String sql = "select * from conference"; ResultSet results = connection.executequery(sql); while (results.next()) { if (results.getint("assentos") > 0) { %> <td> <input type="radio" name="show" value="<%= results.getstring("id") %>"> </td> <%

conference.jsp (parte 2 de 2) else { %> <td> </td> <% %> <td><%= results.getstring("cidade") %></td> <td align="center"><%= results.getstring("assentos") %></td> </tr> <% %> </table> </td> </tr> </table> <p> <input type="submit" value="proximo (Escolher Ponte Aerea)"> </form> </center> </body> </html>

shuttle.jsp (parte 1 de 2) <%@ page import="java.sql.*" errorpage="error.jsp" %> <jsp:usebean id="connection" class="com.taglib.wdjsp.databases.connectionbean" scope="session"/> <% String showid = request.getparameter("show"); connection.setautocommit(false); String sql; sql = "UPDATE conference set assentos=assentos-1 where id=" + showid; connection.executeupdate(sql); %> <html> <body> <center> <font size="+2" face="arial"><b>reservar Ponte Aérea</b></font> <form action="confirm.jsp" method="post"> <table border=1 bgcolor="tan" width="50%" align="center"> <tr><td> <table border="0" bgcolor="white" cellspacing=0 width="100%"> <tr bgcolor="tan"><th> </th> <th>aeroporto</th><th>hora</th><th>lugares Vagos</th></tr>

<tr> shuttle.jsp (parte 2 de 2) <% sql = "SELECT s.* from shuttles s, conference c where c.id=" + showid + " and s.aeroporto = c.aeroporto"; ResultSet results = connection.executequery(sql); while (results.next()) { if (results.getint("assentos") > 0) { %> <td> <input type="radio" name="shuttle" value="<%= results.getstring("id") %>"> </td> <% else { %> <td> </td> <% %> <td><%= results.getstring("aeroporto") %></td> <td><%= results.gettime("hora") %></td> <td align="center"><%= results.getstring("assentos") %></td> </tr> <% %> </table> </td></tr></table> <input type="hidden" name="show" value="<%= showid %>"> <input type="submit" value="proximo (Revisar Reservas)"> </form> </center></body></html>

confirm.jsp (parte 1 de 2) <%@ page import="java.sql.*" errorpage="error.jsp" %> <jsp:usebean id="connection" class="com.taglib.wdjsp.databases.connectionbean" scope="session"/> <% String sql; String shuttleid = request.getparameter("shuttle"); String showid = request.getparameter("show"); sql = "UPDATE shuttles set assentos=assentos-1 where id=" + shuttleid; connection.executeupdate(sql); sql = "SELECT c.cidade, c.aeroporto, s.hora from conference c, " + "shuttles s where c.id=" + showid + " and s.id=" + shuttleid; ResultSet results = connection.executequery(sql); results.next(); %> <html><body><center> <font size="+2" face="arial"><b>confirmação de Reservas</b></font> <form action="finish.jsp" method=post> <table border=1 bgcolor="tan" width="50%" align="center"> <tr><td>

confirm.jsp (parte 2 de 2) <table border="0" bgcolor="white" cellspacing=0 width="100%"> <tr bgcolor="tan"><th>resumo</th></tr> <tr><td> Reserva requisitada para a conferência na cidade de <b><%= results.getstring("cidade") %></b>, com ponte aérea partindo do aeroporto de <b><%= results.getstring("aeroporto") %></b> às <b><%= results.gettime("hora") %></b>. <p> Para confirmar suas reservas, selecione Confirmar Reservas. </td></tr> </table> </td></tr></table> <p> <input type="submit" name="commit" value="confirmar Reservas"> <input type="submit" name="rollback" value="cancelar Reservas"> </body> </html>

finish.jsp <%@ page import="java.sql.*,com.taglib.wdjsp.databases.*" errorpage="error.jsp" %> <html><body> <% ConnectionBean connection = (ConnectionBean)session.getAttribute("connection"); if (request.getparameter("commit")!= null) connection.commit(); else connection.rollback(); session.removeattribute("connection"); %> <center> <% if (request.getparameter("commit")!= null) { %> <font size="+2" face="arial"><b>confirmação de Reservas</b></font> <p> Sua reserva foi confirmada, obrigado... <% else { %> <font size="+2" face="arial"><b>cancelamento de Reservas</b></font> <p> Suas reservas foram canceladas. <% %> <a href="conference.jsp">outra Reserva</a> </body></html>

error.jsp <%@ page import="java.sql.*,com.taglib.wdjsp.databases.*" iserrorpage="true" %> <html> <body> <% if (exception instanceof SQLException) { try { ConnectionBean connection = (ConnectionBean)session.getAttribute("connection"); connection.getconnection().rollback(); session.removeattribute("connection"); catch (SQLException e) { %> <center> <font size="+2" face="arial"><b>erro na Aplicaçã</b></font> <p> Um erro ocorreu: <tt><%= exception %></tt> <p> <a href="conference.jsp">outra Reserva</a> </center></body></html>

Boa Noite!