0

スタイルとスクリプトのリストを継承できるベース定義を定義できるようにしたいと考えています。次に、基本定義を継承するページ定義を定義し、ページ固有のスタイルとスクリプトを追加します。これは可能ですか、それとも私はこれについて正しい方法で考えていませんか? これはかなり基本的な考え方だと思いました。

基本定義

<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-attribute の値は、その上の定義の名前と一致することに注意してください。(私の推測では、これは正しくありません)

ページ固有の定義

<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-attribute の値がその上の定義の名前と一致していることに注意してください。(たぶん正しくない?)

現在 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-attributes がそれらの上にある同じ名前の定義を取得していないように見えます...しかし、それを修正するために何をすべきかわかりません。何か案は?

4

1 に答える 1

0

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 コンポーネントを 1 回作成し、1 回定義して、何度も参照することができます。

共通定義 (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>
于 2016-12-28T20:41:30.033 に答える