Problemas com inserção no Banco de dados com Struts2

Pessoal,

estou enfrentando um probleminha…estou fazendo os execícios da apostila da caelum fj21, na parte de Struts2, já montei as lógicas, mas o problema está no TarefaDAO, quando eu peço para adicionar, listar, e alterar, tentando pegar o parâmetro dataFinalizacao ele me retorna um erro java.lang.RuntimeException: java.lang.NullPointerException … na realidade o problema provavelmente está quando o próprio sistemas tenta popular automaticamente os dados no objeto, mas não estou conseguindo solucionar este problema!!!

Será que alguém pode me dar uma dica?

Obrigado.

até onde sei, a apostila da caleum não foca a varsão 2 do Struts, só se foi atualizada e não estou sabendo.

outra coisa, há algum erro de lógica e sem o código fica difícil te ajudar. Posta o código para ser analisado.Vc tb debugando consegue descobrir da onde está vindo o nullpointer

Sim a apostila da Caelum foi atualiza!!! Narealidade eu sei o porque está vindo null, pois na 1 tela a tela de inserção, eu apenas passo como parametro a descrição, e os outros atributos como finalizado e dataFinalização são salvos null no banco de dados, e quando vou fazer a listagem ele tenta acessar mas retorna Null…

Abaixo segue os códigos

[code] TarefaDAO

package br.com.caelum.tarefas.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import br.com.caelum.tarefas.conexao.ConnectionFactory;
import br.com.caelum.tarefas.modelo.Tarefa;

public class TarefaDAO {

private Connection connection;

public TarefaDAO()
{
	this.connection = new ConnectionFactory().getConnection();
}

public TarefaDAO(Connection connection)
{
	this.connection = connection;
}

public void adiciona(Tarefa tarefa)
{		
	String sql = "INSERT INTO tarefas (descricao) VALUES (?)";
	
	try {
		PreparedStatement stmt = connection.prepareStatement(sql);
		
		stmt.setString(1, tarefa.getDescricao());
		
		stmt.execute();
		stmt.close();
		
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
}

public List<Tarefa> getLista()
{
	try {
		List<Tarefa> tarefas = new ArrayList<Tarefa>();
		
		String sql = "SELECT * FROM tarefas";
		PreparedStatement stmt = connection.prepareStatement(sql);
		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("dataFinalizacao"));
			
			tarefa.setDataFinalizacao(data);
			
			tarefas.add(tarefa);
		}
		
		rs.close();
		stmt.close();
		
		return tarefas;
		
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
}

public void remove(Tarefa tarefa)
{
	String sql = "DELETE FROM tarefas WHERE id like ?";
	try {
		PreparedStatement stmt = connection.prepareStatement(sql);
		
		stmt.setLong(1, tarefa.getId());
		
		stmt.execute();
		stmt.close();
		
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
}

public Tarefa buscaTarefaPorId(Long id)
{
	Tarefa tarefa = new Tarefa();
	String sql = "SELECT * FROM tarefas WHERE id like ?";
	
	try {
		PreparedStatement stmt = connection.prepareStatement(sql);
		stmt.setLong(1, id);
		
		ResultSet rs = stmt.executeQuery();
		
		while(rs.next())
		{
			tarefa.setId(rs.getLong("id"));
			tarefa.setDescricao(rs.getString("descricao"));
			tarefa.setFinalizado(rs.getBoolean("finalizado"));
			
			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("dataFinalizacao"));
			
			tarefa.setDataFinalizacao(data);
		}	
		
		rs.close();
		stmt.close();
			
		return tarefa;
			
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
}

public void altera(Tarefa tarefa)
{
	String sql = "UPDATE tarefas SET descricao=?, finalizado=?, dataFinalizacao=? WHERE id=?";
	try {
		PreparedStatement stmt = connection.prepareStatement(sql);
		stmt.setLong(4, tarefa.getId());
		
		stmt.setString(1, tarefa.getDescricao());
		stmt.setBoolean(2, tarefa.getFinalizado());
		stmt.setDate(3, new Date(tarefa.getDataFinalizacao().getTimeInMillis()));
		
		stmt.execute();
		stmt.close();
		
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
}

}
[/code]

Tarefa.java


package br.com.caelum.tarefas.modelo;

import java.util.Calendar;

public class Tarefa {
	
	private Long id;
	private String descricao;
	private Boolean finalizado;
	private Calendar dataFinalizacao;
	
	public Tarefa()
	{
		
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Boolean getFinalizado() {
		return finalizado;
	}

	public void setFinalizado(Boolean finalizado) {
		this.finalizado = finalizado;
	}

	public Calendar getDataFinalizacao() {
		return dataFinalizacao;
	}

	public void setDataFinalizacao(Calendar dataFinalizacao) {
		this.dataFinalizacao = dataFinalizacao;
	}

}

Action que faz a listagem das tarefas


package br.com.caelum.tarefas.action;

import java.util.List;

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

import br.com.caelum.tarefas.dao.TarefaDAO;
import br.com.caelum.tarefas.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().getLista();
		return "ok";
	}

	public List<Tarefa> getTarefas() {
		return tarefas;
	}

}

Tela que mostra a tarefa a ser Modificada

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>Alterar tarefa</title>
</head>
<body>
	<h3>Alterar tarefa - ${tarefa.id}</h3>
	<form action="alteraTarefa" method="post">
		<input type="hidden" name="tarefa.id" value="${tarefa.id}"/>
	
