VRaptor 3 + sitemesh

2 respostas
aeamorim

Ola pessoal,

Estou tentando concluir o projeto do FJ-28 integrando-o com o sitemesh porém estou tendo problemas como segue a mensagem de erro

java.lang.RuntimeException: org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: javax.servlet.ServletException: File "/produtos/decorators/header.jsp" not found
	com.opensymphony.sitemesh.webapp.decorator.BaseWebAppDecorator.render(BaseWebAppDecorator.java:39)
	com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:84)

o problema eh que o meu header.jsp se encontra em /decorators/header.jsp e não /produtos/decorators/header.jsp, outro detalhe eh q eu estou usando o netbeans

segue abaixo os arquivos relacionados

decorators.xml

<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/decorators">
    <decorator name="template" page="template.jsp">
        <pattern>/*</pattern>
    </decorator>
</decorators>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- Início Configuracao jsp -->
    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <page-encoding>UTF-8</page-encoding>
            <scripting-invalid>true</scripting-invalid>
            <include-prelude>/WEB-INF/jsp/prelude.jspf</include-prelude>
        </jsp-property-group>
    </jsp-config>

    <!-- Fim Configuracao jsp -->

    <!-- Inicio da configuracao do filtro Sitemesh -->

    <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- Fim da configuracao do filtro Sitemesh -->

    <!-- Inicio da configuracao do VRaptor 3 -->
    
    <context-param>
        <param-name>br.com.caelum.vraptor.packages</param-name>
        <param-value>br.com.caelum.vraptor.converter.l10n</param-value>
    </context-param>
    <context-param>
        <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
        <param-value>pt_BR</param-value>
    </context-param>
    
    <filter>
        <filter-name>vraptor</filter-name>
        <filter-class>br.com.caelum.vraptor.VRaptor</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>vraptor</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

    <!-- Inicio da configuracao do VRaptor 3 -->

    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

/decorator/template.jsp

<html>
    <head>
        <title>.::AWCom Sistemas - <decorator:title/></title>
        <script type="text/javascript" src="<c:url value='/js/jquery-1.4.2.js'/>"></script>
        <script type="text/javascript" src="<c:url value='/js/puts.js'/>"></script>
        <script type="text/javascript" src="<c:url value='/js/thickbox.js'/>"></script>
        <script type="text/javascript" src="<c:url value='/js/jquery.autocomplete.js'/>"></script>
        <script type="text/javascript" src="<c:url value='/js/jquery.price-format.1.2.js'/>"></script>

        <link rel="stylesheet" type="text/css" href="<c:url value='css/thickbox.css'/>"/>
        <link rel="stylesheet" type="text/css" href="<c:url value='css/jquery.autocomplete.css'/>" media="screen"/>
        <link rel="stylesheet" type="text/css" href="<c:url value="css/global.css"/>"/>
        <link rel="stylesheet" type="text/css" href="<c:url value="css/menu.css"/>"/>
        <!--[if lte IE 6]>
        <link rel="stylesheet" type="text/css" href="<c:url value="css/menu-ie6.css"/>"/>
        <script type="text/javascript" src="<c:url value="javascript/ADxMenu.js"/>"></script>
        <![endif]-->
        <script type="text/javascript">
            $(function(){
                $("#busca").puts("Pesquisa");
            });

            $(function(){
                $("#busca").autocomplete('/ComercioWeb/produtos/busca.json',{
                    dataType: "json",
                    parse: function(produtos){
                        return $.map(produtos, function(produto){
                            return{
                                data: produto,
                                value: produto.nome,
                                result: produto.nome
                            };
                        });
                    },
                    formatItem: function(produto){
                        return produto.nome + " ( " + produto.preco + " )";
                    }
                });
            });

            $(function(){
                $('#preco').priceFormat({
                    prefix: '',
                    centsSeparator: ',',
                    thousandsSeparator: '.'
                });
            });
        </script>
        <decorator:head/>
    </head>

    <body>
        <div id="div-site">
            <div id="div-header">
                <c:import url="decorators/header.jsp"/>
            </div>
            <div id="div-contentfull">
                <div id="div-menu">
                    <c:import url="decorators/menu.jsp"/>
                </div>
                
                <div id="div-content">
                    
                    <decorator:body/>
                </div>
                <div id="div-footer">
                    <!--c:import url="decorators/footer.jsp"/-->
                </div>
            </div>
        </div>

        <script type="text/javascript">
            $('#preco').priceFormat({
                prefix: '',
                centsSeparator: ',',
                thousandsSeparator: '.'
            });

            $("#busca").puts("Busca de produtos por nome");

            $("#busca").autocomplete('/ComercioWeb/produtos/busca.json',{
                dataType: "json",
                parse: function(produtos){
                    return $.map(produtos, function(produto){
                        return{
                            data: produto,
                            value: produto.nome,
                            result: produto.nome
                        };
                    });
                },
                formatItem: function(produto){
                    return produto.nome + "(" + produto.preco + ")";
                }
            });
        </script>
    </body>
</html>

ProdutosController

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.afasoft.controller;

import br.com.caelum.vraptor.view.Results;
import br.com.afasoft.dao.ProdutoDao;
import br.com.afasoft.modelo.Produto;
import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Put;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import java.util.List;
import static br.com.caelum.vraptor.view.Results.*;

/**
 *
 * @author Alberto
 */
@Resource
public class ProdutosController {
    private final ProdutoDao dao;
    private final Result result;
    private final Validator validator;

    public ProdutosController(ProdutoDao dao, Result result, Validator validator){
        this.dao = dao;
        this.result = result;
        this.validator = validator;
    }

    @Get @Path("/produtos")
    public List<Produto> lista(){
        return dao.listaTudo();
    }

    @Post @Path("/produtos")
    public void adiciona(final Produto produto){
        validator.validate(produto);
        validator.onErrorUsePageOf(this).formulario();
        
        dao.salva(produto);
        result.redirectTo(this).lista();
    }

    @Get @Path("/produtos/novo")
    public void formulario(){}

    @Get @Path("/produtos/{codigo}")
    public Produto edita(int codigo){
       return dao.carrega(codigo);
    }

    @Put @Path("/produtos/{produto.codigo}")
    public void altera(Produto produto){
        dao.atualiza(produto);
        result.redirectTo(this).lista();
    }

    @Delete @Path("/produtos/{codigo}")
    public void remove(int codigo){
        Produto produto = dao.carrega(codigo);
        dao.remove(produto);
        result.redirectTo(this).lista();
    }

    public List<Produto> busca(String nome){
        result.include("nome", nome);
        return dao.busca(nome);
    }

    @Get @Path("/produtos/busca.json")
    public void buscaJson(String q){
        result.use(json()).withoutRoot().from(dao.busca(q)).exclude("codigo","descricao").serialize();
    }
}

alguém tem alguma ideia do que pode estar acontecendo, ou como eu posso resolver esse problema?

2 Respostas

Lucas_Cavalcanti

o erro está aqui:

<c:import url="decorators/header.jsp"/>

essa url deveria ser absoluta, e não relativa…

ou seja, começar com barra:

<c:import url="/decorators/header.jsp"/>
aeamorim

Valeu Lucas, deu certo

Criado 13 de janeiro de 2011
Ultima resposta 13 de jan. de 2011
Respostas 2
Participantes 2