DLOG4J的前身是采用Struts的Tiles组件来控制页面的统一布局的。但是运用中却无法动态的修改,由此而放弃了Tiles而改用现有的这种方式。
DLOG4J把页面切分成一个个的小模块,也就是一个小JSP页面,例如日历、最新评论、网站链接等都是独立运行的小页面。这些页面是由一个静态超文本文件(/WEB-INF/template/html_layout.html)来控制其在整个页面上的位置。通过为每个小JSP页面定义一个对应的名称,例如 $LINK$ 表示为网站链接(变量和页面的对应关系在/WEB-INF/layout.xml中定义)。在html_layout.html中只要把这些变量按照一定的逻辑关系组合成一个完整的HTML信息就可以。下面是一个样本布局定义文件的内容,其中粗体部分就是脚本变量:
|
<html> |
前面就是DLOG4J的布局定义,那么这个布局定义文件是怎么起作用的呢?
首先,大家注意到了DLOG4J使用的是*.jspe的文件后缀,这个后缀是由我自定义的一个Servlet(EmbedPageServlet)负责处理的。该Servlet会从接收到的请求中解析出所对应的页面文件,例如 main.jspe -> main.jsp,而DLOG4J默认到/WEB-INF/jsp下读取对应main.jsp文件。当解析出main.jsp后并将该文件名作为一个参数传递给/WEB-INF/jsp/layout/html_container.jsp页面,也就相当于执行html_container.jsp?main=main.jsp,我们再来看看html_container.jsp的内容:
|
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <bean:parameter id="main" name="main" value="main.jsp"/> <dlog4j:layout id="html" mainPage="main" baseDir="/WEB-INF/jsp/"> |
该页面读取main参数并把它赋值给layout标签,这是一个继承BodyTagSupport的标签,它可以访问并夹在标签体的内容。该标签库加载html_layout.html的内容并将其中脚本变量替换成真正的页面内容并输出新的内容,这样我们在页面上就看到整个页面被展示出来。
另外layout标签在得到main参数所对应的页面时会用这个页面来替换布局定义文件中的$BODY$变量,也就是我们看到的,页面变化时周围的内容是不变的,只有中间一部分也就是这里的$BODY$在变化。也就相当于BODY页面并不需要去包含其周边的小页面,而是由layout标签进行统一的处理,大大的简化页面的代码量。
在DLOG4J后台管理的模板管理中可以直接对html_layout.html进行更改调整,提交后新的布局效果会立即生效,同时layout标签会对html_layout.html的内容以及解析后的结果进行缓存,当该文件内容未发生变化时无需重新解析,保证了处理的效率。
当然这种做法也有一些弊病,就是所有的页面都是使用相同的布局,无法根据需要为不同的页面设置不同的布局,不过相信在此基础上还是比较容易扩展。
另外为了支持WAP访问,DLOG4J新增了一个*.jspw的页面扩展,该请求同样对应不同名字(jspw)的同一个Servlet,也就是EmbedPageServlet,然后使用了另外一个适合WAP的布局定义文件wml_layout.html。从这点也证明EmbedPageServlet本身的设计具备足够的扩展性。
以上是对DLOG4J在布局处理上的一些简单的介绍,希望大家多多提出您的宝贵意见或者对这种方式的优缺点进行讨论。
心情: 一般