Tiles插件Struts2中的动态继承

时间:2014-08-27 22:33:56

标签: html jsp tiles

我正在使用带有tile 2.0.6插件的Struts2框架。在我的webapp中,我有一个“基础”布局,包括页眉,页脚和页面内容:

<definition name="sharedLayout" template="/shared/jsp/Base.jsp">
    <put-attribute name="pageHeader" value="/shared/jsp/Header.jsp"/>
    <put-attribute name="pageContent" value=""/>
    <put-attribute name="pageFooter" value="/shared/jsp/Footer.jsp"/>
</definition>

对于某些页面,这就足够了。但是,我也有几个页面都使用相同的子标题。处理此问题的最简单方法是创建其他切片定义:

<definition name="sharedLayoutExtended" template="/shared/jsp/BaseExtended.jsp">
    <put-attribute name="pageHeader" value="/shared/jsp/Header.jsp"/>
    <put-attribute name="pageSubHeader" value="/shared/jsp/SubHeader.jsp"/>
    <put-attribute name="pageContent" value=""/>
    <put-attribute name="pageFooter" value="/shared/jsp/Footer.jsp"/>
</definition>

然而,这有一个主要的缺点,我正在复制Base.jsp(和base.css,base.js ...)和BaseExtended.jsp中的大部分代码。使维护和发展更加困难!

我尝试始终使用BaseExtended,然后对那些没有子标题的页面使用ignore属性:

<tiles:insertAttribute name="pageSubHeader" ignore="true" />

虽然这有效,但BaseExtended中有一些元素只有在属性存在的情况下才会出现。例如,如果有一个subheader,那么jsp中的其他地方应该有一个包含一些东西的div。我无法在我的subheader.jsp中添加这个特殊的div,因为中间还有其他元素:

BaseExtended.jsp:

<body>

<tiles:insertAttribute name="pageSubHeader" ignore="true" />

...some other jsp stuff...

IF subheader is actually present, then have some stuff here
ELSE have nothing here

<tiles:insertAttribute name="pageContent" />

...some other jsp stuff...

IF subheader is actually present, then have some stuff here
ELSE have OTHER stuff here

</body>

有没有办法可以实现这些“if / elses”?

1 个答案:

答案 0 :(得分:1)

如果你想测试pageSubHeader是否存在,你可以在这里使用useAttribute

使用JSTL

<tiles:useAttribute name="pageSubHeader" id="pageSubHeader"/>
<c:if test="${not empty pageSubHeader}">
    //do your stuff here. 
</c:if>

或scriptlets

    <tiles:useAttribute name="pageSubHeader" id="pageSubHeader"/>
    <%
    if(pageSubHeader != null) {
        //do your stuff or include your script
    } 
    %>

或者您也可以importAttribute使用logic:not equal。请参阅相关问题here

<tiles:importAttribute name="pageSubHeader" scope="request" />
<logic:notEqual name="pageSubHeader" value="">
  //do your stuff here
</logic:notEqual>

不确定是否有帮助。