sitemesh and tiles 2.1 integration with spring MVC

痴心易碎 提交于 2020-01-03 04:24:41

问题


Is posible to integrate sitemesh and tiles 2.1 with spring mvc ? I want to composite the layout with tiles and then decorate with sitemesh.

I was using tiles like that.

   <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
        <property name="definitions">
            <list>
                <value>/WEB-INF/layouts/layouts.xml</value>
                <value>/WEB-INF/views.xml</value>
                <value>/WEB-INF/hotels/views.xml</value>
                <value>/WEB-INF/hotels/booking/views.xml</value>
                                <value>/WEB-INF/cliente/views.xml</value>
            </list>
        </property>
    </bean>

Then I configure sitemesh in the xml.

 <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>

And then I added decorator

<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/styles">


    <decorator page="application/themeManager/theme.jsp" name="theme">
        <pattern>/spring/hotels/index</pattern>

    </decorator>


</decorators>

But this doesn't do nothing, I think that tiles avoid to sitemesh to process the page, how to do this ?

This the sitemesh.xml I just using the default that comes with the examples

<sitemesh>
    <property name="decorators-file" value="/WEB-INF/decorators.xml"/>
      <excludes file="${decorators-file}"/>
    <!--<excludes file="/WEB-INF/decorators.xml"/>-->

    <page-parsers>
        <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
    </page-parsers>

    <decorator-mappers>

        <mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
            <param name="property.1" value="meta.decorator" />
            <param name="property.2" value="decorator" />
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.FrameSetDecoratorMapper">
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.AgentDecoratorMapper">
            <param name="match.MSIE" value="ie" />
            <param name="match.Firefox" value="mozilla" />
            <param name="match.Opera" value="opera" />
            <param name="match.Lynx" value="lynx" />
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
            <param name="decorator" value="printable" />
            <param name="parameter.name" value="printable" />
            <param name="parameter.value" value="true" />
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.RobotDecoratorMapper">
            <param name="decorator" value="robot" />
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.ParameterDecoratorMapper">
            <param name="decorator.parameter" value="decorator" />
            <param name="parameter.name" value="confirm" />
            <param name="parameter.value" value="true" />
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper">
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
            <param name="config" value="${decorators-file}" />
        </mapper>

    </decorator-mappers>

</sitemesh>

回答1:


SiteMesh is a bit fragile, and you don't get much logging information from it, so it can be tricky to determine if anything is actually happening.

My guess is that the decorator is being bypassed because the content-type doesn't match. Your sitemesh.xml file contains the following entry:

<page-parsers>
    <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
</page-parsers>

In other words, the decorator will only be invoked if the response content-type is text/html.

You said that it works if you point it at a path that does not go through Spring, and I think that's because Spring is changing the content-type, and is therefore bypassing the decorator.

Try adding the following additional entry to sitemesh.xml:

<parser content-type="text/html;charset=ISO-8859-1" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />

Note the charset added to the content-type. Spring MVC is pretty fastideous with content-types, and I suspect it's changing it to something that includes the charset. If your local charset is something other than ISO-8859-1, then try that. You can add as many <parser> entries as you like.



来源:https://stackoverflow.com/questions/2850483/sitemesh-and-tiles-2-1-integration-with-spring-mvc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!