		Descrição: <br/>
		&lt;textarea name="tarefa.descricao" rows="5" cols="100"&gt;${tarefa.descricao}&lt;/textarea&gt;<br/>
		
		Finalizado? &lt;input type="checkbox" name="tarefa.finalizado" value="true" ${tarefa.finalizado ? 'checked' : false}/&gt;<br/>
	
		Data de Finalização: <br/>
		&lt;input type="text" name="tarefa.dataFinalizacao" value="&lt;fmt:formatDate value="${tarefa.dataFinalizacao.time}" pattern="dd/MM/yyyy"/&gt;&quot;/&gt;<br/>
	
		&lt;input type="submit" value="Alterar"&gt;
	&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;

Acho que é isso, se puderem me ajudar, agradeço!!

Abs []

acho que matei, mas para ter ctz precisaria do erro que sai no seu servidor…

bom, se sua pesquisa não encotrar nenhum resultado, na hr que vc tentar acessar algum atributo de tarefa vai disparar o erro, pois o objeto tarefa não existe, só uma variável que pode fazer referência a ele e está apontando para null.

Verifique se a pesquisa está trazendo alguma coisa e populando a variável.

Na realidade o Struts já popula os atributos para o objeto, na realidade foi como te falei, ele está tentando acessar a dataFinalizacao que está null no bando de dados e por isso está trazendo o nullpointerexception…Não sei aonde eu posso fazer a validação para que se for null fique em branco e se tiver uma data mostrea na tela!!

Abaixo segue o erro!

exception

java.lang.RuntimeException: java.lang.NullPointerException
br.com.caelum.tarefas.dao.TarefaDAO.getLista(TarefaDAO.java:75)
br.com.caelum.tarefas.action.ListaTarefasAction.execute(ListaTarefasAction.java:21)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

root cause

java.lang.NullPointerException
java.util.Calendar.setTime(Unknown Source)
br.com.caelum.tarefas.dao.TarefaDAO.getLista(TarefaDAO.java:62)
br.com.caelum.tarefas.action.ListaTarefasAction.execute(ListaTarefasAction.java:21)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

Obrigado!

hum, Struts 2 eu naum manjo, trabalho muito com o JSF, mas vi que vc ta usando JSTL na JSP…

e se vc fazer um c:if com JSTL, ae vc verifica se é nulo o atributo…se não for nulo vc chama ele na tela

Hummm…uma boa dica, na realidade eu sou iniciante tbm nessa parte, estou tentando entender a metodologia MVC…mas vou tentar fazer um If ali no JSP, tomarra que de certo!!! hehehe

Mas se souber mais alguma coisa, pode me mandar!! :wink:

Abs

blz, eu to on aki, tenta ae pra ver se funfa e me fala q vo te ajudando…

vc pode incrementar melhor isso…se for nulo, vc escreve uma msg do tipo…“Pedido em aberto!”.

outra coisa, essa classe TarefaDao ta terrível, rsrsrsrs…Conhece o conceito de GenericDao…pq se vc tiver que trabalhar com outro objeto realizando persistencia, vai ter criar essas clase enorme denovo???

vcx pode ter uma unica classe que vai persistir todos os objetos…

Deixa eu tentar aqui…

É que na realidade estou seguindo a apostila, e nela não tem a classe TarefaDAO declarada, então eu fui fazendo da minha maneira…MANEIRA DE INICIANTE hehehehe

Abs

Fala Pessoal,

Questão resolvida, na realidade eu sabia aonde estava o erro, mas estava quebrando a cabeça para tentar soluciona-lo…o erro era que na 1º tela era feita a inserção apenas do atributo descrição com valor diferente de null…já o atributo finalizado e dataFinalizacao eram inseridos com null, então quando eu chamava o método que listava todos os atributos, ele me lançava o NullPointerException!!

Resolvi o problema fazendo uma validação no retorno do meu ResulSet dizendo que apenas se fosse != null ele setava a data!!!

Obrigado pela atenção

[]’ s

Olá. Estou com um problema parecido com o que vc teve. No meu caso, não estou conseguindo inserir. Me dá NullPointer direto e o banco permanece vazio. Poderia me ajudar? Ou quem sabe, disponibilizar o código fonte do seu projeto, caso ainda o tenha? Segui a apostila e quando chegou na classe DAO resolvi como vc resolveu…fui montando baseada na classe de contato e acabou dando certo. Porém cheguei até aqui e fiquei preso.

Abraço!!!

Fala meu caro, blz?

Posta o teu código ai e vamos solucionar esse problema :wink:

Abs.

Opa, blz? Vou sim…vou pegar aqui na outra máquina e já já posto…Valeu :smiley:

Opa, lechnerdr. Vou postar em duas partes pra não ficar muito massante de ler. O que está acontecendo é o seguinte: estou segundo a risca a apostila da Caelum, FJ21. Só alguns nomes de JSP’s que mudei pra ficar um pouco melhor, fora isso mais nada!

Estou tentando inserir e popular a tabela com o Struts 2. O NullPointer estoura no método de inserção no banco. Seguem meus códigos pra vc poder dar uma olhada:


cadastrarTarefa.jsp

<%@ page language=“java” contentType=“text/html; charset=ISO-8859-1” pageEncoding=“ISO-8859-1”%>

Adicionar Novas Tarefas

Adicionar Tarefas

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

web.xml

<?xml version="1.0" encoding="UTF-8"?> tarefa index.jsp struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /* *************************************************************************************************************

tarefaAdicionada.jsp

<%@ page language=“java” contentType=“text/html; charset=ISO-8859-1” pageEncoding=“ISO-8859-1”%>

Tarefa realizada!! Nova tarefa adicionada com sucesso!! *************************************************************************************************************

Tarefa.java

package br.com.tarefas.modelo;

import java.util.Calendar;

public class Tarefa {
private Long id;
private String descricao;
private boolean finalizado;
private Calendar dataFinalizacao;

public Long getId() {
	return id;
}
public void setId(Long id) {
	this.id = id;
}
public String getDescricao() {
	return descricao;
}
public void setDescricao(String descricao) {
	this.descricao = descricao;
}
public boolean isFinalizado() {
	return finalizado;
}
public void setFinalizado(boolean finalizado) {
	this.finalizado = finalizado;
}
public Calendar getDataFinalizacao() {
	return dataFinalizacao;
}
public void setDataFinalizacao(Calendar dataFinalizacao) {
	this.dataFinalizacao = dataFinalizacao;
}

}

TarefaDAO.java

package br.com.tarefas.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.sql.Date;
import java.util.List;

import br.com.tarefas.conexao.Conexao;
import br.com.tarefas.modelo.Tarefa;

public class TarefaDAO {

// conexão com o banco de dados
private Connection connection;

// construtor da classe pegando a conexão
public TarefaDAO() {
	this.connection = new Conexao().getMySQLConnection();
}

// Utilizando a conexão pelo Filtro
public TarefaDAO(Connection connection) {
	this.connection = connection;
}

public void adiciona(Tarefa tarefa) {
	String sql = "insert into tarefas (descricao) " + "values (?)";

	try {
		PreparedStatement stmt = this.connection.prepareStatement(sql);
		stmt.setString(1, tarefa.getDescricao());

		stmt.execute();
		stmt.close();
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

public List<Tarefa> lista() {
	try {
		List<Tarefa> tarefas = new ArrayList<Tarefa>();
		PreparedStatement stmt = this.connection.prepareStatement("select * from tarefas");
		ResultSet rs = stmt.executeQuery();

		while (rs.next()) {
			
			// criando objeto tarefa
			Tarefa tarefa = new Tarefa();
			tarefa.setId(rs.getLong("id"));
			tarefa.setDescricao(rs.getString("descricao"));
			tarefa.setFinalizado(rs.getBoolean("finalizado"));

			if (rs.getDate("dataFinalizacao") != null) {
				// montando data atraves do calendar
				Calendar dataFinalizacao = Calendar.getInstance();
				dataFinalizacao.setTime(rs.getDate("dataFinalizacao"));

				tarefa.setDataFinalizacao(dataFinalizacao);
			}
			// adicionar objeto a lista
			tarefas.add(tarefa);
		}
		rs.close();
		stmt.close();
		System.out.println("Lista gerada com Sucesso!");
		return tarefas;

	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

public void remove(Tarefa tarefa) {
	
	try {
		PreparedStatement stmt = this.connection.prepareStatement("delete from tarefas where id = ?");

		stmt.setLong(1, tarefa.getId());
		stmt.execute();
		stmt.close();

		System.out.println("Tarefa Excluida com SUCESSO!");

	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

public Tarefa buscaPorId(Long id) {

	try {
		PreparedStatement stmt = this.connection.prepareStatement("select * from tarefas");
		ResultSet rs = stmt.executeQuery();

		while (rs.next()) {
			// System.out.println(rs.getLong("id")+ " // " + id);
			if (id == rs.getLong("id")) {
				
				// criando objeto tarefa
				Tarefa tarefa = new Tarefa();
				tarefa.setId(rs.getLong("id"));
				tarefa.setDescricao(rs.getString("descricao"));
				tarefa.setFinalizado(rs.getBoolean("finalizado"));

				if (rs.getDate("dataFinalizacao") != null) {
					// montando data atraves do calendar
					Calendar dataFinalizacao = Calendar.getInstance();
					dataFinalizacao.setTime(rs.getDate("dataFinalizacao"));

					tarefa.setDataFinalizacao(dataFinalizacao);
				}
				System.out.println("retornada tarefa:" + tarefa.getId());
				return tarefa;
			}
		}
		return null;
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

public void altera(Tarefa tarefa) {
	String sql = "update tarefas set descricao = ?, finalizado = ?, dataFinalizacao = ? where id = ?";

	try {
		PreparedStatement stmt = this.connection.prepareStatement(sql);

		stmt.setString(1, tarefa.getDescricao());
		stmt.setBoolean(2, tarefa.isFinalizado());
		if (tarefa.getDataFinalizacao() != null) {
			stmt.setDate(3, new Date(tarefa.getDataFinalizacao().getTimeInMillis()));
		} else {
			stmt.setDate(3, null);
		}

		stmt.setLong(4, tarefa.getId());

		stmt.execute();
		stmt.close();

		System.out.println("DADOS ALTERADOS COM SUCESSO!");
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

public void finaliza(Long id) {

	Tarefa tarefa = new TarefaDAO().buscaPorId(id);

	String sql = "update tarefas set finalizado = ?, dataFinalizacao = ? where id = ?";

	try {
		PreparedStatement stmt = this.connection.prepareStatement(sql);

		stmt.setBoolean(1, true);

		stmt.setDate(2, new Date(Calendar.getInstance().getTimeInMillis()));

		stmt.setLong(3, tarefa.getId());

		stmt.execute();
		stmt.close();

		System.out.println("DADOS ALTERADOS COM SUCESSO!");
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}

}

}


Conexao.java

package br.com.tarefas.conexao;

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

public class Conexao {
public Connection getOracleConnection() {
System.out.println(“Conectando ao banco de dados Oracle…”);
Connection conn = null;
try{
Class.forName(“oracle.jdbc.driver.OracleDriver”);
conn = DriverManager.getConnection(“jdbc:oracle:thin:@notebook:1521:xe”,“sepetiba”,“sepetiba”);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return conn;
}

public Connection getMySQLConnection() {
	System.out.println("Conectando ao banco de dados MySQL...");
	try {
		/*
		 * Esta linha de registro do driver salvou minha conexão!
		 * Ainda não sei o porque da obrigatoriedade dela!
		 * Ficar atento a isso da próxima vez!		
		*/
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());
		return DriverManager.getConnection("jdbc:mysql://localhost/banco_tarefa", "leonardo", "senha");
	} catch (SQLException e) {
		e.printStackTrace();
		throw new RuntimeException(e);
	}
}	

}


