动态网站中静态页面的管理与维护
内容摘要:
静态网页和动态网页各有特点,网站采用动态网页还是静态网页主要取决于网站的功能需求和网站内容的多少,如果网站功能比较简单,内容更新量不是很大,采用纯静态网页的方式会更简单,反之一般要采用动态网页技术来实现。
静态网页是网站建设的基础,静态网页和动态网页之间也并不矛盾,为了网站适应搜索引擎检索的需要,即使采用动态网站技术,也可以将网页内容转化为静态网页发布。
动态网站也可以采用静动结合的原则,适合采用动态网页的地方用动态网页,如果有必要使用静态网页,则可以考虑用静态网页的方法来实现,在同一个网站上,动态网页内容和静态网页内容同时存在也是很常见的事情。
一、动态网页与静态网页
什么是动态网页?动态网页有哪些特点?
动态网页是与静态网页相对应的,也就是说,网页URL的后缀不是.htm、.html、.shtml、.xml等静态网页的常见形式,而是以.asp、.jsp、.php、.perl、.cgi等形式为后缀,并且在动态网页网址中有一个标志性的符号——“?”。
如页面网址为:http://www.webjx.com/list.php?typeid=3
这就是一个典型的动态网页URL形式。
这里说的动态网页,与网页上的各种动画、滚动字幕等视觉上的“动态效果”没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,采用动态网站技术生成的网页都称为动态网页。
从网站浏览者的角度来看,无论是动态网页还是静态网页,都可以展示基本的文字和图片信息,但从网站开发、管理、维护的角度来看就有很大的差别。
我们将动态网页的一般特点简要归纳如下:
(1)动态网页以数据库技术为基础,可以大大降低网站维护的工作量;
(2)采用动态网页技术的网站可以实现更多的功能,如用户注册、用户登录、在线调查、用户管理、订单管理等等;
(3)动态网页实际上并不是独立存在于服务器上的网页文件,只有当用户请求时服务器才返回一个完整的网页;
(4)动态网页中的“?”对搜索引擎检索存在一定的问题,搜索引擎一般不可能从一个网站的数据库中访问全部网页,或者出于技术方面的考虑,搜索蜘蛛不去抓取网址中“?”后面的内容,因此采用动态网页的网站在进行搜索引擎推广时需要做一定的技术处理才能适应搜索引擎的要求。
(5)网站由于其具有交互性,所以网站存在很大的安全隐患,如果开发设计人员在编程过程中安全性没有考虑到位,网站是很容易被黑客入侵的。
(6)动态网站的页面上的信息都必须从数据库中读取,每打开一个页面就读取数据库一次,如果访问网站的人数很多,这会对服务器增加很大的荷载,从而影响这个网站的运行速度。
什么是静态网页?静态网页有哪些特点?
在网站设计中,纯粹HTML格式的网页通常被称为“静态网页”,早期的网站一般都是由静态网页制作的。
静态网页的网址形式通常为:http://www.webjx.com/htmldata/2005-06-17/1118962699.html
也就是以.htm、.html、.shtml、.xml等为后后缀的。在HTML格式的网页上,也可以出现各种动态的效果,如.GIF格式的动画、FLASH、滚动字母等,这些“动态效果”只是视觉上的,与下面将要介绍的动态网页是不同的概念。
我们将静态网页的特点简要归纳如下:
(1)静态网页每个网页都有一个固定的URL,且网页URL以.htm、.html、.shtml等常见形式为后缀,而不含有“?”;
(2)网页内容一经发布到网站服务器上,无论是否有用户访问,每个静态网页的内容都是保存在网站服务器上的,也就是说,静态网页是实实在在保存在服务器上的文件,每个网页都是一个独立的文件;
(3)静态网页的内容相对稳定,因此容易被搜索引擎检索;
(4)静态网页没有数据库的支持,在网站制作和维护方面工作量较大,因此当网站信息量很大时完全依靠静态网页制作方式比较困难;
(5)静态网页的交互性交叉,在功能方面有较大的限制。
以上分别介绍了动态网页和静态网页的概念及各自的特点。由上述信息可知,当网站规模较小,网站内容更新不频繁时,用静态页面是完全合适的。但是当网站内容更新频繁时,使用静态页面不便于更新,这时使用动态页面就会节省很多的精力。不过,动态页面也有自己的不足,如果网站访问量非常大,程序需要处理的数据量就非常大,容易造成网站不稳定甚至瘫痪。针对上述问题,有一种解决方案,就是使用“动静结合”的方式来管理网站的信息。所谓“动静结合”,就是发布的内容还是采用后台程序录入,录入完成后,后台程序将录入的信息根据选定的模板自动的制作成静态网页保存在服务器上,而且这些静态网页的管理与维护也由后台程序统一进行,不需要人为干预。这样避免了手工制作静态页面的大工作量,又不失动态页面的灵活性。
二、动态页面静态化的实际问题
以新闻发布系统为例,在实际中有两种情况需要分析。
第一种,信息发布以后,内容变化不大的页面(如:新闻显示页面)。这类页面由于发布以后变动不大,可完全使用后台进行管理。具体的操作有:添加文章时生成静态页面,修改文章、管理评论时更新静态页面,删除文章时删除静态页面。由于文章链接直接指向静态页面,而且用户浏览是不需要经过程序的处理,所以浏览速度是最快的。但是缺点也很明显,静态页生成后不能自动更新,需要管理员在后台进行手工操作,在改版时尤其不便。
第二种,信息发布以后,页面内容变化会变化很大(如:新闻列表页面)。此类页面随发布信息的添加、修改、删除等操作而变化,比较频繁。添加了一篇文章,此文章所在分类及其所有父分类的分类列表页面都需要更新,此过程对服务器性能影响很大,而且生成的静态页面也不一定有机会被访问。为了解决这个问题,可以让前台的一个动态页面参与静态页面的管理和维护。前台工作流程如下:所有分类页面的连接均指向一个动态页面(如:class.aspx?classid=123&page=1,classid是该分类的id,page是页码),该页面检查所对应的静态页面是否存在或者是否需要更新,若不存在或需要更新,则进行更新,之后再转向对应的静态页面。后台的设计比较简单,只要在文章被添加、修改、删除时将该分类及父分类的静态页面全部删除就行。这样做的好处是可以避免生成没有被访问的页面,减轻了服务器的负担,有可以定期自动更新页面;另一方面,前台还是靠程序来维护,当访问量大时,对服务器来说,还是一项比较大的负担。
三、具体设计
首先,以asp.net技术和c#语言说明生成静态页面的方法。使用HttpWebRequest类就可很容易的将动态网页静态化。程序代码如下:
public bool string MakeStatic(string sUrl,string htmlPath)
{
try
{
string sResponse = null;
//发送http get请求sUrl
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sUrl);
Stream stream = request.GetResponse().GetResponseStream();
using(StreamReader reader = new StreamReader(stream,Encoding.Default))
{
//读取服务器回应
sResponse = reader.ReadToEnd();
reader.Close();
}
using(StreamWriter writer = new StreamWriter(htmlPath,false,Encoding.Default))
{
//写入静态页面
writer.Write(txt);
writer.Flush();
writer.Close();
}
}
catch
{
//失败
return(false);
}
//成功
return(true);
}
MakeStatic函数接收两个参数,sUrl为要浏览的页面,htmlPath为要保存的静态文件。该函数模拟浏览器,向服务器发出http get命令,请求地址sUrl,并接收服务器返回的html代码,最后将这些html代码保存到htmlPath文件中,就完成了静态页面的制作,非常方便。
其次,针对前面两种情况,分别给出具体的解决方法。
第一种情况,新闻显示页面。
静态页面的生成用上面给出的函数可以轻易实现。不过还有几个实际的问题需要解决。生成静态页面以后,内容就固定了,要解决广告、点击量和评论的自动更新,这些内容就不能被放进静态页面中去,而是使用框架或脚本包含进静态页面,这样个部分互不影响,更新起来更方便。
一、广告的更新。直接用框架包含进一个含有广告的页面(如:ad.html)就可以圆满的解决,更换广告时只需要更新ad.html,所有静态页面的内容就都随着更新了。框架的代码:
二、点击量的更新。思路跟广告一样,单独有一个页面来统计点击量(如:hits.aspx),可以使用框架来包含进静态页面(代码同上),也可使用脚本方式,代码为:
代码中给出了名为articleid的参数,该参数指定了要被更新点击量的文章id,hits.aspx根据articleid参数更新该文章的点击量并输出显示。
三、评论的更新。评论的更新过程比较复杂,因为添加评论是一个交互的过程,静态页面自身根本不可能完成这一操作。解决方法是把添加评论的工作交给另一个页面(如:remark.aspx)来完成。具体过程为:在静态页面上用form给remark.aspx传递评论的内容,remark.aspx接收评论内容,添加评论,更新文章的静态页面,最后再重定向到静态页面。这样就完成了评论的添加。
form处的代码:
评论内容:
remark.aspx中相关操作的代码:
protected override void OnLoad(EventArgs e)
{
base.OnLoad (e);
int nArticleID = int.MinValue;//文章id
int nClassID = int.MinValue;//分类id
try
{
//获取传入参数
nArticleID = int.Parse(this.Request.QueryString["articleid"]);
nClassID = int.Parse(this.Request.QueryString["classid"]);
}
catch
{
}
//检查有效性
if(nArticleID < 1 || nClassID < 1)
{
this.Response.Redirect("/error.html",true);
}
string sRemarkBody = this.Request.Params["remarkbody"];
//格式:/show.aspx?id=456&cid=123
string sFrom = string.Concat("/show.aspx?id=",nArticleID,"&cid=nClassID);
//格式:/news/123/456.html
string sTo = string.Concat("/news/",nClassID,"/",nArticleID,".html");
if(sRemarkBody != null && sRemarkBody.Length > 0)
{
//添加评论
InsertRemark(nArticleID);
//生成静态页面
MakeStatic(sFrom,this.MapPath(sTo));
}
//转向静态页面
this.Response.Redirect(sTo,true);
}
这样处理的静态页面在普通浏览时与其它的静态页面完全一样,只是在发评论时对待更新评论的程序,整体的招待速度还是很快的。
第二种情况,新闻分类列表页面。此类页面在管理新闻的时候变化会非常大,即使采用后台管理也非常的不便。这就需要一些程序来帮助管理员管理这些页面。程序思路在前面已经提过,在此给出能够实际应用的程序代码。
protected override void OnLoad(EventArgs e)
{
base.OnLoad (e);
int nClassId = int.MinValue;//分类id
int nPage = int.MinValue;//页码
try
{
//获取传入参数
nClassID = int.Parse(this.Request.QueryString("classid"));
nPage = int.Parse(this.Request.QueryString("page");
}
catch
{
}
//检查有效性
if(nClassID < 1)
{
this.Response.Redirect("/error.html",true);
}
else if(nPage < 1)
{
nPage = 1;
}
//格式:/list.aspx?cid=123&page=456
string sFrom = string.Concat("/list.aspx?cid=",nClassID,"&page=",nPage);
//格式:/news/123/default456.html
string sTo = string.Concat("/news/",nClassID,"/default",((nPage==1) ? ("") : (nPage)),".html");
string sPath = this.MapPath(sTo);
if(!File.Exists(sPath))
{
//文件不存在时,创建静态页面
MakeStatic(sFrom,sTo);
}
else
{
TimeSpan ts = DateTime.Now - File.GetLastWriteTime(sPath);
if(ts.TotalDays > 1)
{
//文件已存在,但是存在时间过长,需更新
MakeStatic(sFrom,sTo);
}
}
//转向静态页面
this.Response.Redirect(sTo,true);
}
后台管理相对容易,只需要在文章管理后,将分类列表页面删除即可。当该页面被访问时list.aspx会重建该页面,这样,只在该页面首次被访问或更新时读取数据库,减小了数据库操作,提高了站点的整体性能。此方案已在青春期在线网站得到应用,效果明显。