2012-04-11 77 views
1

我正在使用spring-mvc和spring-webflow开发我自己的项目。阅读了一些关于spring webflow和ajax的文章后,我明白了更好的选择是使用Apache Tiles来渲染视图。从Sitemesh迁移到Apache Tiles

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

有什么办法可以在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。

我做错了什么?

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

回答

2

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

组成是在概念上更简单的策略,它是较少的资源密集型。这是好的,你正在学习瓷砖这两个系统不是排他性的,可以是免费的。

瓷砖是关于把你的网页分解成瓷砖。你所拥有的和瓷砖目前所允许的一样好。你发现在头脑中有剧本重新发生,所以已经制作了一片。虽然它不像执行你所提议的那么简单,但如果你把所有的网站功能放到一个单独的脚本文件中,它将需要很短的时间来加载,但是这样做之后不会因为缓存而导致开销。

如果安全性是一个问题(例如,您在应用程序中具有不同的安全级别,并且不想泄露高级用户甚至可以通过暴露他们的JS的能力),那么您可以让tile属性使用EL定义要引入哪些图块。为此,请使用tiles 2.2.2版并使用tiles listener“org.apache.tiles.extras.complete.CompleteAutoloadTilesListener”,这将允许使用通配符,EL,OGNL和MVEL瓷砖定义。以下内容将说明wldcard如何大大减少定义的大小:

您的第二个定义是“公司”。编辑:”如果你有多个企业,有多个动词,那么你可以写,而不是定义如下:

<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 /查看/以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。

+0

非常感谢。有用的信息。 – 2012-04-19 13:49:25