sitemesh e primavera problemas de padrão decorador MVC

Tenho sitemesh com spring working, essa é a configuração: decorator.xml

   /exclude.jsp /exclude/*   /*   

E este é meu web.xml

     contextConfigLocation  /WEB-INF/config/web-application-config.xml     springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /*    sitemesh com.opensymphony.sitemesh.webapp.SiteMeshFilter   sitemesh /* REQUEST FORWARD ERROR    org.springframework.web.context.ContextLoaderListener    Resources Servlet org.springframework.js.resource.ResourceServlet 0    Resources Servlet /resources/*    Spring MVC Dispatcher Servlet org.springframework.web.servlet.DispatcherServlet  contextConfigLocation   1    Spring MVC Dispatcher Servlet /spring/*   index.html   

Este trabalho, mas quando eu mudar o padrão em decorator.xml para algo como

  /spring/cliente/index  

não funciona, eu tento muita combinação e nada. Então eu mudo o mapeamento para o servlet de mola no web.xml assim

Servlet do Dispatcher do Spring MVC * .htm

e definir um novo padrão como este:

  /cliente/index.htm  

E funciona, então há alguma maneira de fazer isso funcionar com esse mapeamento para o servlet de primavera?

  Spring MVC Dispatcher Servlet /spring/*  

O problema é que o SiteMesh usa o Request.getServletPath () que em sua aplicação mvc irá retornar “/ spring” para tudo. Eu encontrei isso implementando a interface com.opensymphony.module.sitemesh.DecoratorMapper e usando-o no lugar do ConfigDecoratorMapper normal. Então pude inspecionar os vários argumentos usados ​​para mapear decoradores para solicitações. Infelizmente, acho que isso deixa você com a única opção sendo usar o sufixo * .html no mapeamento DispatcherServelet ou alguma variante dele.

Outra opção seria configurar um PageDecoratorMapper e usar essa tag em sua página original não especificada para especificar qual layout usar:

   

Embora, então, você anule os benefícios dos mapeamentos de URL.

Eu tive esse problema exato. O que está acontecendo é que qualquer parte do caminho do url que você especificar no web.xml é removida pelo servidor da web antes de ser passada para o Spring, mas somente se você colocar o caractere curinga no final. Você já descobriu que quando o seu URL é http://www.myapp.com/spring/cliente/index.html, se você colocar isso no seu web.xml

  Spring MVC Dispatcher Servlet /spring/*  

A primavera só verá a parte do caminho da solicitação após a primavera. Nesse caso, você precisa especificar seu RequestMapping como “/cliente/index.html”.

Você também pode especificar seu mapeamento de servlet dessa maneira.

  Spring MVC Dispatcher Servlet *.html  

Em seguida, o Spring verá o caminho completo da solicitação e você poderá especificar seus mapeamentos de solicitação, como “/spring/cliente/index.html”. O mesmo vale para Sitemesh. Só vê o que o servidor web passa.

Talvez seja útil para alguém, eu tenho o mesmo problema, e depois de pesquisar no google e stading sitemesh sources, resolva o problema, estendendo o ConfigDecoratorMapping. Aqui está:

 /** * Created by IntelliJ IDEA. * User: Inf-root * Date: 30.06.11 * Time: 1:00 * */ public class ConfigDecoratorMapperSpringMvcSupport extends ConfigDecoratorMapper { private static final Logger LOG = Logger.getLogger(ConfigDecoratorMapperSpringMvcSupport.class); private ConfigLoader configLoader = null; /** Create new ConfigLoader using '/WEB-INF/decorators.xml' file. */ public void init(Config config, Properties properties, DecoratorMapper parent) throws InstantiationException { LOG.debug("init()..."); super.init(config, properties, parent); try { String fileName = properties.getProperty("config", "/WEB-INF/decorators.xml"); configLoader = new ConfigLoader(fileName, config); } catch (Exception e) { throw new InstantiationException(e.toString()); } } /** Retrieve {@link com.opensymphony.module.sitemesh.Decorator} based on 'pattern' tag. */ public Decorator getDecorator(HttpServletRequest request, Page page) { LOG.debug("getDecorator()..."); String thisPath = request.getServletPath(); LOG.debug("\tThisPath: " + thisPath); String requestURI = request.getRequestURI(); LOG.debug("\t\tGet request URI: " + requestURI); //TODO check indexes thisPath = "/springURITemplate" + requestURI.substring(request.getContextPath().length(), requestURI.length() - 1); LOG.debug("\t\t\tThisPath: " + thisPath); String name = null; try { name = configLoader.getMappedName(thisPath); } catch (ServletException e) { e.printStackTrace(); } LOG.debug("\tResolved decorator name: " + name); Decorator result = getNamedDecorator(request, name); LOG.debug("Decorator is null ? " + (result == null)); return result == null ? super.getDecorator(request, page) : result; } } 

e meu decorators.xml contém algo como isto

    /springURITemplate/a/administration*   

Testado no tomcat 7 com o Spring 3.0.5

Você tentou fazer / spring / cliente / index * ou / spring / cliente / index / *?