Vamos começar de forma diferente esse item. Começaremos criando o código para acessar as tabelas MySQL e em seguida iremos corrigindo os erros conforme forem aparecendo.
Considerarei que o MySQL acabou de ser instalado, logo encontra-se sem banco, tabelas, senha etc.
Criando a senha do root como 123456:
# mysqladmin -u root password 123456
Entrando no MySQL:
# mysql -u root -p
Basta digitar a senha criada.
Confirmando se existe banco de dados criado:
mysql>
show databases;
Se aparecer empty é porque está vazio.
Criando o banco de dados DBTeste:
mysql>
create database dbTeste;
Confirmando se criou:
mysql>
show databases;
+-------------------------+
| Database |
+-------------------------+
| dbTeste |
+-------------------------+
Acessando o banco:
mysql>
use dbTeste;
Criando uma tabela (tbTeste) com apenas um registro (codteste) para podermos testar.
mysql>
create table tbTeste (codteste integer);
Verificando se a tabela foi criada:
mysql>
show tables;
+-------------------+
| Tables_in_dbTeste |
+-------------------+
| tbTeste |
+-------------------+
Inserindo registros na tabela:
mysql>
insert into tbTeste (codteste) value (1);
mysql>
insert into tbTeste (codteste) value (7);
mysql>
insert into tbTeste (codteste) value (17);
mysql>
insert into tbTeste (codteste) value (37);
Listando para saber se os registros realmente foram inseridos de forma correta:
mysql>
select * from tbTeste;
+----------+
| codteste |
+----------+
| 1 |
| 7 |
| 17 |
| 37 |
+----------+
Beleza, nossa base está pronta para ser usada. Vamos sair:
mysql>
exit;
Agora criaremos nosso código em Java para testarmos a conexão com a base de dados.
Crie um arquivo com o nome OlaBase.java, em qualquer diretório, apenas para teste, e inclua o conteúdo a seguir.
import java.sql.*;
public class OlaBase
{
public static void main (String args[])
{
String url = "jdbc:mysql://localhost:3306/dbTeste"; //string de conexão a base dbTeste
String user = "root"; //usuário da base de dados
String pwd = "123456";//senha do usuário criado
try
{
Class.forName("com.mysql.jdbc.Driver");
System.out.println("\nDriver carregado com sucesso!!!\n");
try
{
Connection cn = DriverManager.getConnection(url, user, pwd);
System.out.println("\nConexao estabelecida!!!\n");
String sql = "select * from tbTeste";
Statement stm = cn.createStatement();
try
{
ResultSet rs = stm.executeQuery(sql);
while (rs.next())
{
System.out.println("\n" + rs.getString("codteste") + "\n");
}
}
catch (Exception ex)
{
System.out.println("\nErro no Select!!!\n");
}
}
catch (Exception ex)
{
System.out.println("\nErro na conexao!!!\n");
}
}
catch (ClassNotFoundException ex)
{
System.out.println("Erro na conexao com a base de dados!!!");
ex.printStackTrace();
}
catch (Exception ex)
{
System.out.println("Driver nao pode ser carregado!!!");
}
System.out.println("Olá Base!!!");
}
}
Agora vamos compilar:
# javac OlaBase.java
Tudo deverá ocorrer OK. Então, vamos executar:
# java OlaBase
Deverá aparecer a seguinte saída:
Erro na conexao com a base de dados!!!
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:164)
at OlaBase.main(OlaBase.java:11)
Ola Base!!!
Vimos nesta saída que o driver não foi encontrado (ClassNotFoundException: com.mysql.jdbc.Driver).
Então vamos instalar o driver para MySQL.
Primeiro vamos ver se ele existe em nossa máquina:
# find / -name "mysql-connect*"
Se não retornar nenhum arquivo, vamos à instalação de driver. Vamos ver se existe algum pacote para podermos instalarmos via apt-get:
# apt-cache search jdbc
Aparecerá a seguinte lista de pacotes:
haskell-hsql-doc - Multi-Database Interface System for Haskell
henplus - JDBC SQL commandline frontend with TAB-completion
hsqldb-server - Java SQL database server
libghc6-hdbc-dev - Haskell Database Connectivity, GHC6 package
libghc6-hsql-dev - Multi-Database Interface System for Haskell
libghc6-hsql-mysql-dev - Multi-Database Interface System for Haskell
libghc6-hsql-odbc-dev - Multi-Database Interface System for Haskell
libghc6-hsql-postgresql-dev - Multi-Database Interface System for Haskell
libghc6-hsql-sqlite-dev - Multi-Database Interface System for Haskell
libghc6-hsql-sqlite3-dev - Multi-Database Interface System for Haskell
libhsqldb-java - Java SQL database engine
libhsqldb-java-doc - documentation for HSQLDB
libhugs-hdbc - Haskell Database Connectivity, Hugs package
liblog4j1.2-java - Logging library for java
libmysql-java - Java database (JDBC) driver for MySQL
libodbc++-dev - C++ library for ODBC SQL database access
libodbc++-doc - C++ library for ODBC SQL database access
libodbc++4 - C++ library for ODBC SQL database access
libpg-java - Java database (JDBC) driver for PostgreSQL
libpgjava - Java database (JDBC) driver for PostgreSQL - transitional package
libpostgis-java - geographic objects support for PostgreSQL -- JDBC support
libsapdbc-java - JDBC interface to the MaxDB database system
libstruts1.2-java - Java Framework for MVC web applications
openoffice.org-base - OpenOffice.org office suite - database
postgresql-contrib-7.4 - additional facilities for PostgreSQL
No nosso caso queremos a "libmysql-java - Java database (JDBC) driver for MySQL". Então vamos instalar:
# apt-get install libmysql-java
Após a instalação vamos conferir se o arquivo .jar passou a existir:
# find / -name "mysql-connect*"
Agora aparecerá o arquivo, no meu caso o resultado da busca foi:
/usr/share/java/mysql-connector-java-5.0.4.jar
Então basta colocar esse arquivo no classpath:
# export CLASSPATH=$CLASSPATH:"/usr/share/java/mysql-connector-java-5.0.4.jar"
Agora tente executar o nosso programa.
# java OlaBase
O resultado será:
Driver carregado com sucesso!
Conexao estabelecida!!!
1
7
17
37
Ola Base!!!
Pronto, a conexão com a base de dados foi estabelecida.
Claro que a variável
CLASSPATH não valerá quando reiniciarmos a máquina. Mas para resolver o problema, basta adicionar a linha no final do arquivo
/etc/profile:
echo "export CLASSPATH=\$CLASSPATH:"/usr/share/java/mysql-connector-java.jar"" >> /etc/profile
Agora vamos voltar ao nosso arquivo index.jsp no diretório /var/www/teste e vamos fazer a alteração abaixo, para conectar à base de dados. Basta incluir no final de nosso arquivo o código:
<%
try
{
Class.forName("com.mysql.jdbc.Driver");
out.println ("<br>Driver encontrado!!!");
}
catch (ClassNotFoundException ex)
{
out.println ("<br>Erro driver<br>");
out.println (ex.toString());
}
catch (Exception ex)
{
out.println ("<br>Erro ao procurar o driver<br>" + ex.toString());
}
%>
Salve o arquivo e em seu browser, acesse a URL:
http://localhost:8180/teste
Aparecerá a página:
Olá mundo !!!
1 + 1 = 2
Erro driver
java.lang.ClassNotFoundException:com.mysql.jdbc.Driver
Mas como o driver é encontrado em nossa aplicação e não é encontrado em nossa página? O motivo é que nossa aplicação procura pelo CLASSPATH, já as páginas são limitadas a buscar no diretório padrão ou no diretório de nosso projeto.
Então basta copiar o arquivo com o driver para o diretório <CATALINA_HOME>/common/lib, porém aqui iremos apenas criar um link simbólico para o arquivo:
# cd /usr/share/tomcat5.5/common/lib
# ln -s ../../../java/mysql-connector-java-5.0.4.jar mysql-connector-java.jar
Reinicie o Tomcat:
# /etc/init.d/tomcat5.5 restart
Tente novamente acessar a URL:
http://localhost:8180/teste
Desta vez o resultado será:
Olá mundo !!!
1 + 1 = 2
Driver encontrado!!!
Vamos continuar nosso exemplo de teste, aumentando o código.
Edite novamente o arquivo /var/www/teste/index.jsp.
Agora vamos modificá-lo deixando com o seguinte código:
<%@page import="java.sql.*"%>
Olá mundo !!!<br>
1 + 1 = ${1+1}
<br>
<%
String url = "jdbc:mysql://localhost:3306/dbTeste"; //string de conexão a base dbTeste
String user = "root"; //usuário da base de dados
String pwd = "123456";//senha do usuário criado
try
{
Class.forName("com.mysql.jdbc.Driver");
out.println("<br>Driver carregado com sucesso!!!<br>");
try
{
Connection cn = DriverManager.getConnection(url, user, pwd);
out.println("<br>Conexao estabelecida!!!<br>");
String sql = "select * from tbTeste";
Statement stm = cn.createStatement();
try
{
ResultSet rs = stm.executeQuery(sql);
while (rs.next())
{
out.println( " - " + rs.getString("codteste"));
}
}
catch (Exception ex)
{
out.println("<br>Erro no Select!!!<br>" + ex.printStackTrace());
}
}
catch (Exception ex)
{
out.println("<br>Erro na conexao!!!<br>" + ex.printStackTrace());
}
}
catch (ClassNotFoundException ex)
{
out.println("<br>Erro na conexao com a base de dados!!!<br>" + ex.printStackTrace());
}
catch (Exception ex)
{
out.println("<br>Driver nao pode ser carregado!!!<br>" + ex.printStackTrace());
}
out.println("<br>Olá Base!!!<br>");
}
%>
Ao acessarmos a URL http://localhost:8081/teste nos depararemos com a seguinte mensagem:
Olá mundo !!!
1 + 1 = ${1+1}
Erro na conexão
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** ...
Felizmente, se tudo correu bem até aqui, esse será nosso último erro.
Teremos que liberar a permissão de conexão.
As permissões estão definidas no arquivo
$CATALINA_BASE/conf/catalina.policy, neste caso em /usr/share/tomcat5.5/conf/catalina.policy.
Seria só alterar esse arquivo, mas se verificarmos nosso daemon (/etc/init.d/tomcat5.5) veremos que este arquivo e montado na inicialização do tomcat, pois encontraremos a seguinte linha:
cat /etc/tomcat5.5/policy.d/*.policy \
>> "$CATALINA_BASE/conf/catalina.policy"
Ou seja, não adianta modificar o arquivo /usr/share/tomcat5.5/conf/catalina.policy, pois quando iniciarmos o Tomcat esse arquivo será refeito. Na inicialização o conteúdo do arquivo "$CATALINA_BASE/conf/catalina.policy" é substituído pelo conteúdo de todos os arquivos ".policy" do diretório /etc/tomcat5.5/policy.d/. Então a linha abaixo nós poderemos incluir dentro de um arquivo ".policy" do diretório /etc/tomcat5.5/policy.d/ ou, o que acho mais organizado, criar um arquivo.
Crie um arquivo
/etc/tomcat5.5/policy.d/05teste.policy. Inclua o seguinte conteúdo:
grant codeBase "file:/var/www/teste/-" {
permission java.security.AllPermission;
};
Com esse conteúdo você faria todas as liberações para sua aplicação. O mais seguro é ir liberando as permissões a medida que forem aparecendo as necessidades, então sugiro substituir o conteúdo do arquivo por:
grant codeBase "file:/var/www/teste/-" {
permission java.net.SocketPermission "localhost:3306", "connect,resolve";
};
Assim liberaremos apenas a conexão com o MySQL.
Agora basta reiniciarmos o Tomcat:
# /etc/init.d/tomcat5.5 restart
e testarmos nossa aplicação acessando a URL:
http://localhost:8180/teste
Deverá aparecer o seguinte conteúdo:
Olá mundo !!!
1 + 1 = 2
Driver carregado com sucesso!!!
Conexao estabelecida!!!
- 1
- 7
- 17
- 37