1

我正在使用 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。

我做错了什么?

有一个更好的方法吗?

4

1 回答 1

2

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

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

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

如果安全是一个问题(即您的应用程序中有不同的安全级别,并且不想通过公开他们的 JS 来放弃高级用户甚至能够做到的事情),那么您可以让瓦片属性使用 EL 来定义哪些瓦片引入。为此,请使用 2.2.2 版图块并使用图块侦听器“org.apache.tiles.extras.complete.CompleteAutoloadTilesListener”,这将允许在图块定义中使用通配符、EL、OGNL 和 MVEL。下面将展示 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。

于 2012-04-18T04:01:26.430 回答