从上个月开始步入了新项目的开发中,项目挺复杂的.到现在我已经用了一个月的时间,想应该如何来实现这样的项目.
比方说:有几十个甚至上百个站点,这些站点结构相似,可以使用同一程序体,数据的读取是要依据指定域名中的地区部分来加载不同地区的数据来呈现各地区站点!我想像"赶集"那样的网站应该是使用这样的方法来做的吧!而这些的项目不仅仅是这些,各站点下面还有频道,站点的首页需要调用频道中的某部分列表模块.像最新的新闻呀,最热门的新闻等等.
以前做过一个信息类的网站,当时是使用的缓存来存储各站点共用的数据,如:站点的大类,小类,站点的所有地区等.当时只想到从这里减少数据库的查询,因站点中除了类别的这部分导航就只剩下列表页面跟最终的信息显示页面了.最终的信息页面使用静态生成,列表页面就没有做进一步的处理!
现在的项目使用以前的方法已不能满足要求,为了尽量减少查询, 我想以模块形式静态化生成!先看一下我的分析(在这里我只是想提升程序执行效率):
1.以往做静态的方法(可能由后台来修改静态模板,不用懂程序也可以方便的使用)
是将整个页面做静态化生成,需要写一堆的模板文件,我觉得最让我头痛的地方就是模板中的重复体部分.需要使用函数进行查询截取,然后替换这部分重复体的标签,再然后将整个替换后的重复体再放入整体的模板文件中.
2.小偷生成静态页面(不具有模板文件)
哈哈,这是我想的一种偷懒生成静态页面的方法,它生成静态页面不必我们去做那一堆堆的静态模板,当然这样的方法可能失去了后台管理模板的功能.调整页面布局等比较麻烦.先不管这些,先来说说我的想法,在这里可以使用两种方法来实现:
1) 用户访问的是动态文件
当用户访问的时候,此文件需要做一步检测,如果存在此文件的静态文件,且不符合系统设置的重新生成时间,则直接读取此静态文件,否则使用绝对URL来读取与此文件相关的所有处理查询并重新生成静态页面,不符合
2) 用户访问的是静态文件
当用户访问静态文件时,在此文件上使用AJAX调用动态文件,判断时间是否符合并生成生成此静态文件.
没有去实验,不过个人觉得应该是一个可行的方法.
3. 最小化静态(具有模板管理功能,算是对以往静态生成的改进吧,偶个人认为的哟! ^_^)
这是这段时间苦想的方法,是一个初期的想法.不足的地方请多多指教(不许丢板砖哟,那是很暴力!)
我的想法是这样的,使用XML来存储静态模板,将文件的各功能模块的HTML代码使用NAME值区分存储,看一下代码应该就能明白我大体的思路,代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <template>
- <item name="TestModule">
- <repeat>
- <data id="1"><![CDATA[<li><a href="{@AnchorPath}">{@Anchor}</a></li>]]></data>
- </repeat>
- <main>
- <![CDATA[<div id="test"><div class="testTitle"><a href="{@TitlePath}">{@Title}</a></div><ul>[@Repeat_1]</ul></div>]]>
- </main>
- </item>
- </template>
当然在这里如果出现多个重复体,我还没有进一步的思考,在这里只做一点点思想的实现,读取模板的代码:
- Dim XMLTemplate,XMLTemplatePath,TestXML,TestFSO
- XMLTemplatePath="/SysXml/XMLTemplate.xml"
- Set TestXML=New XML_Cls
- Call TestXML.OpenXmlDom(XMLTemplatePath)
- Dim TemplateRepeat,TemplateMain
- TemplateRepeat=TestXML.SSN_CNodes_CDATA_Read("//item[@name='TestModule']/repeat/data[@id=1]",0)
- TemplateMain=TestXML.SSN_CNodes_CDATA_Read("//item[@name='TestModule']/main",0)
- Call TestXML.CloseXmlDom()
- Response.Write TemplateRepeat"<br />"&TemplateMain
- Dim RepeatCode,RepeatTemp,RepeatCount,RepeatString,RepeatArr,RepeatCol,RepeatRow,RepeatRItem
- RepeatString="http://rent.cnode.cn$CRent Channel$Rhttp://tech.cnode.cn$CTech Channel$R"
- RepeatArr=Split(RepeatString,"$R")
- RepeatCount=UBound(RepeatArr)-1
- For RepeatItem=0 To RepeatCount
- RepeatCol=Split(RepeatArr(RepeatItem),"$C")
- RepeatTemp=Replace(TemplateRepeat,"{@AnchorPath}",RepeatCol(0))
- RepeatTemp=Replace(RepeatTemp,"{@Anchor}",RepeatCol(1))
- RepeatCode=RepeatCode
- Next
- XMLTemplate=Replace(TemplateMain,"{@TitlePath}","http://www.cnode.cn")
- XMLTemplate=Replace(XMLTemplate,"{@Title}","CNode List")
- XMLTemplate=Replace(XMLTemplate,"[@Repeat_1]",RepeatCode)
将生成的静态HTML代码写入XML的对就位置,代码如下:
- '>>>>>>>>此部分变量存储于各模块的配置文件中,分别为此模块执行的时间间隔(秒),此模块是否具有新的内容更新
- '系统级配置的是否允许执行模块代码生成
- Dim SystemIsBuild,ModuleSpaceTime,ModuleIsUpdate
- SystemIsBuild=True:ModuleSpaceTime=1800:ModuleIsUpdate=True
- Dim HTMLTime,HTMLCode
- If SystemIsBuild Then '允许创建则判断是否具有更新
- XMLTemplatePath="/SysStatic/yt_Rent_Index.xml"
- Call TestXML.OpenXmlDom(XMLTemplatePath)
- HTMLCode=TestXML.SSN_CNodes_CDATA_Read("//item[@name='TestModule']/code",0)
- '=====================
- 'A.数据初始化操作
- ' 新创建的模块文件并未写入相应内容,则需要进行数据的初始化写入操作
- '=====================
- If HTMLCode="" Then '如果内容不等于空直接输出数据
- Response.Write "<font color=""green"">----如果内容为空直接读取数据并更新数据写入</font><br />"
- Response.Flush()
- '读取查询的数据字符 XMLTemplate
- HTMLCode=XMLTemplate
- '执行数据创建
- Call TestXML.SSN_CNodes_TXT_Update("//item[@name='TestModule']/time",0,Now())
- Call TestXML.SSN_CNodes_CDATA_Update("//item[@name='TestModule']",1,HTMLCode)
- Call TestXML.SaveXmlDom(XMLTemplatePath)
- End If
- '=====================
- 'B.数据更新检测
- ' 读取模块配置文件中的更新状态,如有新的内容写入到数据库且满足静态重写时间,则进行数据代码的更新操作
- '=====================
- If ModuleIsUpdate Then '如果没有更新则直接读取数据
- Response.Write "<font color=""green"">----此模块已被标识为具有模块更新</font><br />"
- Response.Flush()
- HTMLTime=TestXML.SSN_CNodes_TXT_Read("//item[@name='TestModule']",0)
- If DateDiff("s",HTMLTime,Now())>ModuleSpaceTime Then
- Response.Write "<font color=""green"">----满足重写时间间隔,重新读取数据库写入数据</font><br />"
- Response.Flush()
- '读取查询的数据字符 XMLTemplate
- HTMLCode=XMLTemplate
- '执行数据创建
- Call TestXML.SSN_CNodes_TXT_Update("//item[@name='TestModule']/time",0,Now())
- Call TestXML.SSN_CNodes_CDATA_Update("//item[@name='TestModule']",1,HTMLCode)
- Call TestXML.SaveXmlDom(XMLTemplatePath)
- End If
- End If
- Else
- '读取查询的数据字符 XMLTemplate
- HTMLCode=XMLTemplate
- End If
- Response.Write "该文件的静态模板代码是:<br /><textarea rows=""6"" cols=""60"">"&HTMLCode"</textarea>"
最终生成的静态XML代码:
- <?xml version="1.0" encoding="utf-8"?>
- <statichtml>
- <item name="TestModule">
- <time>2008-9-1 16:05:13</time>
- <code><![CDATA[<div id="test"><div class="testTitle"><a href="http://www.cnode.cn">CNode List</a></div><ul><li><a href="http://rent.cnode.cn">Rent Channel</a></li><li><a href="http://tech.cnode.cn">Tech Channel</a></li></ul></div>]]></code>
- </item>
- </statichtml>
唯一让我觉得不爽的就是这些操作挺麻烦的.可以说我没得选择.到目前只想到这种方法来实现这个项目!