Vraptor - Passando um double para o jsp

2 respostas
fred.dobroes

Olá, estou estudando o framework Vraptor e fiz o seguinte método:

public double decimal(){
	return 10.20;
}

e quando tento pegar o resultado na JSP da seguinte forma:

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Teste</title>
</head>
<body>
${double} 
</body>
</html>

ele da o seguinte erro:

br.com.caelum.vraptor.view.ResultException: org.apache.jasper.JasperException: javax.el.ELException: Failed to parse the expression [${double}]
br.com.caelum.vraptor.view.DefaultPageResult.defaultView(DefaultPageResult.java:69)
br.com.caelum.vraptor.interceptor.ForwardToDefaultViewInterceptor.intercept(ForwardToDefaultViewInterceptor.java:60)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.OutjectResult.intercept(OutjectResult.java:67)
br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:85)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
....

caso eu troque o método para uma string ou para um integer ele funciona perfeitamente.

Agradeço dese já pela ajuda !

2 Respostas

E

mesmo erro aqui =/

alguma sugestão?

guivirtuoso

Pessoal,

Uma vez cai nessa "armadilha", de o meu retorno no request ter o mesmo nome de uma palavra reservada ou "proibida", como é o caso que foi apresentado....

Vou mostrar duas formas que podem ser usadas p/ contornar este problema... no entando acredito que devem existir implementações mais elegantes.

:arrow: Você pode definir um outro nome no request para usar no JSP

AppController.java
@Resource
public class AppController {

    private Result result;
    private HttpServletRequest request;

    public AppController(Result result, HttpServletRequest request) {
        this.result = result;
        this.request = request;
    }

    @Get
    @Path("/")
    public void index() {
        // WEB-INF/jsp/app/index.jsp
    }

    @Get
    @Path("/retornaDouble")
    public void retornaDouble() {
        System.out.println("#### Retornando Double no request");
        
        // Setando no request o conteudo double com outro nome
        request.setAttribute("minhaDouble",  10.20);
        
        // Redirecionando para o metodo index(), você pode redirecionar para onde quiser obviamente...
        result.redirectTo(this).index();
    }
}

:arrow: Você pode criar uma classe que sirva como um Wrapper

DoubleVRaptor.java
import sun.misc.FloatingDecimal;

public class DoubleVRaptor extends Number implements Comparable&lt;DoubleVRaptor&gt; {

    private Double valor;

    public DoubleVRaptor(Double valor) {
        this.valor = valor;
    }

    public DoubleVRaptor(double valor) {
        this.valor = valor;
    }

    public DoubleVRaptor(String valor) {
        this.valor = new Double(valor);
    }

    public Double getValor() {
        return valor;
    }

    public void setValor(Double valor) {
        this.valor = valor;
    }

    @Override
    public String toString() {
        return new FloatingDecimal(valor).toJavaFormatString();
    }

    @Override
    public int intValue() {
        return valor.intValue();
    }

    @Override
    public long longValue() {
        return valor.longValue();
    }

    @Override
    public float floatValue() {
        return valor.floatValue();
    }

    @Override
    public double doubleValue() {
        return valor.doubleValue();
    }

    @Override
    public int compareTo(DoubleVRaptor o) {
        return valor.compareTo(o.getValor());
    }
}
AppController.java
@Resource
public class AppController {

    @Get
    @Path("/")
    public void index() {
        // WEB-INF/jsp/app/index.jsp
    }

    @Get
    @Path("/retornaDouble")
    public DoubleVRaptor retornaDouble() {
        return new DoubleVRaptor(10.20);
    }
}
retornaDouble.jsp
&lt;%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %&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;VRaptor 3.4.0&lt;/title&gt;
		&lt;link rel="icon" href="favicon.jpg" type="image/jpg" /&gt;
	&lt;/head&gt;
	&lt;body&gt;
		Valor do DoubleVRaptor: ${doubleVRaptor}
		<BR><BR>
		Valor do DoubleVRaptor Formatado: &lt;fmt:formatNumber type="number" maxIntegerDigits="3" value="${doubleVRaptor}" /&gt;
	&lt;/body&gt;
&lt;/html&gt;

Bom seria isso... como disse .. não são as implementações mais elegantes, mas até certo ponto podem resolver oq vocês estão pretendendo fazer...

Abraços

Criado 27 de dezembro de 2011
Ultima resposta 12 de dez. de 2012
Respostas 2
Participantes 3