Tapestry在静态页面和动态内容分工方面的研究
Tapestry的一个最耀眼的功能是其绝好的模板设计思想,它能够将动态内容以极少的侵入性而展现到HTML页面上,我对其这一功能非常赞赏,如果 Tapestry能够像Spring那样把这一部分HTML模板解析功能独立出来,打成一个Tapestry-Core.jar极不妙哉?!
在工作实践当中,我发现Tapestry提供的Shell组件其实用处不大,美工人员作出的页面大多已包括HTML TITLE HEAD LINK 等标签,如果将这些删除而封装到Shell岂不多此一举?而且Shell引用CSS IMAGE的方式(Asset)比较麻烦。
所以,我建议开发组不使用Shell而直接采用原来静态页面的配置,但是Tapestry对URL进行了处理而且使用Servlet之后相对路径往往会出问题,为此提供了一个简单Base组件,在HEAD中增加一个base标签即可。
如页面头部如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>测试页面</title>
<span jwcid="base"/>
<link href="../css/menu.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="../js/menu.js"></script>
</head>
。。。。。。
Base.java:
protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle) {
BaseTagWriter baseTagWriter = new BaseTagWriter();
baseTagWriter.render(writer, cycle);
}
这样美工的增加的工作就非常非常少了,而且美工与开发人员的配合也变得很愉快了。
个人认为理想的分工效果是这样的:
整个Web应用可以以两种方式浏览,一种是浏览静态的HTML页面,另一种是浏览动态的web内容。如果想以第二种方式浏览则web.xml中增加
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
这样访问HTML页面时Tapestry会将动态内容发送给浏览器,如果想浏览静态的HTML页面,则删除这个映射即可。
这样一来,美工人员和开发人员共享同一套HTML模板文件,相互之间的干扰比较少。