我正在使用spring-mvc和spring-webflow开发自己的项目。在阅读了一些关于spring webflow和ajax的文章之后,我明白了更好的选择是使用Apache Tiles来渲染视图。
在Sitemesh中,我使用了标签调用头()。模板中使用的标记允许渲染在生成的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。
我做错了什么?
有更好的方法吗?
答案 0 :(得分:2)
你拥有的是正确的。 Sitemesh使用的装饰图案可以解决这个问题,而Tiles使用的构图则不能。但是,我不会说这是一个令人担忧的问题。
组合是概念上更简单的策略,而且资源密集程度更低。你学习Tiles很好,这两个系统不是独家的,可以是免费的。
Tiles是将您的网页分解为磁贴。你拥有的东西和目前允许的瓷砖一样好。你已经发现在头部有重复发生的脚本,所以已经制作了它的图块。虽然它不像你提出的那样最小,但是如果你将所有站点功能放在一个脚本文件中,它将需要很短的时间来加载,但是这样做之后就不会因缓存而产生任何开销。
如果安全性存在问题(即您的应用程序中有不同的安全级别,并且不希望通过公开他们的JS来泄露高级用户甚至能够提供的内容)那么您可以使用tile属性使用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的情况下。