Apache DB Project e Standart Jakarta JSP Tag Libraries – Parte II

 

Na parte 1 deste artigo criamos nossa estrutura de banco de dados, agora vamos criar um site para consumir os dados.

 

Criando nosso site com banco de dados

Vamos agora criar um novo site dinâmico, como demonstrado anteriormente. Nomeie-o como livro_visitas. Ele será usado para acessar nosso banco de dados. Seu workspace deverá ficar assim:

 

mfcadbpsp2fig01.jpg 

 

Perceba que, automaticamente, foi criado um projeto JSR-109 Web Services. Não se preocupe com ele por enquanto.

 

Será necessário adicionar algumas bibliotecas a nossa aplicação web, e o local correto é na pasta WebContent ® WEB-INF ® lib. As bibliotecas que vamos usar são chamadas de Standart Jakarta JSP Tag Libraries e podem ser baixadas aqui: http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi. No pacote zip existirão diversos diretórios, mas apenas o que está no lib nos interessa, o resto não precisa ser descompactado. Seu projeto ficará assim:

 

mfcadbpsp2fig02.jpg 

 

Importante: talvez seja necessário clicar sobre a pasta do projeto com o botão de atalho do mouse e selecionar a opção Refresh.

 

Agora iremos conectar nossa aplicação com o banco de dados. Servlets e páginas JSP que acessam banco de dados trabalham de maneira um pouco ineficiente, abrindo e fechando a conexão a cada solicitação, devido as características do HTTP, o que leva algum tempo. Para resolver este problema o ideal é usar JNDI para gerenciar um grupo de conexões que deixam o acesso mais rápido. Nestes casos o servidor de aplicação mantém o grupo de conexões ao banco de dados e disponibiliza os mesmos a aplicação através de um objeto chamado DataSource.

 

Como o grupo de conexões é gerenciado pelo servidor de aplicação, e não pela aplicação propriamente dita, configurar este grupo pode ser deveras trabalhoso.

 

Gerenciando a conexão pelo Tomcat

Para nossa sorte o Tomcat torna isso extremamente fácil, pois permite que o desenvolvedor configure o grupo de conexões através de um arquivo XML.

 

Será necessário então adicionar um novo arquivo ao nosso projeto. Selecione o caminho livro_visitas/WebContent/META-INF e Vá em File ® New ® File, nomeie-o como context.xml e clique em Finish.

 

O Eclipse irá abrir uma página em branco com a informação de que o documento está vazio. Esta página é o assistente de criação de XML do Eclipse e é bem útil em nosso caso. Clique com o botão de atalho e selecione a opção Add Child ® Processing Instruction. Para target defina o valor xml e para Data defina o valor version="1.0" encoding="UTF-8".

 

Adicione agora um elemento, clicando em Add Child ® Element, nomeie-o como context. Adicione também um elemento, clicando em Add Child ® Element, nomeie-o como Resource.

 

Vamos agora adicionar diversos atributos. Para todos eles clique sobre o elemento context e selecione a opção Add Attribute ® New Attribute. Use a planilha abaixo para preencher o nome (name) e o valor (value). Na planilha você encontra uma descrição de cada atributo:

 

Nome (name)

Valor (value)

name

jdbc/banco01

auth

Container

type

javax.sql.DataSource

username

O nome do usuário definido

password

Senha do usuário

driverClassName

org.apache.derby.jdbc.ClientDriver

url

jdbc:derby://localhost:1527/banco01

maxActive

8

 

Seu Eclipse deverá estar parecido com:

 

mfcadbpsp2fig03.jpg 

 

Seu XML, em livro_visitas\WebContent\META-INF deve estar parecido com:

 

<?xml version="1.0" encoding="UTF-8" ?>

<Context>

<Resource name="jdbc/banco01" auth="Container" type="javax.sql.DataSource" username="mfcastellani" password="senha" driverClassName="org.apache.derby.jdbc.ClientDriver" url="jdbc:derby://localhost:1527/banco01" maxActive="8">

</Resource>

</Context>

 

Este código também pode ser visto na guia Source, do editor de XML.

 

Lendo do banco de dados

Adicione agora uma página index.jsp ao seu projeto. Seu código deverá ficar como o abaixo, aonde as partes em negrito são as partes que deverão ser adicionadas:

 

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

pageEncoding="ISO-8859-1"%>

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<sql:setDataSource dataSource="jdbc/banco01" />

<!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>Insert title here</title>

</head>

<body>

 

<h1>Livro de visitas</h1>

<h2>Deixe seu recado após o bip:</h2>

<table border='1'>

<tr><th>Visitante</th><th>Recado</th></tr>

<sql:query var="qryPosts" >

SELECT postname, comments FROM app.posts

</sql:query>

<c:forEach var="row" items="${qryPosts.rows}">

<tr>

<td><c:out value="${row.postname}" /></td>

<td><c:out value="${row.comments}" /></td>

</tr>

</c:forEach>

</table>

 

</body>

</html>

 

