http://www.javayou.com (收藏,设为首页)
当你不能再拥有时,你唯一能做的,就是让自己不要忘记 (手机请访问 http://3g.dlog.cn/javayou)

浅谈DLOG4J的布局处理方式

2005年1月16日(Sunday) 17点58分 作者: 本站原创 天气: 心情: 一般

DLOG4J的前身是采用Struts的Tiles组件来控制页面的统一布局的。但是运用中却无法动态的修改,由此而放弃了Tiles而改用现有的这种方式。

DLOG4J把页面切分成一个个的小模块,也就是一个小JSP页面,例如日历、最新评论、网站链接等都是独立运行的小页面。这些页面是由一个静态超文本文件(/WEB-INF/template/html_layout.html)来控制其在整个页面上的位置。通过为每个小JSP页面定义一个对应的名称,例如 $LINK$ 表示为网站链接(变量和页面的对应关系在/WEB-INF/layout.xml中定义)。在html_layout.html中只要把这些变量按照一定的逻辑关系组合成一个完整的HTML信息就可以。下面是一个样本布局定义文件的内容,其中粗体部分就是脚本变量:

<html>
<head>
 $HEAD$
</head>
<body topmargin="0">
<table border="0" width="768" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
 <tr>
  <td background="{ROOT}/images/main_bg.gif">
   <table border="0" width="100%" cellpadding="0" cellspacing="0">
 <tr><td align="left">$LOGO$</td><td height="100%">$BANNER$</td></tr>
   </table>
  </td>
 </tr>
 <tr><td bgcolor="#E8F0FC">$CATEGORY$</td></tr>
 <tr><td height="1" class="navline"></td></tr>
 <tr>
  <td>
   <table border="0" width="100%" cellpadding="2" cellspacing="0">   
 <tr>
  <td width="180" valign="top">
      <table border="0" width="100%" cellpadding="0" cellspacing="0"> 
       <tr><td>$LOGIN$</td></tr>
       <tr><td height="5"> </td></tr>
       <tr><td>$CALENDAR$</td></tr>
       <tr><td height="5"> </td></tr>
       <tr><td>$TOP_COMMENT$</td></tr>
       <tr><td height="5"> </td></tr>
       <tr><td>$MEMBERS$</td></tr>
       <tr><td height="5"> </td></tr>
       <tr><td>$LINKS$</td></tr>
       <tr><td height="5"> </td></tr>
       <tr><td>$BLOG$</td></tr>
       <tr><td height="5"> </td></tr>
      </table>
     </td>
     <td valign="top">
      <table border="0" width="100%"><tr><td>$BODY$</td></tr></table>
     </td>
    </tr>
   </table>
  </td>
 </tr>
 <tr><td class="bottom_line" height="1"></td></tr>
 <tr><td>$COPYRIGHT$</td></tr>
</table>
</body>
</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" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/dlog4j.tld" prefix="dlog4j" %>

<bean:parameter id="main" name="main" value="main.jsp"/>
<dlog4j:referer/><!-- 记录网站访问行为 -->

<dlog4j:layout id="html" mainPage="main" baseDir="/WEB-INF/jsp/">
<%@ include file="../../template/html_layout.html" %>
</dlog4j:layout>

该页面读取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在布局处理上的一些简单的介绍,希望大家多多提出您的宝贵意见或者对这种方式的优缺点进行讨论。

[Edit on 2005-01-18 17:20:25 By ld]
标签: DLOG4J 
评论者: 刘冬 2005-1-17 11:30 (Monday)
据报,广东的用户现在都无法访问SourceForge,但是北京的用户可以的,faint
评论者: 朵朵 2005-1-17 11:49 (Monday)
我在论坛中提问了这里问题,没有想到这么快就看到了这样的文章。谢谢。
这种布局处理方法,的确方便。而且我发现不一定“所有的页面都是使用相同的布局”,如果增加布局可以增加html_layout(1...n).html文件,这样的想法是不是使布局更灵活?
评论者: 刘冬 2005-1-17 12:06 (Monday)

其实说起布局,如果有人能在Portal的基础上实现一个BLOG,那其布局将会十分灵活,每个人都可以定义自己喜欢的风格,多好啊。

DLOG4J的最初也考虑过采用基于Jetspeed来开发,不过后来考虑到对其的把握还是不够就放弃了,今后可以考虑!

评论者: 华夏人 2005-6-28 21:57 (Tuesday)

microsoft的MSN的spaces空间就是一个portal的blog!

评论者: lanbird 2005-7-25 09:41 (Monday)
那我现在只改模板文件,能起到美化页面的作用吗?? (即 修改tml_layout.html)
评论者: 刘冬 2005-7-25 10:46 (Monday)
修改模板文件只是起到修改页面的排版,美化做不了:)
评论者: lanbird 2005-7-25 12:54 (Monday)
那末 修改css呢?? 有什么办法能做出 十分漂亮的外观呢?? 我想应该不是很难的...
姓名: 
邮箱:  {可选}
网址:  {可选} 此评论只有我和写日记的人查阅
校验码: ... <我看不清楚>
网记为您提供手机和互联网同步的个人主页,带给你不一样的体验