1

我有一个问题,嵌套模板在父模板之前被评估。由于排序问题,这会导致坚持嵌套的标签库出现问题。

模板.jsp

<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
<%@taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<%@taglib uri="http://taglibs.com/tags" prefix="s"%>
<%System.out.println("evaluating template.jsp");%>
<s:outer>
    <tiles:insertAttribute name="content" />
</s:outer>

内容.jsp

<%@page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
<%@taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<%@taglib uri="http://taglibs.com/tags" prefix="s"%>
<tiles:insertDefinition name="template">
    <tiles:putAttribute name="content" />
        <%System.out.println("evaluating content.jsp");%>
        <s:inner />
    </tiles:putAttribute>
</tiles:insertDefinition>

content.jsp评估页面时,输出以下内容。

evaluating content.jsp
evaluating template.jsp

页面失败,content.jsp因为inner标签必须在outer标签内。content.jsp评估后如何让 Tiles评估template.jsp

4

1 回答 1

1

我可能是错的,但我认为 Tiles 需要解析整个 JSP,这意味着你不能按照它的布局方式来做。当前布局来自目标 JSP,然后在内部使用模板。我们可以使用瓦片定义来指定模板作为填充内容的目标。我认为这种方法可以让您更有效地使用切片继承,并且可以解决这个问题,因为“模板”将首先呈现,而不是第二个。

示例:tiles.xml

<tiles-definitions>
    <definition name="myTemplate" template="/WEB-INF/jsf/template.jsp">
         <put-attribute name="content" value="" />
    </definition>
    <definition name="content" extends="myTemplate">
         <put-attribute name="content" value="content.jsp" />
    </definition>
</tiles-definitions>

现在你必须指定一个瓦片定义作为你的结果类型......如果你使用 struts2 我会告诉你,但所有框架都有可能不是你的。

您的模板 jsp 将保持不变。并且您的内容 jsp 将被重写为:

<%@taglib uri="http://taglibs.com/tags" prefix="s"%>
<%System.out.println("evaluating content.jsp");%>
<s:inner />

请注意,现在无需将任何图块逻辑混合到页面中。内容就是这样。您会注意到tiles.xml 文件比我真正需要的要复杂,但我想表明在我们的示例中我们只有一个“放置属性”,但在更复杂的页面中您可以有很多,因此“myTemplate”会产生一个页面不仅包含内容,还包含页眉和页脚以及侧边栏,甚至可能是页眉,因此您可以更改页面上的脚本和 CSS,然后您只需按照给出的示例扩展它,然后只更改您想要的部分(通常它只是内容),您可以进一步扩展该定义... Base Layout -> Secure Layout extends Base 但可能会更改标题以包含锁定图标 ->

于 2010-11-19T22:50:45.430 回答