2013-02-08 116 views
4

我正在尝试使用Sitemesh 3来控制从Spring MVC应用程序输出JSP的装饰。如何将Sitemesh 3与Spring MVC 3集成?

当我点击应用程序时,似乎Sitemesh正在向Spring servlet发出请求,尝试并检索其装饰器文件。这可能是,也可能不是正确的行为,但这会导致我所有的头痛。

我对Sitemesh 3的理解是它在Spring之后完成它的工作,即在Response对象上。

我越来越浏览器中的错误是404,并在日志(配置/代码如下):

INFO: Server startup in 1367 ms 
DEBUG: org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 
'springiness' processing GET request for [/clientmanager/]^M 
DEBUG: 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 
Looking up handler method for path /^M 
DEBUG: org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 
Returning handler method [public java.lang.String 
uk.co.hermes.HomeController.home(java.util.Locale,org.springframework.ui.Model)]^M 
DEBUG: org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning 
cached instance of singleton bean 'homeController'^M 
DEBUG: org.springframework.web.servlet.DispatcherServlet - Last-Modified value for 
[/clientmanager/] is: -1^M 
INFO : uk.co.hermes.HomeController - Welcome home! The client locale is en_GB.^M 
DEBUG: org.springframework.beans.factory.support.DefaultListableBeanFactory - Invoking  
afterPropertiesSet() on bean with name 'home'^M 
DEBUG: org.springframework.web.servlet.DispatcherServlet - Rendering view 
[org.springframework.web.servlet.view.JstlView: name 'home'; URL [/WEB- 
INF/jsp/home.jsp]] in DispatcherServlet with name 'springiness'^M 
DEBUG: org.springframework.web.servlet.view.JstlView - Added model object 'serverTime' 
of type [java.lang.String] to request in view with name 'home'^M 
DEBUG: org.springframework.web.servlet.view.JstlView - Forwarding to resource [/WEB- 
INF/jsp/home.jsp] in InternalResourceView 'home'^M 
DEBUG: org.springframework.web.servlet.DispatcherServlet - Successfully completed 
request^M 
DEBUG: org.springframework.web.servlet.DispatcherServlet - DispatcherServlet with name 
'springiness' processing GET request for [/clientmanager/WEB- 
INF/decorators/mainDecorator.html]^M 
DEBUG: 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 
Looking up handler method for path /WEB-INF/decorators/mainDecorator.html^M 
DEBUG: 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - 
Did not find handler method for [/WEB-INF/decorators/mainDecorator.html]^M 
WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request 
with URI [/clientmanager/WEB-INF/decorators/mainDecorator.html] in DispatcherServlet 
with name 'springiness'^M 
DEBUG: org.springframework.web.servlet.DispatcherServlet - Successfully completed request^M 

我怀疑这是在我的web.xml一个问题,我是如何定义映射(网址):

<servlet> 
    <servlet-name>springiness</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>springiness</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<filter> 
    <filter-name>sitemeshfilter</filter-name> 
    <filter-class>uk.co.hermes.filters.SitemeshFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>sitemeshfilter</filter-name> 
    <!-- leaving SitemeshFilter class to decide which responses it should decorate --> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

我的自定义过滤器:

public class SitemeshFilter extends ConfigurableSiteMeshFilter { 

private Logger log = LoggerFactory.getLogger(SitemeshFilter.class); 

/** 
* See http://wiki.sitemesh.org/display/sitemesh3/Configuring+SiteMesh+3 
*/ 
@Override 
protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) { 
log.debug("** hit the sitemesh filter"); 
     // apply this decorator (template) to the path defined... 
     builder.addDecoratorPath("/*", "/WEB-INF/decorators/mainDecorator.html"); 

     // ... when the response type matches one of these 
     builder.setMimeTypes("text/html", "application/xhtml+xml", "application/vnd.wap.xhtml+xml"); 

}}

WEB-INF/ | -jsp | -home.jsp | -decorators | -mainDecorator.html

我的超级简单的控制:

@RequestMapping(value = "/", method = RequestMethod.GET) 
public String home(Locale locale, Model model) { 
    logger.info("Welcome home! The client locale is {}.", locale); 

    Date date = new Date(); 
    DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); 

    String formattedDate = dateFormat.format(date); 

    model.addAttribute("serverTime", formattedDate); 

    return "home"; 
} 
+0

的sitemesh 2.4.2与spring3效果很好.. – 2013-02-08 17:29:08

回答

8

之间的整合既然没有人张贴的实际内容,在这里你去:

pom.xml附加

<dependency> 
    <groupId>org.sitemesh</groupId> 
    <artifactId>sitemesh</artifactId> 
    <version>3.0.0</version> 
</dependency> 

WEB-INF/web.xml &匕首;添加:

WEB-INF/sitemesh3.xml附加
<filter> 
    <filter-name>sitemesh</filter-name> 
    <filter-class>org.sitemesh.config.ConfigurableSiteMeshFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>sitemesh</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

WEB-INF/decorator1.jsp附加
<sitemesh> 
    <mapping path="/*" decorator="/WEB-INF/decorator1.jsp"/> 
</sitemesh> 

<html> 
    <head> 
    ... 
    </head> 
    <body> 
     <sitemesh:write property='body'/> 
    </body> 
</html> 

&匕首;如果使用Spring Security,请将它放在Spring安全筛选器链下面。

0

在我的情况,我用这个小小的tutorial来使它工作。

+1

此链接断开 – toast38coza 2016-06-15 10:52:22

+0

谢谢,我固定它。 – 2016-10-31 21:19:11

1

这里是another blog显示的sitemesh 3和Spring MVC

+5

连接到外部材料通常是可以的,但请确保包含一些自己的文本,以便您的答案符合其自身的优点。 – rgettman 2013-07-11 23:57:23