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

Dúvida: contar valores e exibir na jsp

Boa noite,

Estou tentando fazer com que uma aplicação "dispare" uma consulta via controller e atualize o jsp dinamicamente.

Meu método java está funcionando perfeitamente, mas não sei exatamente como "lincar" as duas coisas.

HomeController

@RequestMapping(method = RequestMethod.GET, value = "/countSeries")
    public Callable<ModelAndView> countSeries(RedirectAttributes model) {
        System.out.println("Quantidade de séries cadastradas: " + seriesDao.count());
        return () -> {
            model.addFlashAttribute("countSeries", seriesDao.count());
            return new ModelAndView("");
        };
    }

Quando acesso a url localhost:8080/cartoestelefonicos/home/countSeries, na tela me retorna um 404, pois fiz um redirect para lugar nenhum, mas no console imprime o valor de séries cadastradas.

Console Quantidade de séries cadastradas: 1

Código JSP

<span class="info-box-number"><a href="${s:mvcUrl('HC#countSeries').build()}">${countSeries}</a></span>

Este é o código HTML que estou usando para "tentar" atualizar o valor.

Objetivo: Quero que ao renderizar o jsp, esta controller seja acionada e retorne o valor de séries cadastradas, atualizando o span.

Obrigado .

6 respostas

Não vai rolar... O método no controller, anotado com requestmapping, é acionado a partir de uma requisição http.. a função ali só monta uma url.. o que você pode fazer é criar uma classe qualquer, anotar com component e usar ela ali no seu spam.

Alberto, veja se compreendi direto sua sugestão.

1) classe qualquer:

package br.com.renansouza.cartoestelefonicos.helpers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import br.com.renansouza.cartoestelefonicos.daos.SeriesDao;

@Component
public class IndexController {

    @Autowired
    private static SeriesDao seriesDao;

    public static long getCountSeries() {
        return seriesDao.count(); 
    }
}

2) Utilização no span:

<span class="info-box-number"><% IndexController.getCountSeries(); %></span>

Se for isto, acredito que tenha faltando entender algum detalhe no curso que fiz, pois está retornando um nullpointer:

java.lang.NullPointerException
    br.com.renansouza.cartoestelefonicos.helpers.IndexController.getCountSeries(IndexController.java:15)

Obrigado.

@Component
public class IndexController {

    @Autowired
    private SeriesDao seriesDao;

    public long getCountSeries() {
        return seriesDao.count(); 
    }
}
<span class="info-box-number"> ${indexController.getCountSeries()}</span>

Informe que o component vive no escopo de request, caso ele não esteja disponível na expression language.

Boa noite Alberto,

Fiz como você sugeriu mas não obtive sucesso:

package br.com.casadocodigo.loja.controllers;

import org.springframework.stereotype.Component;

@Component
public class TesteController {
    public long getCountSeries() {
        System.out.println("Se passar por aqui vai printar no console!");
        return 0; 
    }

}

Também na form.jsp

<span class="info-box-number">${testeController.getCountSeries()}</span>

e na AppWebConfiguration

@ComponentScan(basePackageClasses = { HomeController.class, ProductDAO.class, FileSaver.class, TesteController.class })

Porém o resultado continua o mesmo, podes me auxiliar?

Estou estudando a partir do seu livro de Spring e coloquei o fonte no git: https://github.com/renan86/spring_casadocodigo.git

Abraços

solução!

Faltou colocar que ele vive no escopo de request.

Alberto, entendi o que você quis dizer com escopo de requestada: @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)

Porém apenas incluído isto não obtive sucesso, tive que fazer algumas outras modificações e acho que este não é o jeito correto.

Na form.jsp

<span>${testeController.getText()}</span> <- Não imprime o valor
<span>${count}</span> <- Imprime o valor

Na ProductsController.java

@Autowired
private TesteController tc;

@RequestMapping("/form")
    public ModelAndView form(@ModelAttribute Product product) {
        ModelAndView modelAndView = new ModelAndView("products/form");
        modelAndView.addObject("types", BookType.values());
        modelAndView.addObject("count", tc.getText());
        return modelAndView;
    }
@Component
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class TesteController {
    public String getText() {
        System.out.println("Se passar por aqui vai printar no console!");
        return "Esta é uma mensagem do sistema... HAHAHAHAHAHAHAHA";
    }

}

Há uma forma "decente" de fazer isto?