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?