Montando um ambiente utilizando Tomcat + Java + MySQL (Debian)

Como a maioria de meus artigos, venho compartilhar a experiência adquirida na tentativa de executar determinada tarefa quando não encontro um artigo que mostre os passos de forma simples para a execução. Neste mostrarei como montar um ambiente que hospede um site em Java no Debian.

[ Hits: 53.463 ]

Por: Geraldo José Ferreira Chagas Júnior em 30/06/2009 | Blog: http://prginfo.blogspot.com


Criando nossa aplicação para teste



Nossa primeira aplicação de teste será um arquivo JSP.

Caso não exista, cria o diretório /var/www/teste. Importante é verificar a permissão para que o Tomcat tenha acesso. Eu sugiro a permissão 755.

Dentro de /var/www crie o arquivo teste.xml com o seguinte conteúdo:

<Context path="/teste" docBase="/var/www/teste"
   debug="0" privileged="true" allowLinking="true">
</Context>

Esse arquivo informa que quando for acrescentado /teste no final da URL ele deverá redirecionar para o diretório /var/www/teste.

Existe um arquivo com <Context path="/" docBase=... informando para qual diretório o Tomcat deverá apontar quando não for digitado nada depois da URL.

Ainda dentro diretório /var/www/teste, crie o arquivo index.jsp e coloque o conteúdo:

Olá mundo !!!<br>
1 + 1 = ${1+1}

Salve. Essa será a nossa página.

Agora entre no diretório /usr/share/tomcat5.5/conf/Catalina/localhost/ e crie um link simbólico com o nome de teste.xml para /var/www/teste/teste.xml:

# cd /usr/share/tomcat5.5/conf/Catalina/localhost/
# ln -s /var/www/teste.xml teste.xml


O Tomcat irá ler todos os xml's que estão dentro desta pasta para configurar os acessos as páginas. Nós poderíamos ter criado o arquivo teste.xml direto neste local, mas por questão de organização preferi criá-lo em outro local e fazer um link.

Reinicie o Tomcat e faça o teste acessando a URL:

http://localhost:8180/teste

Deverá aparecer o seguinte conteúdo:

Olá mundo !!!
1 + 1 = 2

Nosso segundo exemplo será a criação de servlet.

Para isso criaremos dentro de nosso diretório /var/www/teste o diretório WEB-INF e dentro do diretório WEB-INF criaremos o diretório classes.

# cd /var/www/teste
# mkdir WEB-INF
# mkdir WEB-INF/classes


Dentro do diretório classes criaremos nosso código Java. Chamarei de Teste2.java e conterá o seguinte conteúdo.

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Teste2 extends HttpServlet
{
   public void doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException
   {
       response.setContentType("text/html");
       PrintWriter out = response.getWriter();
       out.println("<html>");
       out.println("<body>");
       out.println("<head>");
       out.println("<title>Ola mundo !</title>");
       out.println("</head>");
       out.println("<body>");
       out.println("<h1>Ola Mundo!</h1>");
       out.println("</body>");
       out.println("</html>");
   }
}

Grave o arquivo.

Para gerar o arquivo class precisaríamos do servlet.jar, porém no Java 5 o arquivo correto é servlet-api.jar. Procure por esse arquivo em seu micro utilizando o comando find.

# find / -name servlet-api.jar

Em nosso caso o arquivo foi encontrado no diretório /usr/share/java/servlet-api.jar, então poderemos compilar nossa servlet com o seguinte comando:

# javac -classpath /usr/share/java/servlet-api.jar Teste.java

Agora nossa classe está pronta.

Vamos fazer com que possamos acessá-la pela URL.

Crie o arquivo WEB-INF/web.xml com o seguinte conteúdo:

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

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

    <display-name>Teste !</display-name>
    <description>
      Teste Ola Mundo !!
    </description>

    <servlet>
        <servlet-name>teste</servlet-name>
        <servlet-class>Teste</servlet-class> //Nome da classe a ser acessada
    </servlet>

    <servlet-mapping>
        <servlet-name>teste</servlet-name>
        <url-pattern>/teste-ola</url-pattern> // caminho a ser digitado
    </servlet-mapping>
</web-app>

Reinicie o Tomcat:

# /etc/ini.d/tomcat5.5 restart

Agora o endereço http://localhost:8180/teste acessará nosso arquivo jsp e o endereço http://localhost:8180/teste/teste-ola acessará nosso servlet.

Página anterior     Próxima página

Páginas do artigo
   1. Ferramentas necessárias
   2. Instalação das ferramentas
   3. Configurando o Tomcat
   4. Criando nossa aplicação para teste
   5. Conectando ao MySQL
Outros artigos deste autor

Vírus de computador e criação de um vírus em C/C++ (parte 1 - básico)

X Window, Controladores de Janelas e Ambientes Desktop

