首页 > 代码库 > 生成静态页技术
生成静态页技术
生成静态页技术
概要:
1、什么是生成静态页技术? 答:互联网上流行的做法是将数据源代码写入数据库再从数据库读取生成静态面,这样无形间就加大了数据库。将现有的ASP页直接生成静态页,将会节省很多。
2、为什么要生成静态页以及好处? 答:一、加快页面打开浏览速度,静态页面无需连接数据库打开速度较动态页面有明
显提高;
二、有利于搜索引擎优化SEO,Baidu、Google都会优先收录静态页面,不仅被收录的快还收录的全;
三、减轻服务器负担,浏览网页无需调用系统数据库;
四、网站更安全,HTML页面不会受Asp相关漏洞的影响;
观看一下大一点的网站基本全是静态页面,而且可以减少攻击,防sql注入。数据库出错时,不影响网站正常访问。
五、生成html文章虽操作上麻烦些,程序上繁杂些,但为了更利于搜索,为了速度更快些,更安全,这些牺牲还是值得的。
3、 生成静态页与URL重写的区别和联系? 答:静态化:就是在你的服务器中实实在在存在html页面,比如你站点有100篇文章,那么就有100个html文件与之对应。
伪静态:就是在外界(用户、SE等)看来你的站点貌似是静态的,但实际上是你的服务器通过某种技术,将一些动态的数据以静态url的方式展现了出来。比如外界看来“cn-1-2.html”实际上在你服务器内部会被转义为“news.aspx?lan=cn&class=1&id=2”这样类似的形式,而在你的服务器上,也只有news.aspx这么一个文件。
至于URL重写,这个只是伪静态技术的其中一种方法,它也是被广泛接受和比较正统的做法,例如在Asp.Net中就可以非常方便的以编码和配置的方式实现。
正文:实现页面静态化的基本步骤
一、建立文件夹以及相应页面.
1、在网站根目录下,建立一个html文件夹,用于存放你生成的html页面,以及相应的样式和模板页.
如图1-1所示:
图1-1
2、其他文件夹简介: ①、App_Themes以及scripts文件夹中存放你所需用来生成静态页的.css以及.js文件。
注:如果生成静态页不走形,此处可不用这两个文件夹。
②、GetPage文件夹用来存放生成的静态页面(.html)。
③、master 文件夹用来存放生成静态页的模板页面(.html)。 注:里面没有内容,是一个空的html页面,详情参见源代码。
如图1-2所示:
图1-2
④、为解决路径问题,可以为需要生成静态页的aspx页面统一建立一个文件夹。
如图1-3所示:
图1-3
⑤、CreateHtml.aspx页面用于执行相应代码,详情参见源代码。
二、配置web-config文件
在<compilation>中添加如下代码:
<assemblies>
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</assemblies>
<buildProviders>
<add extension=".html" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders>
作用是:没有为扩展名“.html”注册的生成提供程序。可以在 machine.config 或 web.config 中的 <compilation><buildProviders> 节注册一个。请确保所注册的提供程序具有包含值“Web”或“All”的 BuildProviderAppliesToAttribute 特性。这样才能使生成的.html文件可以再浏览器中可读。
三、实例代码详解($为重要部分)
壹、选择你要生成静态页的aspx页面路径,并建立数组,遍历出每一个URL,为下一步做准备。(详情参见源代码)
如图3-1所示
图3-1
贰、首先先运行第一个页面。
一、截取并修改第一个页面URL的名字(GetName),如:newslist.aspx--> newslist.html
如图3-2所示:
如图3-2
二、生成或替换子页面(ReplaceChild)。
如图3-3所示:
图3-3
I:首先先运行整个页面,获取这个页面的全部代码(getAllPage)。
如图3-4所示:
如图3-4
注:此处是易错点,应当确保URL的正确性。
II:筛选出来静态页对应模板页中的内容(GetContent)。
如图3-5所示:
图3-5
注:此处有关于正则表达式的,读者多注意。
$III:生成静态页(WriteFile)
III-1:页面代码预处理。
①、读取文件,并将该文件的内容以string的形式返回.
②、替换内容, 这时,模板文件已经读入到名称为str的变量中了.
③、套用模板页时,将变化的引用css路径替换为原来的路径.
如图3-6所示:
图3-6
注:此处有try-catch-finally用法,多注意其执行顺序呢。
$III-2:替换页面链接,包括(页面模板页、页面左侧导航页、以及子页面中的全部URL路径)(UpdateURL)。
主要分为以下三个部分:
第一部分:替换模板中连接。
1、在上文的筛选出的全部页面代码中进行预筛选,在模板页中标记相应的字符串,作为起始和结尾标记符(GetContent),如<!--MasterLinkStart-->";
2、在设定的开始、结尾字符中。截取中间需要操作的字符(GetContent)。
3、在第二步所操作的代码区域,循环遍历出,模板页中连接的个数
(GetContentList);
4、在筛选出来的模板连接中,找到<a>标签,用(GetName)方法将模板页中的连接重命名成.html格式。
5、循环结束后,原来的代码中模板页的连接,已经全部替换成了以页面名+.html结尾的新名称,如:“newslist.html”。
操作代码如下图3-7所示:
图3-7
第二部分:替换内容目录中连接
注:步骤、原理同上。
如图3-8所示:
图3-8
$第三部分:查找并替换子链接、分页连接以及生成该子链接的子页面(.html)。(核心之处)
1、 步骤同上,设置你所要替换子链接的开始和结尾字符串标记,如本例中的txtstart = "<div class=\"ruili_pagecon\">";
2、 步骤同上。
3、 步骤同上,同时,由于涉及到分页的问题,所以此处增加一个 newMC(),起到一个移除集合中是否有page=1的内容,并返回集合的作用(详情参见源代码)。
4、 此处对链接进行重命名与以上不同。是通过手动改动,而不是统一的通过判断某一特定字符截取,因为子链接中考虑到了包含参数的重命名,读者可以根据自己的链接的需要进行改动,因为用的是字符串的Replace方法,所以用户可以考虑出错,只要知道自己源代码的样式,以及目标代码样式就行。如本例中显示的:
newsdetails.aspx?NewsType=1&NewsID=2替换为newsdetails-1-2.html
如图3-9所示:
图3-9
注: ①、此处是更改页面中子链接以及分页的链接形式(如果有的话)。
②、如果有分页链接,请注意其形式,因为有的分页形式不是通过<a>标签的,请注意你所生成的源代码中分页链接的形式,如果不是<a>标签,则改动相应代码,否则无法进行分页。
5、 将该子链接重命名之后,重新获取修改后的整个代码,你将会发现,现在全部的模板页,左侧目录页,以及该条子链接已经修改,接下来就是生成这个子链接的整个子页面了。
6、 此处有一个if判断,如果是包含page分页的,执行‘get’的ReplaceChild(),并将多个分页URL通过‘|’字符,连成字符串geturl,为下文做准备;否则执行‘replace’的ReplaceChild()。
如图3-10所示:
图3-10
7、获取最新的网页代码内容,执行ReplaceChild()函数,if判断,‘replace’执行生成静态页(WriteFile);‘get’执行pager生成静态页(ChildWriteFile)。
注:两个生成静态页函数几乎一致,只不过就是pager生成静态页不用再执行代码的UpdateURL(),因为子页面中以无其他的链接。此处虽然可以合并,都用WriteFile(),但是,编者认为,此处少去了无谓的遍历和循环,从而提高了运行速率,也条理清晰,所以我还是比较支持分开生成静态页。
8、完成第一个子页面的生成,接下来返回第3步,继续重写以及生成下一个子链接。
$III-3:直到该页面的子链接以及分页链接全部重写和生成。
如图3-11所示:
图3-11
三、将第一个页面newslist.aspx中的全部链接全部重写,子链接以及分页链接的页面也已经全部生成完成,接着,将此页面生成静态页。
注:此时已经生成的html页面有,一个newslist.html,还有子链接的html页面,以及分页的html页面。
四、接下来将$III-2:的第三部分的第6步中的geturl,进行判断,将‘|’分割开,建立数组,遍历各个分页页面,并进行页面的重命名。
如图3-12所示:
注:此处的分页的重命名一定要与页面中的分页链接重命名一致,否则出错。
五、重复一、二、三、四步骤,直到第一个页面newslist.aspx全部生成完,此时Gethtml文件夹下已经包含了,newslist.html,其中各个子链接html,还有分页的html,以及分页中的全部子链接html。到此,newslist.aspx页面已经完成了全部的生成静态化工作。
叁:遍历剩余要生成的页面,如本例中的,path + "recruitment.aspx", path + "index.aspx", path + "about.aspx"······等等
肆:完成。
伍:参考文献:
1、 asp.net生成静态页 - mathew的专栏 - 博客频道 - CSDN.NET
2、 Asp.NET生成静态页面并分页代码
3、 谈用伪静态(url重写)的方法替代生成静态页面的好处 - A5站长网
生成静态页技术