Vamos agora entender o código adicionado, linha a linha, com exceção dos códigos HTML adicionados.

 

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

Nestas duas linhas definimos quais os pacotes da Standart Jakarta JSP Tag Libraries que usaremos. É importante ressaltar que as bibliotecas adicionadas anteriormente em Web App Libraries devem estar no lugar certo.

 

Você encontra a referência do JSTL em http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html.

 

<sql:setDataSource dataSource="jdbc/banco01" />

 

Tag que referencia o nosso DataSource JNDI que foi criado e definido através do context.xml, e que será usado pelo mecanismo JSP para receber os dados para nossa página.

 

<sql:query var="qryPosts" >

SELECT postname, comments FROM app.posts

</sql:query>

 

Tag que executa o comando SQL e coloca dentro da variável qryPosts. Para esta tag apenas o atributo var é obrigatório, porém o atributo maxRows é bem interessante, pois com ele é possível limitar o número de retornos do banco de dados. Usado junto ao atributo startRow é possível navegar no banco de dados facilmente.

 

<c:forEach var="row" items="${qryPosts.rows}">

(...)

</c:forEach>

 

Tag que percorre o resultado da query. O item "${qryPosts.rows}" referencia a coleção de linhas retornada na variável qryPosts.

 

(...)

<tr>

<td><c:out value="${row.postname}" /></td>

<td><c:out value="${row.comments}" /></td>

</tr>

(...)

 

A Tag <c:out value="${row.postname}" /> insere o valor da coluna correspondente da linha atual no lugar aonde está.

 

Nossa página em execução:

 

mfcadbpsp2fig04.jpg 

 

Gravando dados no banco de dados

Vamos inserir um formulário em nossa página, com o código abaixo (deve ser adicionado após o </table> em <body>):

 

<form action="index.jsp" method="post">

<table>

<tr>

<td>Seu nome: </td>

<td><input type='text' name='name' value="${name}"></td>

</tr>

<tr>

<td>Seu recado: </td>

<td>

<textarea name='comments' rows="6" cols="40">

${comments}</textarea></td>

</tr>

<tr>

<td></td>

<td><input type='submit' name='action' value='Gravar'>

</tr>

</table>

<h3>${msg}</h3>

</form>

 

No código do formulário temos três variáveis:

 

${name} : será usada para armazenar os dados digitados na caixa de texto correspondente ao nome.

 

${comments} : será usada para armazenar os comentários digitados na caixa de texto correspondente.

 

${msg}: será usada como retorno da aplicação, para mensagem de sucesso ou erro.

 

Caso você salve o projeto e o execute nada irá ocorrer ao clicar no botão Gravar pois não adicionamos nenhum código para tratar o Post. Será necessário adicionar o código abaixo após a tag <sql:setDataSource>.

 

<c:set var="name" value="${param.name}" />

<c:set var="comments" value="${param.comments}" />

<c:if test="${param.action == 'Gravar'}">

<c:choose>

<c:when test="${not empty comments}">

<sql:update>

INSERT INTO app.posts(postname, comments) VALUES(?, ?)

<sql:param value="${name}"/>

<sql:param value="${comments}"/>

</sql:update>

<c:set var="msg" value="Obrigado pelo comentário." />

<c:set var="name" value="" />

<c:set var="comments" value="" />

</c:when>

<c:otherwise>

<c:set var="msg" value="Preencha o campo comentário." />

</c:otherwise>

</c:choose>

</c:if>

 

O código é simples de entender. Primeiro são definidas as duas variáveis:

 

<c:set var="name" value="${param.name}" />

<c:set var="comments" value="${param.comments}" />

 

Depois é verificado se a ação foi o clique no botão Gravar:

 

<c:if test="${param.action == 'Gravar'}">

 

Depois é usada a estrutura c:choose para ver se existem comentários ou se os mesmos extão em branco. Caso existam eles são adicionados a base de dados e nossa variável de retorno tem seu valor mudado para informar que os dados foram salvos.

 

Caso contrário a variável de retorno é modificada, pedindo que o usuário digite os dados antes de tentar os gravar:

 

<c:choose>

<c:when test="${not empty comments}">

<sql:update>

INSERT INTO app.posts(postname, comments) VALUES(?, ?)

<sql:param value="${name}"/>

<sql:param value="${comments}"/>

</sql:update>

<c:set var="msg" value="Obrigado pelo comentário." />

<c:set var="name" value="" />

<c:set var="comments" value="" />

</c:when>

<c:otherwise>

<c:set var="msg" value="Preencha o campo comentário." />

</c:otherwise>

</c:choose>

</c:if>

 

Nossa página ficará assim:

 

mfcadbpsp2fig05.jpg 

 

Após clicar em gravar:

 

mfcadbpsp2fig06.jpg 

 

Como pode ver o uso do Apache Derby e do Standart Jakarta JSP Tag Libraries facilita muito o desenvolvimento de aplicações simples com banco de dados. Mais a frente veremos como empacotar nosso projeto e o distribuir, com bibliotecas, banco de dados, páginas e tudo mais.