Inicialização e interrupção do sistema (Debian)

Linvox - Sistema Linux voltado para deficientes visuais

Configurando Servidor de Nomes - DNS (Debian)

Leitura recomendada

Instalação do Java da Oracle em distros Debian-like

Programação orientada a objetos e o Java (Parte 6)

Jubler - Editor de legendas de filmes para Linux

Programação orientada a objetos e o Java (parte 2)

Introdução ao Java - Hello World

  
Comentários
[1] Comentário enviado por michel5670 em 30/06/2009 - 21:33h

Colega muito bom seu artigo veio em boa hora pois eu estava com dificuldades de instalar e configurar o debian,seu artigo está muito bem explicado e com um assunto de interesse de uma grande maioria prova disso e o artigo acabar de ser postado e ja ter mais de 150 acessos Parabéns!!!

[2] Comentário enviado por maran em 01/07/2009 - 08:51h

Caracas Geraldo,
eu ainda não tinha visto um artigo do genero, sobre Tomcat integrado ao MySQL, muito bom!
Bem explicado, e de grande valia a muito, isso ae, show de bola,
Abraços

[3] Comentário enviado por gjr_rj em 01/07/2009 - 09:27h

Olá pessoal, venho informar que o artigo se encontra pela metade, está faltando informações. Vou avisar a equipe de moderadores do VOL.

[4] Comentário enviado por gjr_rj em 01/07/2009 - 09:42h

Pedi para incluirem o restante do arquivo, mas enquanto isso não acontece, estou colocando aqui. Seria incluido no link 5 "Conectando ao Mysql", no final.

-----------------------------------------------

Salve o arquivo e em seu browser, acesse a url hocalhost:8180/teste

Aparecerá a página:

Olá mundo !!!
1 + 1 = 2

Erro drive
java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

Mas como o drive é 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 tem é limitada a buscar no diretório padrão ou no diretório de nosso projeto.

Então, basta copiar o arquivo com o drive 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 localhost:8180/teste
Desta vez o resultado será:

Olá mundo !!!
1 + 1 = 2

Drive 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>Drive 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>Drive nao pode ser carregado!!!<br>" + ex.printStackTrace());
}
out.println("<br>Olá Base!!!<br>");
}

%>

Ao acessarmos a URL 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 ** java.security.AccessControlException MESSAGE: access denied (java.net.SocketPermission localhost resolve) STACKTRACE: java.security.AccessControlException: access denied (java.net.SocketPermission localhost resolve) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) at java.security.AccessController.checkPermission(AccessController.java:427) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.SecurityManager.checkConnect(SecurityManager.java:1031) at java.net.InetAddress.getAllByName0(InetAddress.java:1134) at java.net.InetAddress.getAllByName(InetAddress.java:1072) at java.net.InetAddress.getAllByName(InetAddress.java:1008) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:138) at com.mysql.jdbc.MysqlIO.(MysqlIO.java:277) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2668) at com.mysql.jdbc.Connection.(Connection.java:1531) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266) at java.sql.DriverManager.getConnection(DriverManager.java:525) at java.sql.DriverManager.getConnection(DriverManager.java:171) at org.apache.jsp.index_jsp._jspService(index_jsp.java:65) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAsPrivileged(Subject.java:517) at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275) at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:245) at org.apache.catalina.core.ApplicationFilterChain.access$0(ApplicationFilterChain.java:177) at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:156) at java.security.AccessController.doPrivileged(Native Method) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:152) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) ** END NESTED EXCEPTION ** Last packet sent to the server was 52 ms ago.

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" é substituindo 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 localhost:8180/teste

deverá aparecer o seguinte conteúdo:

Olá mundo !!!
1 + 1 = 2

Drive carregado com sucesso!!!

Conexao estabelecida!!!

- 1

- 7

- 17

- 37


[5] Comentário enviado por fabio em 01/07/2009 - 13:00h

Desculpem o transtorno, artigo completo no ar!

Obrigado pelo aviso Geraldo.

[6] Comentário enviado por Milton Quirino em 23/07/2009 - 10:34h

Muito bom !!!

Já add nos favoritos.

[7] Comentário enviado por rbertelle em 30/09/2009 - 17:53h

Caro gjr_rj segui criteriosamente seu tutorial, achei um pequeno erro na hora de compilar o arquivo teste2.java, mas consegui contorna-lo.
Já no final revisei e tentei de tudo, mas só obtive a resposta abaixo no browser.
Alguma segestão?
Abraço


HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: Unable to compile class for JSP:

An error occurred at line: 30 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
27: }
28: catch (Exception ex)
29: {
30: out.println("<br>Erro no Select!!!<br>" + ex.printStackTrace());
31: }
32: }
33: catch (Exception ex)


