【问题标题】:Tiles 3 how to reference another definition in put-attributeTiles 3 如何在 put-attribute 中引用另一个定义
【发布时间】:2016-12-29 04:41:30
【问题描述】:

我希望能够定义一个基本定义,我可以在其中继承样式和脚本列表。然后定义一个继承基本定义的页面定义,并添加页面特定的样式和脚本。这可能吗?或者我没有以正确的方式考虑这个问题?我会认为这是一个相当基本的想法。

基本定义

<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 似乎没有选择它们上方同名的定义......但我不确定如何纠正它。有什么想法吗?

【问题讨论】:

    标签: spring-mvc tiles spring-4 apache-tiles tiles-3


    【解决方案1】:

    要回答如何在 put-attribute 中引用另一个定义这个问题,这似乎很容易使用以下 jsp 组件(注意定义和“类型”属性):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      相关资源
      最近更新 更多