【问题标题】:Migrating from Sitemesh to Apache Tiles从 Sitemesh 迁移到 Apache Tiles
【发布时间】:2012-04-24 07:04:41
【问题描述】:

我正在使用 spring-mvc 和 spring-webflow 开发自己的项目。在阅读了一些关于 spring webflow 和 ajax 的文章后,我了解到更好的选择是使用 Apache Tiles 来呈现视图。

在 Sitemesh 中,我使用了一个标记调用 head ()。模板中使用的该标签允许在生成的 HTML 上呈现页面的整个 head 属性。

有没有办法在 Apache Tiles 中实现这一点?根据我的阅读,我认为我必须执行以下操作:

两个 jps,一个带有页面主体,另一个带有头部定义。这是一个包含模板、页面和图块定义的示例,以便更好地理解。

瓷砖定义

<tiles-definitions>
  <definition name="base" template="/WEB-INF/view/templates/tileslayout.jsp">
    <put-attribute name="title" value="Held - main page"/>
    <put-attribute name="body" value=""/>
    <put-attribute name="head" value=""/>
  </definition>

  <definition name="company.edit" extends="base">
    <put-attribute name="head" value="/WEB-INF/view/company/editHeader.jsp"></put-attribute>
    <put-attribute name="body" value="/WEB-INF/view/company/edit.jsp"></put-attribute>
  </definition>

</tiles-definitions>

模板:

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> 
<html>
<head>
 -- css and scripts --
 <tiles:insertAttribute name="head"  ignore="true"/>
<!--  <decorator:head /> -->
</head>

<body>

--- menu definition ---

<div class="container-fluid">
    <tiles:insertAttribute name="body"/>
<!--   <decorator:body/> -->
</div>
<hr/>      
<footer>
    -----
</footer>

</body>
</html>

公司页面

<div class="container">
-- the page html code
</div>

总公司页面

<meta name="menu" content="company" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>
.error {
    color: red;
}
</style>
<script type="text/javascript">
    $(document).ready(function() {
        $('#name').focus();
    });
</script>

有时头部可能更复杂。

生成的 html 没问题。但我不喜欢为应该简单的东西定义两个 jps。

我做错了什么?

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: spring-mvc tiles spring-webflow tiles2 apache-tiles


    【解决方案1】:

    你所拥有的是正确的。 Sitemesh 使用的装饰模式可以解决这个问题,而 Tiles 使用的组合则不能。但是,我不会说这很令人担忧。

    组合是概念上更简单的策略,并且资源密集度较低。很高兴您正在学习 Tiles,这两个系统不是排他性的,可以是互补的。

    Tiles 是将您的页面分解为图块。您所拥有的与当前允许的瓷砖一样好。您已经发现在头部有重新出现的脚本,因此已将其拼贴在一起。尽管它不像您建议的那样最小,但如果您将所有站点功能放入单个脚本文件中,加载将需要很短的时间,但这样做之后不会因为缓存而产生开销。

    如果安全是一个问题(即您的应用程序中有不同的安全级别,并且不想通过公开他们的 JS 来放弃高级用户的能力),那么您可以让瓦片属性使用 EL定义要引入的瓦片。为此,请使用瓦片版本 2.2.2 并使用瓦片侦听器“org.apache.tiles.extras.complete.CompleteAutoloadTilesListener”,这将允许在瓷砖定义。下面将展示 wldcards 如何大大减少定义的大小:

    您的第二个定义“company.edit”如果您有多家公司,并且有多个动词,那么您可以改写以下定义:

    <definition name="*.*" extends="base">
      <put-attribute name="head" value="/WEB-INF/view/{1}/{2}Header.jsp"></put-attribute>
      <put-attribute name="body" value="/WEB-INF/view/{1}/{2}.jsp"></put-attribute>
    </definition>
    

    现在您可以简单地在 /WEB-INF/view/ 下创建一个又一个公司,以及 editHeader、viewHeader 等。

    如果您升级到 2.2.2 并使用“org.apache.tiles.extras.complete.CompleteAutoloadTilesListener”,因为您需要编写多种解释表达式的方式:

    <definition name="WILDCARD:*.*" extends="base">
      <put-attribute name="head" value="/WEB-INF/view/{1}/{2}Header.jsp"></put-attribute>
      <put-attribute name="body" value="/WEB-INF/view/{1}/{2}.jsp"></put-attribute>
    </definition>
    

    如果您决定将特定安全级别的所有 JS 放入一个磁贴中,您可能会说:

    <put-attribute name="head" value="/WEB-INF/view/{1}/OGNL:'session.securityLevel'+'.jsp'"></put-attribute>
    

    OGNL 是默认的 Struts2 表达式语言,在您的情况下,您将使用适当的 EL 或 MVEL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多