por favor, o curso em si, não ensina a alterar ou remover um produto, tem algum curso aqui que ensina ? que pode-se utilizar com o SpringMVC?
Obrigada.
por favor, o curso em si, não ensina a alterar ou remover um produto, tem algum curso aqui que ensina ? que pode-se utilizar com o SpringMVC?
Obrigada.
Olá Lilian,
no curso de Spring MVC4 , na aula sobre Redirecionando requisições tem um exemplo sobre o processo de remover e alterar com o Spring. Você pode dar uma olhada nesta aula e tentar aplicar para o exemplo do produto.
Olá Lucas,
eu estou fazendo o curso Spring MVC 4, porém todo o DAO do projeto está para guardar em memória, não estou conseguindo fazer os métodos do DAO para alterar e remover dentro do MySQL
Exemplo:
SPRING MVC 4: Insert
public void adiciona(Conta conta) {
String sql = "insert into contas (descricao, paga, valor, tipo) values (?,?,?,?)";
PreparedStatement stmt;
try {
stmt = connection.prepareStatement(sql);
stmt.setString(1, conta.getDescricao());
stmt.setBoolean(2, conta.isPaga());
stmt.setDouble(3, conta.getValor());
stmt.setString(4, conta.getTipo().name());
stmt.execute();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
SPRING MVC 1
public void gravar(Aluno aluno) {
manager.persist(aluno);
}
poderia me ajudar por favor?
Obrigada
Olá Lilian,
no curso do SpringMVC 4, para trabalhar com o banco de dados estamos usando uma especificação chamada JDBC que é nativa do Java. Neste caso, o ContaDao que você baixa no começo do curso já vem com queries para remover e atualizar uma Conta e estas queries seguem o padrão SQL, ou seja, elas servem tanto para um banco em memória HSQLDB quanto para um MySQL. Para usar o MySQL, o que você precisa fazer é alterar a classe ConnectionFactory
. Por enquanto deve estar usando o driver e fazendo conexão com o HSQLDB, desta forma:
public Connection getConnection() throws SQLException {
System.out.println("conectando ...");
try {
//driver do HSQLDB
Class.forName("org.hsqldb.jdbcDriver");
} catch (ClassNotFoundException e) {
throw new SQLException(e);
}
//conexão com o HSQLDB
return DriverManager.getConnection("jdbc:hsqldb:file:contas.db","sa", "");
}
Se quiser trabalhar com o MySQL, precisa trocar tanto o driver quando a conexão do banco para o MySQL.
Já no curso do SpringMVC I, o projeto usa o framework Hibernate para trabalhar com o banco. A vantagem dele é que você não precisa escrever toda a query para executar uma ação no banco, apenas chama um método que faz isso para você. Por exemplo, para inserir um aluno no banco você chamou o método manager.persist(aluno)
. Para remover um elemento usando o Hibernate o método é o manager.remove
e para atualizar é o manager.merge
Lucas, Obrigada!
como estou utilzando o curso do SpringMVC I, coloquei no DAO assim:
public void remover(Aluno aluno) {
manager.remove(aluno);
}
public void alterar(Aluno aluno) {
manager.merge(aluno);
}
Estou com dificuldades em colocar os dados no controller:
Remover:
@RequestMapping("removeraluno")
public ModelAndView remover(Aluno aluno,BindingResult result,
RedirectAttributes redirectAttributes) {
alunoDAO.remover(aluno);
if (result.hasErrors()){
return form(aluno);
}
return new ModelAndView("redirect:alunos");
}
Alterar:
@RequestMapping("alterarAluno")
public String alterar(Long id, Aluno aluno) {
AlunoDAO dao = new AlunoDAO();
aluno.addAttribute("aluno", dao.buscaPorId(id));
return "redirect:listaDeAlunos";
}
JSP:
<td><a href="removeAluno?id=${aluno.id}">Remover</a></td>
<td><a href="alterarAluno?id=${aluno.id}">Alterar</a></td>
se puder me ajudar a corrigir o meu controller, eu agradeço.
Olá Lilian,
primeiro sobre o seu remover no controller. Note que primeiro você chama o alunoDAO.remover(aluno)
para retirar o aluno no banco de dados. Até ai ok, só que depois você faz um if com o result.hasErrors()
que se tem algum erro de validação você manda o usuário para a tela de cadastro aluno, caso contrário manda para a listagem. Por que você precisa dessa validação?
Quanto ao alterar no controller, está faltando separar algumas coisas. Em geral nos sistemas web que você usa, quando você tem uma lista de elementos e do lado tem um link falando Alterar
/Editar
um elemento, em geral em qual tela você cai primeiro quando clica neste link? Como que em geral é o fluxo para você dizer quais campos você quer alterar? Essas perguntas devem te dar uma ideia de como fazer o alterar.
Lucas, obrigada!
sobre o remover:
por lógica, seria: ao clicar no link remover, ele deve ir diretamente para o RequestMapping "remove" do controller, porém é demonstrada o erro 404 que não está localizando este mapeamento. se funcionasse, ele estaria voltando para a lista de alunos sem aquele registro. Correto?
JSP dentro da lista de alunos:
<td><a href="remove?id=${aluno.id}">Remover</a></td>
Controller:
@RequestMapping("remove")
public String remove(Aluno aluno) {
alunoDAO.remover(aluno);
return "redirect:listaDeAlunos";
}
Sobre Alterar/Editar:
JSP dentro da lista de alunos:
<td><a href="exibeAluno?id=${aluno.id}">Alterar</a></td>
quando clico no link Alterar, ele deveria localizar o RequestMapping de exibeAluno no controller e abrir o form exibeAluno.jsp para que as informações possam ser alteradas. também está apresentando 404 e não localiza este mapeamento.
Controller:
@RequestMapping("exibeAluno")
public ModelAndView formExibe(Aluno aluno){
ModelAndView modelAndView = new ModelAndView("projeto/exibeAluno");
return modelAndView;
}
form de alterar:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="security" %>
<%@ taglib tagdir="/WEB-INF/tags" prefix="tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<!-- attach CSS styles -->
<c:url value="/resources/css" var="cssPath" />
<link rel="stylesheet" href="${cssPath }/bootstrap.min.css" >
<link rel="stylesheet" href="${cssPath }/bootstrap-theme.min.css" >
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<style type="text/css">
body{
padding-top: 60px;
}
</style>
</head>
<body>
<tags:pageTemplate titulo="Cuidando da Atenção">
<div class="container">
<h1>Alteração de Alunos</h1>
<form action="alteraAluno" method="POST">
<input type="hidden" id="id" name="id" value="$
{aluno.id }"/><br />
Nome: <input type="text" id="nome" name="nome" value="$
{aluno.nome }"/><br />
Matricula: <input type="text" id="matricula" name="matricula" value="$
{aluno.matriculo }"/><br />
Serie: <input type="text" id="serie" name="serie" value="$
{aluno.endereco }" /><br />
<input type="submit" value="Alterar"/>
</form>
</div>
</tags:pageTemplate>
</body>
</html>
quando abrir o form e clicar em alterar, ele é direcionado para o metodo alterar do controller(alteraAluno):
@RequestMapping("alteraAluno")
public String merge(Aluno aluno) {
alunoDAO.alterar(aluno);
return "redirect:listaDeAlunos";
}
Obs: essa ultima parte não consigo testar, porque o form de exiber Aluno não é localizado - 404.
obrigada.
Olá Lilian,
as lógicas parecem certas. O nome que você colocou no projeto foi casadocodigo
? Se foi, veja se colocando uma /casadocodigo no começo dos hrefs e action não resolve o problema :
<a href="/casadocodigo/remove?id=${aluno.id}">Remover</a>
<a href="/casadocodigo/exibeAluno?id=${aluno.id}">Alterar</a>
<form action="/casadocodigo/alteraAluno" method="POST">
Se você colocou outro nome do projeto, é só colocar ele no lugar do casadocodigo.
Lucas, obrigada!
alterei conforme falou e .....continua dando o erro 404.
HTTP Status 404 - /projetocuidandodaatencao/exibeAluno
HTTP Status 404 - /projetocuidandodaatencao/exibeAluno
Lucas,
ao inserir a action da MVC, o formulário de exibição é encontrado:
ao inserir a action da MVC, ele localiza o remove do controller, porém não remove...não estou conseguindo carregar o ID de cada registro tanto para remover como para alterar.
action para alterar:
<td><form:form action="${s:mvcUrl('AC#formExibe').build() }" method="POST"
commandName="aluno">
<button type="submit" class="btn btn-primary">
alterar
</button></form:form></td>
action para remover:
<td><form:form action="${s:mvcUrl('AC#remove').build() }" method="POST"
commandName="aluno">
<button type="submit" class="btn btn-primary">
remover
</button></form:form></td>
como faço para conseguir carregar o ID e identificar o que preciso alterar ou remover? obrigada.
os metodos utilizados para alterar e remover estão corretos?
@RequestMapping("alteraAluno")
public ModelAndView alterar(Aluno aluno) {
alunoDAO.alterar(aluno);
ModelAndView modelAndView = new ModelAndView("projeto/ListaDeAlunos");
modelAndView.addObject("aluno", aluno);
return modelAndView;
}
@RequestMapping("remover")
public ModelAndView remover(Aluno aluno) {
alunoDAO.remover(aluno);
ModelAndView modelAndView = new ModelAndView("projeto/ListaDeAlunos");
modelAndView.addObject("aluno", aluno);
return modelAndView;
}
ao remover o erro é demonstrado:
HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: Removing a detached instance br.com.projeto.cuidandodaatencao.model.Aluno#1
Obrigada.
Olá Lilian,
o que está faltando para funcionar é justamente mandar o id do aluno que você quer alterar ou remover. Como você está usando as tags do Spring MVC e criando um <form:form>
, para mandar um id basta criar um input do tipo hidden. Você pode usar tanto a tag do Spring MVC para fazer isso <form:hidden path="id" />
quanto a do html padrão <input name="id" type="hidden" value="<colocar o id do aluno aqui>"/>
Lucas, estou inserindo em html padrão dessa forma que me orientou, mais continua com o mesmo erro.
obrigada
Me manda o seu código html completo agora para eu dar uma olhada.
Olá Lucas, segue:
ListaDeAlunos.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="security" %>
<%@ taglib tagdir="/WEB-INF/tags" prefix="tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<tags:pageTemplate titulo="Cuidando da Atenção">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<!-- attach CSS styles -->
<c:url value="/resources/css" var="cssPath" />
<link rel="stylesheet" href="${cssPath }/bootstrap.min.css" >
<link rel="stylesheet" href="${cssPath }/bootstrap-theme.min.css" >
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<style type="text/css">
body{
padding-top: 60px;
}
</style>
</head>
<body>
<div class="container">
<h1>Lista de Alunos</h1>
<div>${sucesso }</div>
<table class= "table table-bordered table-striped table-hover">
<tr>
<th>Id</th>
<th>Matricula</th>
<th>Nome</th>
<th>Sexo</th>
<th>data lançamento</th>
<th>remover</th>
<th>Alterar</th>
</tr>
<c:forEach items="${alunos}" var="aluno">
<tr>
<td>${aluno.id}</td>
<td>${aluno.matricula}</td>
<td>${aluno.nome}</td>
<td>${aluno.sexo}</td>
<td>${aluno.dataLancamento}</td>
<td><form:form action="${s:mvcUrl('AC#remover').build() }?id=${aluno.id}" method="POST" commandName="aluno">
<button type="submit" class="btn btn-primary">remover</button></form:form></td>
<td><form:form action="${s:mvcUrl('AC#formExibe').build() }?id=${aluno.id}" method="POST" commandName="aluno">
<button type="submit" class="btn btn-primary">alterar</button></form:form></td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>
</tags:pageTemplate>
JSP para alterar os valores:
exibeAluno.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="security" %>
<%@ taglib tagdir="/WEB-INF/tags" prefix="tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<!-- attach CSS styles -->
<c:url value="/resources/css" var="cssPath" />
<link rel="stylesheet" href="${cssPath }/bootstrap.min.css" >
<link rel="stylesheet" href="${cssPath }/bootstrap-theme.min.css" >
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<style type="text/css">
body{
padding-top: 60px;
}
</style>
</head>
<body>
<tags:pageTemplate titulo="Cuidando da Atenção">
<h1>Alteração de Alunos</h1>
<form:form action="${s:mvcUrl('AC#alterar').build() }" method="POST"
commandName="aluno">
<div class="container">
<div class="form-group">
<label>ID</label>
<input type="hidden" name="id" value="${aluno.id}" />
</div>
<div class="form-group">
<label>Nome do Aluno</label>
<input type="text" value="?nome=${aluno.nome}" />
</div>
<div class="form-group">
<label>Matricula</label>
<input type="text" name="matricula" value="?id=${aluno.matricula}" />
</div>
<div class="form-group">
<label>Data de Nascimento</label>
<input type="text" name="dataNascimento" value="?id=${aluno.dataNascimento}"/>
</div>
<div class="form-group">
<label>sexo</label>
<input type="text" name="dataLancamento" value="?id=${aluno.dataLancamento}" />
</div>
<div class="form-group">
<label>Data de lançamento</label>
<input type="text" name="dataLancamento" value="${aluno.dataLancamento}" />
</div>
<div class="form-group">
<label>Arquivo</label>
<input name="arquivo" type="file" />
</div>
<button type="submit" class="btn btn-primary">
alterar
</button>
</div>
</form:form>>
</tags:pageTemplate>
</body>
</html>
DAO:
public void remover(Aluno aluno) {
manager.remove(aluno);
}
public void alterar(Aluno aluno) {
manager.merge(aluno);
}
Controller:
@RequestMapping("alteraAluno")
public ModelAndView alterar(Aluno aluno) {
alunoDAO.alterar(aluno);
ModelAndView modelAndView = new ModelAndView("projeto/ListaDeAlunos");
modelAndView.addObject("aluno", aluno);
return modelAndView;
}
@RequestMapping("remover")
public ModelAndView remover(Aluno aluno) {
alunoDAO.remover(aluno);
ModelAndView modelAndView = new ModelAndView("projeto/ListaDeAlunos");
modelAndView.addObject("aluno", aluno);
return modelAndView;
}
@RequestMapping("exibeAluno")
public ModelAndView formExibe(Aluno aluno){
ModelAndView modelAndView = new ModelAndView("projeto/exibeAluno");
return modelAndView;
}
Erro para remover:
HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: Removing a detached instance br.com.projeto.cuidandodaatencao.model.Aluno#1
para alterar.....o id está sendo enviado...mais as outras informações não.....
o link de alterar redireciona para o metodo do controller mais não altera.....
Obrigada pela ajuda no meu projeto!!
Ola Lilian,
Tanto no seu form:form
do remove quanto do altera, você faz requisições do tipo POST. Neste formato, você não manda os parâmetros na url, mas sim escondidos dentro da requisição. Note que no remove e o altera você mandou o id na sua action, ou seja, na sua url como no padrão GET:
<form:form action="${s:mvcUrl('AC#remover').build() }?id=${aluno.id}" method="POST" commandName="aluno">
<button type="submit" class="btn btn-primary">remover</button>
</form:form>
Então você precisa na verdade colocar nestes form:form
o input hidden do id do aluno ao invés de passá-lo na sua url, dado que está usando o método POST.
Outra coisa que notei que precisa de um ajuste é a jsp do formulário de alteração de valores. Olha como você passa o aluno:
<input type="text" value="?nome=${aluno.nome}" />
O value do input deveria ser apenas o valor que estou enviando na requisição. Nesta forma que está escrito o input está tentando dizer tanto o campo a ser considerado (nome) e o valor tudo no value. Mas como que eu fazia para falar que este era o input atrelado ao nome do aluno? Tem vários inputs nesta jsp que precisam deste ajuste.
Lucas, o alterar deu certo!! =) obrigada!
mais o remover continua com o mesmo erro:
HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException: Removing a detached instance br.com.projeto.cuidandodaatencao.model.Aluno#1
<td><form:form action="${s:mvcUrl('AC#remover').build() }"
method="POST" commandName="aluno">
<input type="hidden" name="id" value="${aluno.id}" />
<button type="submit" class="btn btn-primary">remover</button></form:form></td>
Lucas, alterei o DAO e agora consigo remover! obrigada!! =)
public void remover(Aluno aluno){
manager.createQuery("delete from Aluno aluno where id =" + aluno.getId()).executeUpdate();
}
Olá!! poderia por favor me ajudar a realizar uma query de update no projeto do Spring?
o metodo abaixo estava funcionando...mais agora não funciona mais então estou tentando realizar uma query.
public void alterar(Aluno aluno) {
manager.merge(aluno);
}
query:
public int alterar(Aluno aluno) {
return manager.createQuery("UPDATE Aluno SET nome='"+ aluno.getNome() +"', matricula='" + aluno.getMatricula() +"', sexo='"+ aluno.getSexo() +"', "
+ "dataLancamento='"+ aluno.getDataLancamento() +"', dataNascimento='"+ aluno.getDataNascimento() +"'' WHERE Id =" + aluno.getId()).executeUpdate();
obrigada!
Ola Lilian,
mas qual o erro que ele acusa quando você usa o merge? É que fazer o update na mão acaba sendo meio chato quando envolve datas por conta de você ter que formatá-las.
Lucas, boa noite! obrigada pelo retorno!
ele não está apresentando erro, somente está adicionando um registro de vez de alterar.
classe controller:
@RequestMapping("alteraAluno")
public ModelAndView alterar(Aluno aluno) {
alunoDAO.alterar(aluno);
ModelAndView modelAndView = new ModelAndView("projeto/ListaDeAlunos");
modelAndView.addObject("aluno", aluno);
return modelAndView;
}
DAO
public void alterar(Aluno aluno) {
manager.merge(aluno);
}
Obrigada
O problema na verdade deve estar a view, ele não deve estar mandando qual o Id do aluno que ele precisa atualizar. Quando o merge não recebe o id ele insere ao invés de atualizar. Veja se no formulário você tem um input hidden pro id.
Deu certo!! obrigada mesmo!!
aproveitando....
no fim, quando faz o metodo, ele redireciona para o endereço:
http://localhost:8080/projetocuidandodaatencao/alunos/alteraAluno
só que o certo seria:
http://localhost:8080/projetocuidandodaatencao/alunos
projetocuidandodaatencao = nome do meu projeto
alunos = lista de alunos
alteraAluno - mapeamento de alterar.
tentei redirectAttributes e não deu certo..
como faço para que ao alterar volte para a página da lista?
Ola Lilian,
No curso do Spring I o redirect é apresentado na aula 5. Para o seu projeto seria da mesma forma como redirecionamos depois que cadastramos um produto.