我遇到了在父模板之前评估嵌套模板的问题。由于订购问题,这会导致标记库出现问题,导致嵌套。
template.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>
content.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
?
答案 0 :(得分:1)
我可能错了,但我认为Tiles需要解析整个JSP,这意味着你不能按照它的布局方式来做。当前布局来自目标JSP,然后在内部使用模板。我们可以使用切片定义将模板指定为内容中的目标填充。我认为这种方法可以让你更有效地使用tile继承,并且可以解决这个问题,因为“模板”将首先呈现而不是第二次。
实施例: 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>
现在你必须指定一个tile定义作为你的结果类型......如果你正在使用struts2,我会告诉你,但你可能不会使用所有框架。
你的模板jsp看起来会保持不变。 你的内容jsp将被重写为:
<%@taglib uri="http://taglibs.com/tags" prefix="s"%>
<%System.out.println("evaluating content.jsp");%>
<s:inner />
请注意,现在无需将任何切片逻辑混合到页面中。内容就是这样。您会注意到tiles.xml文件比我真正需要的更复杂但我希望在我们的示例中显示我们只有一个'put属性'但是在更复杂的页面中你可以有很多,所以'myTemplate'会产生一个页面,不仅包含内容,还包括页眉和页脚,侧栏甚至标题,因此您可以更改页面上的脚本和CSS,然后只需在给定的示例中扩展它,然后只更改您想要的部分(通常它只是内容),你可以进一步扩展这个定义......基础布局 - &gt;安全布局扩展Base但可能会更改标题以包含锁定图标 - &gt; View_users_in_secure_layout扩展了安全布局,改变了视图用户功能的内容。