Плитки 3, как сослаться на другое определение в атрибуте put

Я хотел бы иметь возможность определить базовое определение, где я могу наследовать список стилей и скриптов. затем определите определение страницы, которое наследует базовое определение, и добавит специфичные для страницы стили и скрипты. Возможно ли это, или я не правильно об этом думаю? Я бы подумал, что это довольно простая идея.

базовые определения

<tiles-definitions>
    <!-- base styles -->
    <definition name="base.styles" >
        <put-list-attribute name="styles" cascade="true" >
            <add-attribute value="/view/common/jquery-ui-theme-base-v1.12.1.css" />
        </put-list-attribute>
    </definition>
    <!-- base scripts -->
    <definition name="base.scripts" >
        <put-list-attribute name="scripts" cascade="true" >
            <add-attribute value="https://code.jquery.com/jquery-3.1.0.min.js" />
            <add-attribute value="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" />
        </put-list-attribute>
    </definition>
    <!-- base definition -->
    <definition name="base.definition" template="/WEB-INF/page/defaultLayout.jsp" >
        <put-attribute name="title" />
        <put-attribute name="styles" value="base.styles.styles" cascade="true" />
        <put-attribute name="header" value="/WEB-INF/page/common/header.jsp" />
        <put-attribute name="body" />
        <put-attribute name="scripts" value="base.scripts.scripts" cascade="true" />
        <put-attribute name="footer" value="/WEB-INF/page/common/footer.jsp" />
    </definition>
</tiles-definitions>

обратите внимание, что значения атрибута put соответствуют именам определений над ними. (по-моему, это неверно)

определения для конкретных страниц

<tiles-definitions>
    <!-- page specific styles -->
    <definition name="samplePage.styles" extends="base.styles" >
        <put-list-attribute name="styles" inherit="true" >
            <add-attribute value="/view/page/samplePage/samplePageStyles.css" />
        </put-list-attribute>
    </definition>
    <!-- page specific scripts -->
    <definition name="samplePage.scripts" extends="base.scripts" >
        <put-list-attribute name="scripts" inherit="true" >
            <add-attribute value="/view/page/samplePage/samplePageScript.js" />
        </put-list-attribute>
    </definition>
    <!-- page specific definition -->
    <definition name="samplePage" extends="base.definition" >
        <put-attribute name="title" value="Sample Page" />
        <put-attribute name="styles" value="samplePage.styles" cascade="true" />
        <put-attribute name="body" value="/WEB-INF/page/samplePage/samplePageBody" />
        <put-attribute name="scripts" value="samplePage.scripts" cascade="true" />
    </definition>
</tiles-definitions>

снова — обратите внимание, что значения атрибута put соответствуют именам определений над ними. (вероятно, неправильно?)

В настоящее время я получаю исключение IllegalArgumentException

Caused by: java.lang.IllegalArgumentException: Cannot convert samplePage.styles of type class java.lang.String to class org.apache.tiles.Attribute
at com.sun.el.lang.ELSupport.coerceToType(ELSupport.java:428)
at com.sun.el.ExpressionFactoryImpl.coerceToType(ExpressionFactoryImpl.java:85)
... 104 more

Похоже, что атрибуты put для стилей и скриптов не подбирают определения с тем же именем над ними... но я не уверен, что делать, чтобы исправить это. Любые идеи?


person Tony Card    schedule 23.12.2016    source источник


Ответы (1)


Чтобы ответить на вопрос как сослаться на другое определение в атрибуте put-attribute, это кажется довольно простым с компонентами jsp, такими как следующие (обратите внимание на определение и атрибут 'type'). эм>):

<definition name="default.header" template="/WEB-INF/page/common/header.jsp" />

...то в другом месте...

<put-attribute name="header" type="definition" value="default.header" />

Однако не похоже, что это можно сделать с помощью таких ресурсов, как таблицы стилей и скрипты, поскольку они не преобразуются обратно в фактический шаблон. Итак, я переработал свое базовое определение следующим образом, что по-прежнему позволяет мне иметь «глобальные» ресурсы, а также «специфические для страницы» ресурсы. Также позволяет мне написать компоненты jsp один раз, определить их один раз и ссылаться на них много раз.

общие определения (tiles.common.xml)

<tiles-definitions>
    <definition name="default.header" template="/WEB-INF/page/common/header.jsp" />
    <definition name="default.footer" template="/WEB-INF/page/common/footer.jsp" />

    [... all the other common components...]

</tiles-definitions>

базовое определение (tiles.base.xml)

<tiles-definitions>
    <definition name="base.definition" template="/WEB-INF/page/baseLayout.jsp" >
        <put-attribute name="title" type="string" />
        <put-attribute name="header" type="definition" value="default.header" />
        <put-attribute name="body" />
        <put-attribute name="footer" type="definition" value="default.footer" />
        <put-list-attribute name="styles" inherit="true" >
            <add-attribute value="/view/common/jquery-ui-theme-base-v1.12.1.css" />

            [... other styles common to all pages...]

        </put-list-attribute>
        <put-list-attribute name="scripts" inherit="true" >
            <add-attribute value="https://code.jquery.com/jquery-3.1.0.min.js" />
            <add-attribute value="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" />

            [... other scripts common to all pages...]

        </put-list-attribute>
    </definition>
</tiles-definition>

определение конкретной страницы (tiles.samplePage.xml)

<tiles-definitions>
    <definition name="samplePage" extends="base.definition" >
        <put-attribute name="title" value="Sample Page" />
        <put-attribute name="body" value="/WEB-INF/page/samplePage.jsp" />
        <put-list-attribute name="styles" inherit="true" >
            <add-attribute value="/view/pages/samplePage.css" />

            [... other page specific styles ...]

        </put-list-attribute>
        <put-list-attribute name="scripts" inherit="true" >
            <add-attribute value="/view/pages/samplePage.js" />

            [... other page specific scripts ...]

        </put-list-attribute>
    </definition>
</tiles-definition>
person Tony Card    schedule 28.12.2016