Java中等效的ASP.NET母版页
Java Web开发领域中的Master Pages相当于什么?我听说过Tiles,Tapestry和Velocity,但对它们一无所知。它们是否像母版页一样易于使用?
我想要设置一个模板,然后从模板派生后续页面并覆盖内容区域(类似于母版页)那样简单。
任何例子都很棒!
解决方案
回答
首先,Java中相当于ASP.Net的将是一个Web框架,例如我们提到的框架(标题,Tapestry和Velocity)。
母版页提供了根据插入到母版模板中的内容来定义页面的功能。
母版页是ASP.Net(.Net Web框架)的功能,因此我们正在寻找与Java Web框架中的母版页相似的功能。
http://tiles.apache.org/framework/tutorial/basic/pages.html给出了一些使用Tiles和JSP来实现与Java Web框架Struts类似的基本示例。在这种情况下,"母版页"功能是Struts之上的插件。
Velocity是一个通用的模板引擎,不专门用于网页,并且绝对比我们需要的复杂。 (我已经看到它用于代码生成。)
Tapestry比Tile具有更多的全功能Web堆栈,可能对我们有用。它的模板功能涉及创建一个组件,并在其中放置所有通用标记。一个示例在http://www.infoq.com/articles/tapestry5-intro。
具体取决于所选择的Java Web框架。
回答
我们还应该签出Facelets;在DeveloperWorks上有一篇很好的介绍性文章。
Facelets的<ui:insert />标记与母版页中使用的ASP.NET的<asp:ContentPlaceHolder />标记相当。它使我们可以为页面的该区域提供默认内容,但是可以将其覆盖。
要在另一个页面中填充Facelets模板,请从指向模板文件的<ui:composition />
元素开始。这大致等效于在ASP.NET页中声明MasterPageFile属性。
在<ui:composition />元素内,使用<ui:define />元素覆盖模板默认值,类似于使用<asp:Content />标签的方式。这些元素可以包含从简单字符串到JSF元素的任何类型的内容。
因此,将所有内容整合在一起...
在master.xhtml中:
<!-- HTML header content here --> <ui:insert name="AreaOne">Default content for AreaOne</ui:insert> <ui:insert name="AreaTwo">Default content for AreaTwo</ui:insert> <!-- HTML footer content here -->
在page.xhtml中:
<ui:composition template="/WEB-INF/templates/master.xhtml"> <ui:define name="AreaOne">Here is some new content</ui:define> <ui:define name="AreaTwo"> <p>Some new content here too</p> </ui:define> </ui:composition>
它将呈现为:
<!-- HTML header content here --> Here is some new content <p>Some new content here too</p> <!-- HTML footer content here -->
Facelets还具有其他一些优点,例如能够重用具有不同数据的页面组件。
(已编辑以提供更多信息。)