全自动静态网页生成器(二)——html文件解析续

我对现在的解析html的算法还是比较满意的。现阶段,经过我的一些测试,添加了对BR,IUPUT,IMG,META,SCRIPT,注释等特殊html语法的支持。对于完全符合html语法规范的页面,效果是令人满意的。不足之处是缺乏对错误的包容能力,对不符合html语法的页面可能解析出错或者异常。如果要把它做成完善的html解析器,我认为必须实现一个优先级算法,提供错误的包容能力。不过我想,这个问题相当复杂,暂时不能很好的解决。现在,我决定采取另外一种折中的方式,即只解析自定义的控件,而不处理普通的html控件。以现在的算法,可以很轻易的实现这个功能。

个人觉得,使用用户控件,然后在控件输出的时候截获render应该是可取的。但个人感觉这种方式实际使用负载,不够灵活。我个人更倾向于实现一个轻量级的、易控的静态页面生成类库,可以轻松自由的进行自定义和扩展。对于大多数网站来说,首页和分类页面的请求都是很频繁的,并且内容也需要经常性的更新,使用Asp.Net的缓存机制是一个很好的选择;但是对于网站的内容页,如新闻或者软件下载的内容页面,相对来说请求频率要低得多,动态生成或者使用缓存都是不合适的。这种情况最好的选择是生成静态页面,然后保存在硬盘上。另外,对于实时性要求不高的首页或者分类页,也可以结合shtml的include机制,将内容部分用模板的方式静态生成保存在硬盘上。

正如本文开头所说,由于联系暑期实习单位的事情,最近几天都暂停开发了。在这里我还是先将上一篇文章没说完的继续说完。

整个解析模块主要由三个类来构成:StaticControlFactory、ParseStatusManager和StaticBaseControl构成的。其中StaticControlFactory主要负责对模板进行字符分析处理和控件的处理;ParseStatusManager主要负责对控件解析状态进行处理,以及对StaticControlFactory发出处理命令;StaticBaseControl是实体类,保存相关结果。

代码结构自认为还是很清晰的,并且有很多注释,我就不详细解释了,主要说明几个关键的地方。StaticControlFactory中使用了堆栈来保存控件的层次结构。每当创建了新的控件,就将新控件加入到当前控件的子控件集合中,然后将当前控件推入堆栈,新控件成为当前控件。当新控件解析完毕后则反向操作。ParseStatusManager的状态管理也采用了相似的方式,只是没有前者的层次结构。每次StaticControlFactory读取到边界字符时,就调用ParseStatusManager对象的ChangeStatus方法,实现相应的状态转化。ParseStatusManager对StaticControlFactory的操作,我使用了代理结合Command模式的方式来实现。这种方式最大的好处是ParseStatusManager不需要维护StaticControlFactory的一大堆方法签名,只需要传入合适的命令就可以了。如果需要在处理状态转换的时候,需要增加新的处理,只需要使StaticControlFactory增加对一个新的命令的支持就可以了。

为了增加对不符合<flag name=value>body</flag>形式的标签,包括img、br之类可以无结尾或使用/>简短结束标志的标签的支持,对StaticControlFactory增加了几个方法,ReadNextWord用以获取控件开始标签后的下一个单词,以判断当前标签是否是定义的特殊标签,ProcessForScriptBlock用以专门处理Script模块。如果希望将类库改成指处理我们定义的特殊标签,就可以在每次读到控件开始标记的时候使用ReadNextWord读取控件类型,在判断正确后才开始控件的解析操作;对每次读到控件结束标记时也进行相似操作。

现在的方案实际上是我的第二个方案。第一个方案使用了递归,思路不是很清晰,调试起来相当麻烦,现在的方案要清晰多了。对于数据绑定,在我的第一个方案里已经部分实现了,主要采用了遍历加反射的方式。遗憾的是还只支持了对对象数组这种数据源的支持,主要原因是我现在的项目使用了petshop3的结构,以数据实体的方式传递数据,并且没有实现repeate之类控件嵌套形式下的绑定。不过预计这两个问题都比较简单,可以比较快的实现。我会尽快实现一个可使用的版本发布出来。

博客:http://homer.cnblogs.com/

时间: 2024-08-31 12:56:20

全自动静态网页生成器(二)——html文件解析续的相关文章

全自动静态网页生成器(三)——发布第一个可用版本

花费了一天半的时间,终于完成了第一个可用版本.和以前的设想有几点不同: 1.标签格式 参考了大家的意见之后,标签的格式改为:<homer:tag name=value>body</homer:tag>的形式. 2.模版解析方式 以前考虑的方式是解析所有的页面标签(包括html和自定义标签)后,再从中找出自定义标签进行处理.这样的处理方式主要是考虑到以后增加标签的话,无须修改解析模版的方式.现在看来,这是不必要的,无端增加复杂度.现在的方式是对html标签不理睬,而只解析自定义标签.

