本文介绍了与Spring MVC集成sitemesh和tile 2.1的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以将sitemesh和tile 2.1与spring mvc集成在一起?我想用瓷砖合成布局,然后用sitemesh装饰.

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.

我当时在用这种瓷砖.

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

然后我在xml中配置sitemesh.

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>

然后我添加了装饰器

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

但这并没有做任何事情,我认为磁贴避免了sitemesh来处理页面,该怎么做?

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

这是我使用示例随附的默认值的sitemesh.xml

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>

推荐答案

SiteMesh有点脆弱,并且从中获取的日志信息也不多,因此要确定是否确实发生了任何事情都是很棘手的.

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.

我的猜测是装饰器被绕过,因为内容类型不匹配.您的sitemesh.xml文件包含以下条目:

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>

换句话说,仅当响应内容类型为text/html时,才会调用装饰器.

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

您说过,如果将其指向不通过Spring的路径,它将起作用,我认为这是因为Spring更改了内容类型,因此绕过了装饰器.

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.

尝试将以下其他条目添加到sitemesh.xml:

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

请注意添加到内容类型的charset. Spring MVC在内容类型方面非常讲究,我怀疑它正在将其更改为包含字符集的内容.如果您的本地字符集不是ISO-8859-1,请尝试该操作.您可以根据需要添加任意多个<parser>条目.

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.

这篇关于与Spring MVC集成sitemesh和tile 2.1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-10 22:53