Struts 2 - Apostila Caelum

Boa tarde .

Então galera , estou precisando de uma força.

Estou fazendo o exercício 11.8 da apostila da Caelum , no qual seria para adicionar uma tarefa , no BD por meio do Struts2.

Porém eu estou tomando uma excpetion nada agradável .

java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/CFR

Primeiramente , no mesmo projeto , eu tenho uma classe na qual “testa” minha conexão e está certinho .

Eu tenho classes na qual testam alguns comandos do SQL , inserir , excluir etc. , também está rodando PERFEITAMENTE.

Então , eu não sei oque pode ser .

Eu já add o JAR do mySQL no projeto , já add no BuildPath e ele está na LIB.

Ele da erro nessa classe, quando eu tento usar o TarefaDAO


package br.com.cfr.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import br.com.cfr.jdbc.dao.TarefaDAO;
import br.com.cfr.jdbc.modelo.Tarefa;

public class AdicionaTarefasAction {

	//private Contato contato;
	private Tarefa tarefa;
	
	@Action(value = "adicionaTarefa" , results = {
			@Result(name = "ok" , location ="tarefa-adicionada.jsp")
	})
	
	public String execute() {
		//new ContatoDAO().adiciona(contato);
		new TarefaDAO().adiciona(tarefa);
		return "ok";
	}

	public Tarefa getTarefa() {
		return tarefa;
	}

	public void setTarefa(Tarefa tarefa) {
		this.tarefa = tarefa;
	}
	
}

Eis meu TarefaDAO

package br.com.cfr.jdbc.dao;

  
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import br.com.cfr.jdbc.ConnectionFactory;
import br.com.cfr.jdbc.modelo.Tarefa;
  
public class TarefaDAO {  
      
    Connection connection;  
      
    public TarefaDAO(){  
        this.connection = new ConnectionFactory().getConnection();  
    }  
      
    public void adiciona (Tarefa tarefa){  
          
        String sql = "insert into tab_tar descricao value(?)";  
          
        try {  
            PreparedStatement stmt = connection.prepareStatement(sql);  
            stmt.setString(1, tarefa.getDescricao());  
              
            stmt.execute();  
            stmt.close();                 
        } catch (SQLException e){  
            throw new RuntimeException (e);  
        }  
          
          
          
    }  
  
}  

E também meu ConnectionFactory