全自动静态网页生成器之缘起及html文件解析

见过太多的大网站都已使用了静态网页.从性能上考虑,这当然是这类网站不二选择.虽然一直以来都很希望能够实现这个功能,但是毕竟没有很急切的需求,所以一直搁置下来.终于,现在的一个项目决定使用静态网页生成技术,我也狠下心来解决这个问题. 曾经思考过很多种方案,但是一一否决了.一种方案是使用XML方案,从CSDN剽窃过来的思路,用XML文件保存数据,然后定义一个XSL,在客户端解析.这种方案最大的缺点是无法处理复杂的页面布局.设想一个很复杂的页面,你很难定义出合适的XSL,而且在客户端的开销也可能不被接

html静态网页引入html 文件的问题

问题描述 html静态网页引入html 文件的问题 html 静态网页引入另一个html 文件如何实现跟include一样的效果,不想使用iframe ,哪位大牛指导一下新人,感谢 解决方案 用object标签 用object标签 <object data="xxxx.htm"></object> 解决方案二: 如果这两个html都放在服务器上,可以用jquery,读取第二个,装入第一个文件的某个节点http://www.th7.cn/web/html-css/

PHP生成静态网页的方法

PHP生成静态网页的方法 看到很多朋友在各个地方发帖问PHP生成静态文章系统的方法,以前曾做过这样一个系统,遂谈些看法,以供各位参考.好了,我们先回顾一些基本的概念. 一,PHP脚本与动态页面. PHP脚本是一种服务器端脚本程序,可通过嵌入等方法与HTML文件混合,也可以类,函数封装等形式,以模板的方式对用户请求进行处理.无论以何种方式,它的基本原理是这样的.由客户端提出请求,请求某一页面 -----> WEB服务器引入指定相应脚本进行处理 -----> 脚本被载入服务器 ----->

用libTemplate实现静态网页的生成

静态|网页 作者:iwind 原来在dev-club发表的一篇文章,将怎么用模板处理程序PHPlib 中的template.inc实现静态网页的生成,呵呵,居然被列入精华,并被多个网站转载,想来这是荣幸.其实网上这方面的东西很多了,我上此发布的所谓IAMS( iwind 文章管理系统),里面也有,有心人可以看一下.下面我只是简要在总结一次. 现在一般说生成静态网页的方法有三种,一个是配置服务器,大家可以到http://www.devarticles.com/c/b/PHP/ 去找找看,对于这个很

从数据库独处内容后生成静态网页

问题描述 从数据库独处内容后生成静态网页 $p.title p.title是数据库里面的一条记录,这样网页显示就是动态的, 如果我想将这个网页内容保存成一个.html文件,以后不连数据库就可以打开这个网页,p.title是具体的文字.要怎么做呀? 解决方案 你这就是要做静态缓存啦,当文章第一次被访问的时候是去数据库里面读数据,然后生成一个.html的静态文件,第二次直接拿.html的文件显示就行了,干嘛还要p.title? 解决方案二: html页面也留一个字段给title,然后title从数据

用libTemplate实现静态网页的生成_php基础

作者:iwind 原来在dev-club发表的一篇文章,将怎么用模板处理程序PHPlib 中的template.inc实现静态网页的生成,呵呵,居然被列入精华,并被多个网站转载,想来这是荣幸.其实网上这方面的东西很多了,我上此发布的所谓IAMS( iwind 文章管理系统),里面也有,有心人可以看一下.下面我只是简要在总结一次. 现在一般说生成静态网页的方法有三种,一个是配置服务器,大家可以到http://www.devarticles.com/c/b/PHP/ 去找找看,对于这个很多地方都有的

javaweb-求 图书管理系统静态网页

问题描述 求 图书管理系统静态网页 现在在做一个WEB版的图书管理系统 求 大神 给发一个图书管理系统的 纯的静态网页 解决方案 那样下载到的网页 没有CSS样式的 有一些图片也下不下来啊 解决方案二: 纯静态网页这个太容易了,随便登录哪个图书馆的网站,然后用浏览器自带的网页另存为功能就可以得到了. 解决方案三: 选择"保存所有内容"可以下载包括图片 css 脚本在内的全部文件. 解决方案四: 大神 你有这一类的静态网页吗? 我网页设计没怎么学过 不太会找

有用freemaker生成静态网页的案例教程吗?求教。

问题描述 有用freemaker生成静态网页的案例教程吗?求教. 解决方案 public boolean createDoc(Map dataMap, String outUrl, String modelUrl,String modelName) {// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法.可以从servlet,classpath,数据库装载,configuration.setClassForTemplateLoading(this.getClass(), mod