Referenciar o controller a partir de um link e passar o id do objeto ou o objeto como parametro

Como faço para referenciar o controller a partir de um link e passar o id do objeto ou o objeto como parâmetro

<c:forEach items="${alunoList}" var="aluno"> <li> Aluno </li> ${aluno.nome} - ${aluno.endereco} <a href="<c:url value="/alunos/atualiza"/>">Editar</a> </c:forEach>

Estou chegando no controller no método atualiza, mas não estou sabendo como passar o id ou o objeto aluno para o controller! Por favor, me ajudem!!

Para passar parametros via GET utiliza-se

url?paramentro1=1&p2=2&p3=3 etc…

Certo: Assim? E pra receber no controller?

<c:forEach items="${alunoList}" var="aluno"> <li> Aluno </li> <input type="text" value="${aluno.nome}" name="aluno.nome"/> ${aluno.nome} - ${aluno.endereco} <a href="<c:url value="/alunos/atualiza"/>?id=${aluno.id}">Editar</a> </c:forEach>

VocÊ esta usando algum tipo de framework MVC para web ?

Para acessar os parametros passados vc pode utilizar a ServletRequest.

http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletRequest.html#getParameter(java.lang.String)

Estou usando o vRaptor 3, que utiliza o hibernate.

Carregando o aluno no Controller:

public Aluno edita(Long idAluno) {
		return alunoDao.carrega(idAluno);
	}

este método edita() corresponde a uma JSP edita dentro da pasta aluno lá na WEB-INF.

Método carrega no AlunoDAO:

public Aluno carrega(Long idAluno) {
		    return (Aluno) this.session.load(Aluno.class, idAluno);
	 }

Depois vêm o método atualiza aluno, lá no Controller:

public void atualiza(Aluno aluno) {
		alunoDao.atualiza(aluno);
		// mensagem de aluno alterado com sucesso
		result.include("mensagem", "Aluno alterado com sucesso");
		// redirecionando para a listagem após a alteração
		result.use(Results.logic()).redirectTo(AlunoController.class).lista();
	}

Método atualiza em AlunoDAO:

public void atualiza(Aluno aluno) {
		Transaction tx = session.beginTransaction();
		session.update(aluno);
		tx.commit();
	}

Nos Controllers vc usa a classe AlunoDAO injetando no construtor da classe:

public AlunoController(Result result, AlunoDAO alunoDao, Validator validator) {
		this.result = result;
		this.alunoDao = alunoDao;
		this.validator = validator;
	}

Bom, este exemplo seria usando VRaptor 3, espero que ajude. =)
Abraço!

[quote=Guevara][quote]
<c:forEach items="${alunoList}" var=“aluno”>

  • Aluno


  • ${aluno.nome} - ${aluno.endereco}
    <a href="<c:url value="/alunos/atualiza"/>?id=${aluno.id}">Editar
    </c:forEach>
    [/quote]

    Carregando o aluno no Controller:

    public Aluno edita(Long idAluno) {
    		return alunoDao.carrega(idAluno);
    	}

    este método edita() corresponde a uma JSP edita dentro da pasta aluno lá na WEB-INF.

    Método carrega no AlunoDAO:

    public Aluno carrega(Long idAluno) {
    		    return (Aluno) this.session.load(Aluno.class, idAluno);
    	 }

    Depois vêm o método atualiza aluno, lá no Controller:

    public void atualiza(Aluno aluno) {
    		alunoDao.atualiza(aluno);
    		// mensagem de aluno alterado com sucesso
    		result.include("mensagem", "Aluno alterado com sucesso");
    		// redirecionando para a listagem após a alteração
    		result.use(Results.logic()).redirectTo(AlunoController.class).lista();
    	}

    Método atualiza em AlunoDAO:

    public void atualiza(Aluno aluno) {
    		Transaction tx = session.beginTransaction();
    		session.update(aluno);
    		tx.commit();
    	}

    Nos Controllers vc usa a classe AlunoDAO injetando no construtor da classe:

    public AlunoController(Result result, AlunoDAO alunoDao, Validator validator) {
    		this.result = result;
    		this.alunoDao = alunoDao;
    		this.validator = validator;
    	}

    Bom, este exemplo seria usando VRaptor 3, espero que ajude. =)
    Abraço![/quote]

    Hummm…vou verificar aqui, vou ver como eu uso o metodo edita

    A página edita() que eu postei corresponde a um form que carrega o objeto e ao alterar algum dado, envia para o método atualiza do Controller, no seu caso seria aquele form que vc postou no primeiro post, é só adaptar ao seu caso.
    Para enviar os dados pegando pela ID do aluno ficaria assim no form:

    <td><a href="edita?idAluno=${aluno.idAluno}">Alterar</a></td>       

    O “edita” seria o método “edita” lá no Controller, vc pode colocar o nome que desejar, tipo “altera” e lá no Controller nomear o método como “altera” tb.
    O Controller terá dois métodos para essa transação de atualizar o aluno, um método para carregar o objeto e enviar para a página de edição e outro para receber os dados alterados, estes dados serão atualizados pela classe AlunoDAO.

    Olha só, segundo o que entendi:

    <ul> <c:forEach items="${alunoList}" var="aluno"> <li> Aluno </li> ${aluno.nome} <a href="/aluno?id=${aluno.id}">ver cliente 5</a> </c:forEach> </ul>

    esse aluno do href é do objeto aluno. E o meu controller:

    [code] @Path("/aluno")
    public void atualiza(int id){

    }[/code]
    

    Mas ele não entra no método atualiza e dá o seguinte erro no tomcat:
    INFO: Illegal access: this web application instance has been stopped already. Could not load org.apache.log4j.spi.NOPLoggerRepository. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.

    Pra chamar o método atualiza poderia chamar normalmente, sem o path:

    <a href="atualiza?id=${aluno.id}">ver cliente</a>  

    E lá no Controller tira o @path do método.

    Eu edito conforme está na apostila da Caelum:

    // Este é o método responsável por alterar o aluno, é chamado quando o usuário clica no botão "atualizar" lá na página edita.jsp
    public void altera(Aluno aluno) {
    		alunoDao.atualiza(aluno);
    		// mensagem de Aluno alterado com sucesso
    		result.include("mensagem", "Aluno alterado com sucesso");
    		// redirecionando para a listagem após a alteração
    		result.use(Results.logic()).redirectTo(AlunoController.class).lista();
    	}
           
           //Aqui chama a página edita.jsp ja enviando o objeto aluno
    	public Aluno edita(Long idAluno) {
    		return alunoDao.carrega(idAluno);
    	}

    E lá na DAO fica:

    public void atualiza(Aluno aluno) {
    		Transaction tx = session.beginTransaction();
    		session.update(aluno);
    		tx.commit();
    	}

    Deu certo! Muito obrigada! :smiley:

    Deixa eu ressuscitar isso aqui uhauha. Minha duvida é, onde eu fecho a session?? estou fazendo este mesmo exercicio da caelum porem eu queria seguir os padroes de bom uso do hibernate mas nao sei como dar um session.close(), e nesses codigos de exemplo postados aqui nao vi fecharem a a session nenhuma vez.

    assim, não!?

                                try{
                                              Transaction tx = session.beginTransaction();  
                                              session.update(aluno);  
                                              tx.commit();  
    		} catch (Exception e) {
    			t.rollback();
    
    		} finally {
    			session.close();
    		}

    opa vlw, consegui usando um interceptor, mas a logica é igual a sua, obrigado