我有弹簧工作的sitemesh,这是配置: decorator.xml
<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/styles">
<excludes>
<pattern>/exclude.jsp</pattern>
<pattern>/exclude/*</pattern>
</excludes>
<decorator page="application/themeManager/theme.jsp" name="dos">
<pattern>/*</pattern>
</decorator>
</decorators>
这是我的 web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<!-- The master configuration file for this Spring web application -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/config/web-application-config.xml
</param-value>
</context-param>
<!-- Enables Spring Security -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Agregamos el filtro de sitemesh que permite interceptar todas las llamadas que necesitamos -->
<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>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<!-- Loads the Spring web application context -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Serves static resource content from .jar files such as spring-faces.jar -->
<servlet>
<servlet-name>Resources Servlet</servlet-name>
<servlet-class>org.springframework.js.resource.ResourceServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<!-- Map all /resources requests to the Resource Servlet for handling -->
<servlet-mapping>
<servlet-name>Resources Servlet</servlet-name>
<url-pattern>/resources/*</url-pattern>
</servlet-mapping>
<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all *.spring requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/spring/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
这项工作,但当我在decorator.xml中更改类似
的模式时<decorator page="application/themeManager/theme.jsp" name="dos">
<pattern>/spring/cliente/index</pattern>
</decorator>
它不起作用,我尝试了很多组合而没有任何东西。 然后我像这样
更改web.xml中spring servlet的映射Spring MVC Dispatcher Servlet 的* .htm
并定义新模式,如下所示:
<decorator page="application/themeManager/theme.jsp" name="dos">
<pattern>/cliente/index.htm</pattern>
</decorator>
它有效,所以有没有办法让这个用于Spring servlet的映射?
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/spring/*</url-pattern>
</servlet-mapping>
答案 0 :(得分:4)
问题是SiteMesh使用Request.getServletPath(),它在你的spring mvc应用程序中将为所有内容返回“/ spring”。我通过实现com.opensymphony.module.sitemesh.DecoratorMapper接口并使用它代替普通的ConfigDecoratorMapper来找到它。然后我能够检查用于将装饰器映射到请求的各种参数。不幸的是,我认为这使得您唯一的选择是在DispatcherServelet映射中使用* .html后缀或其某些变体。
另一种选择是配置PageDecoratorMapper并在原始未修饰页面中使用此标记来指定要使用的布局:
<meta name="decorator" content="layoutName" />
虽然这样你就无法使用url映射的好处。
答案 1 :(得分:2)
我遇到了那个确切的问题。发生的事情是,在web.xml中指定的url路径的任何部分在传递给Spring之前都会被Web服务器剥离,但前提是你将通配符放在最后。您已经发现当您的网址是www.myapp.com/spring/cliente/index.html时,如果您将其放入您的web.xml
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/spring/*</url-pattern>
</servlet-mapping>
Spring只会在/ spring之后看到请求路径的一部分。在这种情况下,您需要将RequestMapping指定为“/cliente/index.html”。
您也可以通过这种方式指定servlet映射。
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
然后Spring将看到整个请求路径,您可以指定您的请求映射,例如“/spring/cliente/index.html”。 Sitemesh也是如此。它只能看到Web服务器通过的内容。
答案 2 :(得分:2)
也许这对某人有用,我遇到了同样的问题,经过google和stading sitemesh资源的研究后,通过扩展ConfigDecoratorMapping来解决问题。这是它:
/**
* 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;
}
}
我的decorators.xml包含这样的内容
<?xml version="1.0" encoding="ISO-8859-1"?>
<decorators defaultdir="/web/decorators">
<decorator name="admin_decorator" page="admin_decorator.jsp">
<pattern>/springURITemplate/a/administration*</pattern>
</decorator>
</decorators>
使用Spring 3.0.5在tomcat 7上测试
答案 3 :(得分:0)
您是否尝试过/ spring / cliente / index *或/ spring / cliente / index / *?