AdicionarTarefasAction.java

package br.com.tarefas.action;

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

import br.com.tarefas.dao.TarefaDAO;
import br.com.tarefas.modelo.Tarefa;

public class AdicionarTarefasAction {
private Tarefa tarefa;

@Action(value = "adicionarTarefa", results = {
	@Result(name = "ok", location = "tarefaAdicionada.jsp")	
})

public String execute(){
	new TarefaDAO().adiciona(tarefa);
	return "ok";
	
}

public Tarefa getTarefa() {
	return tarefa;
}

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

}


e agora, mando dois prints de tela pra vc poder ver como está estruturada a aplicação no eclipse




Fala meu caro,

Já encontrei o erro…

Apenas uma dica antes… quando você for postar códigos aqui no GUJ coloque o mesmo entre as tags CODE :wink:

Vamos la…

cadastrarTarefa.jsp 

&lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%&gt; 
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt; 
&lt;html&gt; 
&lt;head&gt; 
&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt; 
&lt;title&gt;Adicionar Novas Tarefas&lt;/title&gt; 
&lt;/head&gt; 
&lt;body&gt; 
&lt;h3&gt;Adicionar Tarefas&lt;/h3&gt; 

&lt;form action="adicionarTarefa" method="post"&gt; 
Descrição: <br/> 
&lt;textarea rows="tarefa.descricao" rows="5" cols="100"&gt;&lt;/textarea&gt;<br/> 