An error occurred at line: 35 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
32: }
33: catch (Exception ex)
34: {
35: out.println("<br>Erro na conexao!!!<br>" + ex.printStackTrace());
36: }
37: }
38: catch (ClassNotFoundException ex)


An error occurred at line: 40 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
37: }
38: catch (ClassNotFoundException ex)
39: {
40: out.println("<br>Erro na conexao com a base de dados!!!<br>" + ex.printStackTrace());
41: }
42: catch (Exception ex)
43: {


An error occurred at line: 44 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
41: }
42: catch (Exception ex)
43: {
44: out.println("<br>Driver nao pode ser carregado!!!<br>" + ex.printStackTrace());
45: }
46: out.println("<br>Olá Base!!!<br>");
47: }


An error occurred at line: 47 in the jsp file: /index.jsp
Syntax error, insert "Finally" to complete TryStatement
44: out.println("<br>Driver nao pode ser carregado!!!<br>" + ex.printStackTrace());
45: }
46: out.println("<br>Olá Base!!!<br>");
47: }
48:
49: %>



An error occurred at line: 95 in the generated java file
Syntax error on token "catch", Identifier expected


An error occurred at line: 97 in the generated java file
out cannot be resolved


An error occurred at line: 97 in the generated java file
_jspx_out cannot be resolved


An error occurred at line: 98 in the generated java file
out cannot be resolved


An error occurred at line: 98 in the generated java file
out cannot be resolved


An error occurred at line: 99 in the generated java file
out cannot be resolved


An error occurred at line: 100 in the generated java file
_jspx_page_context cannot be resolved


An error occurred at line: 100 in the generated java file
_jspx_page_context cannot be resolved


An error occurred at line: 102 in the generated java file
Syntax error on token "finally", { expected


An error occurred at line: 103 in the generated java file
_jspxFactory cannot be resolved


An error occurred at line: 103 in the generated java file
_jspxFactory cannot be resolved


An error occurred at line: 103 in the generated java file
_jspx_page_context cannot be resolved

Stacktrace:
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:93)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:435)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:298)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:277)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:265)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:302)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
java.security.AccessController.doPrivileged(Native Method)
javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5 logs.
Apache Tomcat/5.5

[8] Comentário enviado por admwagner em 24/05/2010 - 13:33h

.'.
Grato pelo artigo

Wagner Ferreira
.'.

[9] Comentário enviado por felimpe em 15/09/2010 - 09:52h

foi um excelente artigo porem o final decepcionou.
deu o mesmo erro que o kra q falou acima..

org.apache.jasper.JasperException: Unable to compile class for JSP:

An error occurred at line: 30 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
27: }
28: catch (Exception ex)
29: {
30: out.println("<br>Erro no Select!!!<br>" + ex.printStackTrace());
31: }
32: }
33: catch (Exception ex)


An error occurred at line: 35 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
32: }
33: catch (Exception ex)
34: {
35: out.println("<br>Erro na conexao!!!<br>" + ex.printStackTrace());
36: }
37: }
38: catch (ClassNotFoundException ex)


An error occurred at line: 40 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
37: }
38: catch (ClassNotFoundException ex)
39: {
40: out.println("<br>Erro na conexao com a base de dados!!!<br>" + ex.printStackTrace());
41: }
42: catch (Exception ex)
43: {


An error occurred at line: 44 in the jsp file: /index.jsp
The operator + is undefined for the argument type(s) String, void
41: }
42: catch (Exception ex)
43: {
44: out.println("<br>Drive nao pode ser carregado!!!<br>" + ex.printStackTrace());
45: }
46: out.println("<br>Olá Base!!!<br>");
47: }


An error occurred at line: 47 in the jsp file: /index.jsp
Syntax error, insert "Finally" to complete TryStatement
44: out.println("<br>Drive nao pode ser carregado!!!<br>" + ex.printStackTrace());
45: }
46: out.println("<br>Olá Base!!!<br>");
47: }
48:
49: %>


An error occurred at line: 104 in the generated java file
Syntax error on token "catch", Identifier expected

An error occurred at line: 106 in the generated java file
out cannot be resolved

An error occurred at line: 106 in the generated java file
_jspx_out cannot be resolved

An error occurred at line: 107 in the generated java file
out cannot be resolved

An error occurred at line: 107 in the generated java file
out cannot be resolved

An error occurred at line: 108 in the generated java file
out cannot be resolved

An error occurred at line: 109 in the generated java file
_jspx_page_context cannot be resolved

An error occurred at line: 109 in the generated java file
_jspx_page_context cannot be resolved

An error occurred at line: 111 in the generated java file
Syntax error on token "finally", { expected

An error occurred at line: 112 in the generated java file
_jspx_page_context cannot be resolved

Stacktrace:
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:439)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:334)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:312)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:299)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:589)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts