Solucionado (ver solução)
Solucionado
(ver solução)
12
respostas

Problema para passar o parâmetro para o Controller

Eu tenho um Controller, para carregar as imagens dos produtos, no meu .jsp Essas imagens estão em no meu diretório na rede. Porém não estou conseguindo passar o parâmetro para que ele possa carregar a imagem.

package br.com.empresa.controller;

import java.io.File;

import javax.inject.Inject;

import br.com.caelum.vraptor.Controller;
import br.com.empresa.dao.ProdutoDao;
import br.com.empresa.modelo.Produto;

@Controller
public class ImagemController {

    @Inject
    private ProdutoDao produtoDao;

    public File imgProduto(Integer id) {

        Produto produto = produtoDao.buscaProdutoPorId(id);
        String caminho = produto.getLocalImagem() + "\\" + produto.getImagem();

        /* Trocando '/' por '\\' */
        caminho = caminho.replace("\\", "\\\\");

        /* Verificando se o caminho aponta para uma imagem */
        if (!caminho.contains(".jpg")) {
            return null;
        } else {
            File arquivo = new File(caminho);
            return arquivo;
        }
    }
}

No meu .jsp:

<img src="<c:url value="/imagem/imgProduto?caminho=${arquivo.caminho}"/>"/>
12 respostas

Ewerton em nenhum momento seu método esta recebendo um parâmetro chamado caminho, o que ele esta recebendo é o id de um produto, o mesmo deve ser passado da seguinte maneira:

// troque ID_PRODUTO pelo ID do produto em si, exemplo: 1
<img src="<c:url value="/imagem/imgProduto/ID_PRODUTO"/>"/>

Para ai sim seu controller fazer a lógica e buscar a imagem que deve ser carregada.

Bom dia Matheus!

Se eu passar o img dessa forma:

<img src="<c:url value="/imagem/imgProduto?caminho=${arquivo.caminho}"/>"/>

Gera o erro 500:

GET http://localhost:8080/ebf-catalogo-mysql/imagem/imgProduto?caminho= 500 ()

E se eu passar dessa forma:

<img src="<c:url value="/imagem/imgProduto/${produto.id}"/>"/>

Gera o erro 404:

http://localhost:8080/ebf-catalogo-mysql/imagem/imgProduto/2 404 ()

Vc quer que eu poste mais alguma parte/classe do código...

Eu postei o projeto no Drive => https://drive.google.com/drive/folders/0B1n2t9Tjxu9GckdsZEowUGRxT2s?usp=sharing

Obrigado pela ajuda Matheus !!!

Ewerton, desculpe a falta de atenção, como estamos passando um parâmetro para o controller, devemos informar no método que o mesmo irá aceitar um parâmetro:

@Get("download/{id}")
public File imgProduto(Integer id) {
    // restante do código
}

Repare que o parâmetro da URL deve conter o mesmo nome referente ao parâmetro do método.

Tranquilo Matheus... Cara adicionei a anotação @Get, porém continuou gerando erro 404, nas duas formas de passar a tag img src...

Se vc puder dar uma olhada no projeto, atualizei o código fonte no drive, e comentei um código que iria atrapalhar vc de incluir um produto...

Vc precisa criar um BD no MySQL, com o nome ebfwms1, e alterar a senha do root no persistence.xml... Ou alterar a configuração do persistence para acessar seu BD...

O jsp que eu estou testando, é o "formVaz.jsp", ele está em src\webapp\WEB-INF\jsp\produto

=> https://drive.google.com/drive/folders/0B1n2t9Tjxu9GckdsZEowUGRxT2s?usp=sharing

Muito obrigado pela ajuda !!!

Em qual momento esta dando erro 404 Ewerton ?

Como você esta acessando o método ?

Eu criei um diretório "Temp" em "C:\" e adicionei uma imagem dentro desse diretório, por exemplo "bike.jpg". Ai adicionei um produto, no campo local imagem eu coloquei esse diretório "C:\Temp" e no campo imagem adicionei "bike.jpg". Clico em "Cadastrar/Salvar", o sistema salva o registro no BD e redireciona para a listagem...

Na listagem eu clico em "Selecionar", para carregar o produto e ser redirecionado para o formulário...

Nesse momento a imagem deveria ser carregada...

Ao editar o produto, abra seu console do chrome, veja o erro que ela irá lhe retornar e pegue o caminho que ele esta tentando buscar a imagem.

Adicionei um if, para o caso de um novo registro ou no caso de um registro que não possui as informações necessárias:

<c:if test="${produto.localImagem != null && produto.imagem != null}">
    <img src...
</c:if>

Antes de eu adicionar a anotação que vc me orientou, estava gerando erro 404 e 500 para as tags:

<img src="<c:url value="/imagem/imgProduto?caminho=${arquivo.caminho}"/>"/>
 <img src="<c:url value="/imagem/imgProduto/${produto.id}"/>"/>

, respectivamente.

Adicionei a anotação, abri o console do Chrome e verifiquei e começou a gerar o erro 404, para ambas as tags (de um registro que possui "localImagem" e "imagem").

Adicionei print´s no ImagemController, mas nada foi impresso no console do Eclipse...

Parece que ele não está passando pelo controller...

Ou eu não consigo printar as informações que que passam pelo controller ?

Meu ImagemController, com os print´s:

package br.com.empresa.controller;

import java.io.File;

import javax.inject.Inject;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.empresa.dao.ProdutoDao;
import br.com.empresa.modelo.Produto;

@Controller
public class ImagemController {

    @Inject
    private ProdutoDao produtoDao;

    @Get("download/{id}")
    public File imgProduto(Integer id) {

        Produto produto = produtoDao.buscaProdutoPorId(id);

        System.out.println("EVD, Imagemcontroller: " + produto.getId() + " - ID L.22");
        System.out.println("EVD, Imagemcontroller: " + produto.getLocalImagem() + " - LOCAL IMAGEM L.23");
        System.out.println("EVD, Imagemcontroller: " + produto.getImagem() + " - IMAGEM L.24");

        String caminho = produto.getLocalImagem() + "\\" + produto.getImagem();

        System.out.println("EVD, Imagemcontroller: " + caminho + " CAMINHO L.29");
        System.out.println("EVD, Imagemcontroller: " + produto.getId() + " - ID L.30");
        System.out.println("EVD, Imagemcontroller: " + produto.getLocalImagem() + " - LOCAL IMAGEM L.31");
        System.out.println("EVD, Imagemcontroller: " + produto.getImagem() + " - IMAGEM L.32");

        /* Trocando '/' por '\\' */
        caminho = caminho.replace("\\", "\\\\");

        System.out.println("EVD, Imagemcontroller: " + caminho + " CAMINHO L.37");

        /* Verificando se o caminho aponta para uma imagem */
        if (!caminho.contains(".jpg")) {
            return null;
        } else {
            File arquivo = new File(caminho);
            return arquivo;
        }
    }
}

Atualizei o projeto no drive...

Alguma ideia do que possa estar acontecendo Matheus... Qual procedimento vc quer que eu faça pra gente tentar descobrir o que ocorre...

Obrigado pela ajuda !!

Inspecionei o elemento, e a tag:

<img src="<c:url value="/imagem/imgProduto/${produto.id}"/>"/>
Passa para o .jsp:

<img src="/ebf-catalogo-mysql/imagem/imgProduto/1">

Eu não estava passando o parâmetro "id", para o ImagemController, alterei o método atualiza do ProdutoController e agora está OK...

Consegui carregar todas as informações necessárias...

Agora preciso passar o valor da variável "caminho", para o form.jsp na tag img scr...

Alguma dica Matheus... Obrigado!!

solução!

Bom dia Matheus!

Cara consegui resolver o problema... Verifiquei que não havia a necessidade de um controller para carregar a imagem... Exclui o ImagemController, e criei um método no ProdutoController:

    @Get("produto/{id}/imgProduto")
    public File imgProduto(Integer id) {
        Produto produto = produtoDao.buscaProdutoPorId(id);
        String caminho = produto.getLocalImagem() + "\\" + produto.getImagem();
        if (!caminho.contains("jpg")) {
            return null;
        } else {
            File arquivo = new File(caminho);
            return arquivo;
        }
    }

E no .jsp alterei para:

                    <label>Imagem do produto:</label>
                    <c:if test="${produto.localImagem != null && produto.imagem != null}">
                        <img src="${linkTo[ProdutoController].imgProduto(produto.id)}" width="200" height="200">
                    </c:if>

Ficou perfeito!! Obrigado pela ajuda!!

Agradeço, se vc puder me ajudar um um outro problema:

https://cursos.alura.com.br/forum/topico-double-aumentando-uma-casa-32538

Um abraço!

Maravilha Ewerton, que bom que deu tudo certo.

Esta corrido as coisas por aqui, ai não deu tempo de responder suas dúvida.

Apenas por questões de praticidade, acho que seria melhor manter o ImagemController, pois em todo lugar que precisar carregar imagens usaria apenas ele, evitando a necessidade de criar métodos em todos os seus controllers para tal necessidade.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software