&lt;input type="submit" value="Adicionar"&gt; 

&lt;/form&gt; 
&lt;/body&gt; 
&lt;/html&gt;

O seu erro está aqui…

&lt;textarea rows="tarefa.descricao" rows="5" cols="100"&gt;&lt;/textarea&gt;<br/> 

O struts precisa saber para qual atributo da classe tarefa ele irá injetar o conteudo digitado…
Com isso você precisa fazer assim…

&lt;textarea name="tarefa.descricao" rows="5" cols="100"&gt;&lt;/textarea&gt;<br/> 

Testa ai e me diz o que resultou :wink:

Abs.

Fala lechnerdr, blz?!?

Cara, era exatamente isso!!..troquei aqui como vc observou e funcionou perfeitamente. Muito obrigado pela ajuda.

Pô, desculpa por colocar o código daquela maneira. Não sabia mesmo como fazer pra deixar formatado!

Só uma última observação. Na apostila, a única coluna que está como NOT NULL é a do ‘id’, claro! No caso das outras, por padrão o MySQL marca como NOT NULL tbm. Deu erro logo de cara, dizendo que os campos ‘finalizado’ e ‘dataFinalizacao’ precisam de um valor Default, mas isso pude ver e reparar molezinha lá no banco. Sinceramente gostaria de deixar como NOT NULL mesmo pra não depender só de validação por JS na aplicação. Neste caso, se eu colocar o campo ‘finalizado’ como ‘S’ e a ‘dataFinalizacao’ como ‘2011/12/09’ por exemplo, vai me dar muitos problemas, certo? Imagino que sim, mas tbm gostaria de saber o que eu poderia estar fazendo neste caso.