package br.com.cfr.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {
	
	public Connection getConnection(){
		
		System.out.println("Conectando ao banco");
		
		try {
			return DriverManager.getConnection("jdbc:mysql://localhost/CFR" , "root" , ""); 
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

}

E a JSP

<html>
	<body>
		<h3>Adicionar tarefas</h3>
		<form action ="adicionaTarefa" method="post">
		Descrição: <br/>
		
		<textarea name="tarefa.descricao" rows="5" cols="100" ></textarea> <br />
		
		<input type= "submit" value ="Adicionar">
		
		</form>	
	
	</body>
</html>

E quanto a perguntas sobre o banco de dados : Meu banco não tem senha e não tem usuario . Por isso eu uso ROOT. E como já falei eu estava conseguindo acessar , modificar , o banco normalmente , só agora que eu fui mexer com Struts2 que deu errado.

Será que está faltando algum JAR ??
Ah , eu uso o TomCat 7.0.

Eis um print para provar que o jar esta ná lib e está devidamente adicionado no BuidPath , e também , todos os JAR´S necessários para rodar o Struts2 também estão ai .

E estão funcionando pois eu fiz o primeiro exemplo da apostila e funcionou certinho.

Desde já agradeço .

UP UP UP

Cara. Pela mensagem de erro parece que voc~e se esqueceu de adicionar o driver do mysql ao projeto. O mysql_connector…

O JAR do driver está na pasta WEB-INF/lib junto com os outros JARs?
Se funciona o seu programa de testes fora da Web, eu chutaria que seu JAR está na pasta errada. Pra funcionar na Web, precisa estar no WEB-INF/lib.

Abraços

pois é, eu também não tinha conseguido fazer funcionar com meu mysql, não sei se a apostila é pra uma versão mais antiga, ou o que eu fiz de errado.

Só sei q eu comentei a linha abaixo do hibernate.properties

  # hibernate.dialect = org.hibernate.dialect.MySQLInnoDBDialect

e coloquei essa aqui no lugar

hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

começou a funcionar que é uma maravilha.

Fora esse pequeno detalhe, gostaria de dizer que esta apostila é muito boa, na verdade a melhor pra alguem que quer começar java na minha opinião.

Abraços

Então , está na pasta LIB sim .

Po , eu já tentei de tudo e não consegui …

Só pude pensar em algumas coisas… :

1° Eu esqueci de colocar algum JAR do Struts 2.

2° Eu uso o WAMP com o MySQL , talvez seja isso .

3° Sobre oque o nosso amigo citou acima , eu não uso Hibernate . :confused:

Eu já procurei no nosso amigo google e mudei a string de conexão para 127.0.0.1 (acho que é isso) , e continua o mesmo erro.

Quem souber alguma coisa , alguma luz , agradeço e muito .

Ta dando pau no carregamento do driver. Tenta mais uma coisa: forçar o carregamento explicito (isso era necessario antigamente mas nao deveria precisar a partir do java 6).

La na ConnectionFactory, acrescenta uma linha antes do return com o carregamento do driver:

Class.forName("com.mysql.jdbc.Driver");

Testa de novo e manda os resultados!

Abraços

Vlw gente , pelo menos o errou mudou :smiley:

Agora é esse.

java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘descricao value(‘dd’)’ at line 1

Parece que tem algo errado na minha string do SQL mais não consiguo saber oq …

Gente muito obrigado !!!

Consegui resolver o erro .

Eu resolvi porém não entendi …

Eu mudei minha string de inserir no banco para:

“insert into tab_tar (descricao , finalizado) value(?,?)”;

E adicionei tbm :

stmt.setBoolean(2, tarefa.isFinalizado());

OK , até ai beleza , estou adicionado este campo , e funcionou legal !!.

Porém , porque funcionou ??

Sendo que no meu banco , a coluna finalizado está como NULL , então ela deve aceitar parâmetros nulos sem reclamar , porque ela não aceitou ??

E porque o outro campo da coluna não reclamou ??

Tem algo a ver com a variável ser booleana ??

Abraço e obrigado mais uma vez !!!

Então , gente , vou aproveitar o tópico , pois surgiu mais uma dúvida , quanto ao exercício 11.12

Eu compilo a JSP e quando vou carregar a página gera a exception :

org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/content/lista-tarefas.jsp at line 22

19:


20: $[tarefa.id]
21: $[tarefa.descricao]
22: <c:if test = “${tarefa.finalizado eq false}”>
23: Não finalizado
24: </c:if>
25: <c:if test = “${tarefa.finalizado eq true}”>

javax.el.PropertyNotFoundException: Property ‘finalizado’ not found on type java.lang.String

Pelo oque eu entendi , é que realmente o finalizado não é uma String , ele é um boolean !

Aonde que eu indico isso ???

Segue minha JSP :

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

<html>
	<body>
		<a href = "formulario-tarefas.jsp" >Criar nova tarefa</a>
		
		<br /> <br />
		
		<table>
			<tr>
				<th>Id</th>
				<th>Descricao</th>
				<th>Finalizado</th>
				<th>Data de finalizacao</th>
			</tr>
			
			<c:forEach items = "$[tarefas]"	var ="tarefa">
				<tr>
					<td>$[tarefa.id]</td>
					<td>$[tarefa.descricao]</td>
					<c:if test = "${tarefa.finalizado eq false}">
						<td>Não finalizado</td>
					</c:if>	
					<c:if test = "${tarefa.finalizado eq true}">
						<td>Finalizado</td>
					</c:if>		
					<td>
						<fmt:formatDate value="${tarefa.dataFinalizacao.time}" pattern ="dd/MM/yyyy"/>
					</td>
				</tr>			
			</c:forEach>	
		</table>	
	</body>
</html>

E minha Action :

package br.com.cfr.action;

import java.util.List;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;

import br.com.cfr.jdbc.dao.TarefaDAO;
import br.com.cfr.jdbc.modelo.Tarefa;

public class ListaTarefasAction {
	
	private List<Tarefa> tarefas;
	
	@Action(value = "listaTarefas" , results = {
		@Result (name = "ok" , location ="lista-tarefas.jsp")
	})
	
	public String execute() {
		tarefas = new TarefaDAO().lista();
		return "ok";
	}
	
	public List<Tarefa>getTarefas() {
		return tarefas;
	}
	

}

O dataFinalizacao dá o mesmo erro , pois ele tbm não é uma String e sim um DATE. aonde eu faço o cast ??

Ah , e quando eu comentos os dois até “funciona” , porém gera a página com o LINK :

Criar nova tarefa

Porém ele gera o 404 , não achando a página de jeito algum …

Bom , obrigado gente e até + .

Gente eu tentei e tentei e nada e ainda ele não lista nada !! Ele traz o código mesmo .

Id Descricao Finalizado Data de finalizacao
$[tarefa.id] $[tarefa.descricao]

Estranho… alguém pode me dar uma luz???

João, a EL é com chaves, não colchetes.

${tarefa.id}

Opa , muito obrigado !

Realmente era isso o erro…

E quanto a URL errada que gerava o 404 , eu apenas tirei a extensão .jsp do link :

Porém , ele não está trazendo do banco :confused: .

Creio que deve ser algo errado , no método lista , do TarefaDAO .

Segue ele :

public List<Tarefa> lista() {
		try {
			List<Tarefa> tarefas  = new ArrayList<Tarefa>();
			PreparedStatement stmt = this.connection.prepareStatement("select * from tab_tar");
			ResultSet rs = stmt.executeQuery();
			
			while (rs.next()){
				
				Tarefa tarefa = new Tarefa();
				tarefa.setId(rs.getLong("id"));
				tarefa.setDescricao(rs.getString("descricao"));
				tarefa.setFinalizado(rs.getBoolean("finalizado"));
				
				Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("Tarefa"));
				tarefa.setDataFinalizacao(data);
				
				tarefas.add(tarefa);
			}
			rs.close();
			stmt.close();
			return tarefas;	
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}	
	}

Eu apenas estou trazendo os dois pois o dataFinalizacao e o finalizado eu não estou passando para o BD.

O finalizado está vindo 0 no bd… .

Eu já conferi no MySQl , para ver se estava salvado , e está sim .

Quem puder me ajudar valeu .

UP UP UP

Alguém por favooorr…

UP UP UP

João dá uma olhada se você realmente criou o campo com nome finalizado no seu bd, porque no meu caso eu também fiz pela caelum e coloquei finalizada, no caso para tarefa finalizada, pode ser por conta disto que está dando o erro, no mais não estou vendo nada de errado…

E não esqueça de liberar teus recursos (rs, stmt) dentro do bloco finally, não dentro do try.
Abraço!

Gente , obrigado pelas respostas , porém eu não consegui descobrir o erro …

Mais alguém??

João vai lá no banco e dá um desc tarefa e manda o print pra ver como está a estrutura no teu banco…

Eu não sei por o print aqui .

Vou tentar copiar a estrutura e colar .

id bigint(20) Não auto_increment
dataFinalizacao date NULL
finalizado tinyint(1) NULL
descricao varchar(255) lNULL

O estranho é que ele add numa boa , porém não tras nada …