sitemesh and tiles 2.1 integration with spring MVC
Asked Answered
C

1

1

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>
Coprophilia answered 17/5, 2010 at 15:40 Comment(2)
what does your sitemesh.xml file look like?Aceto
is like the default, that comes with the distribution, I have noticed that if the I add the configuration to a path that is no managed by spring it work, also if I use org.springframework.web.servlet.view.InternalResourceViewResolver it worksCoprophilia
A
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.

Aceto answered 17/5, 2010 at 19:13 Comment(2)
It doesn't work, I added charset ISO-8859-1 and another parse with utf-8 but still not workedCoprophilia
I changed the pattern and it works <decorator page="application/themeManager/theme.jsp" name="theme"> <pattern>*</pattern> </decorator>Coprophilia

© 2022 - 2024 — McMap. All rights reserved.