Mais uma vez, muito obrigado pela ajuda!!

Fala leonardoteles!!

Tranquilo e por ai??

Me manda a estrutura da tua tabela, pois na minha não tive esse tipo de preocupação…
Na realidade o que tu deves fazer é ao criar a tabela no banco tu dizer que o campo X por ser NULL e coloca DEFAULT NULL.

Abs.

Opa lechnerdr, boa noite!!

Segue o print que tirei com a estrutura da tabela…eu não entendi muito bem o que vc disse sobre colocar default null…ela já não está assim?

Abraço!


Fala meu caro, blz?

Procurando aqui eu achei essa implementação na época que eu fiz… puts e faz tempo, hahahah.
Olhando a estruta da tabela que está na apostila da Caelum vejo que está correta… fiz um teste aqui tbm inserindo somente a descrição e funcionou beeza.
A sua estruta de tabela está igual a da apostila, então deveria funcionar.

na época eu fiz assim a inserção…


public void adiciona(Tarefa tarefa) {
		
		String sql = "INSERT INTO tarefas (descricao) VALUES (?)";

		try {
			PreparedStatement stmt = connection.prepareStatement(sql);

			stmt.setString(1, tarefa.getDescricao());

			stmt.execute();
			stmt.close();

		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

Então não é necessário você colocar um valor para os outros campos, pois ele irá salvar no banco com o valor de NULL para os outros 2 campos…

Se essa foi a sua pergunta, acredito que eu respondi… mas se não foi manda sua dúvida que respondo.

Abs.