当前位置导航:炫浪网>>网络学院>>网页制作>>Dreamweaver教程

Dreamweaver UltraDev打造生成静态页的新闻系统

  前言
  
  “新闻系统”似乎是所有学Dreamweaver UltraDev(以下简称UD)的朋友的第一课,什么!!!我们今天又要做新闻系统!大家都会的啦!呵,今天给大家讲的是能够生成静态的*.htm页的新闻系统哦!

  所谓的静态页的新闻系统是怎么回事的呢?我们来看新浪的新闻页,地址如:http://news.sina.com.cn/c/2002-05-23/1558584195.html。这个地址怎么是*.htm结尾的呢?我们用ASP做的话,不都是好象http://news.sina.com/news.asp?ID=242553的吗?难道新浪的新闻都是手动添加的吗?”一位论坛中朋友不禁问道。答案当然不是(如果是这样的话,新浪的后台管理人员打字都要把手打短了,哈)! 其实新闻仍然是用数据库的形式添加的,只是生成的同时使用FSO(“FileSystemObject”,就是我们所谓的File Access组件),把数据库的内容写成静态的*.htm页面,这样做有什么好处呢? 当网站流量太大的时候,我们的ASP就忙不过来了,大量的数据库检索查询,会让我们的服务器承受不住,如果请求的都是静态页的话,就大大降低了服务器的负荷,速度当然也快啦!

  好了,是不是有点兴趣了,下面我们说说程序的要求和制作的要点:

  1、服务器系统:win2000 IIS5.0或IIS4.0(强烈建议);
  2、你的系统或是远端服务器必须支持FSO(FileSystemObject文件读写);
  3、在程序制作中我们要学会分离UD产生的代码(也让我们能够理解UD让人“恐怖”的代码);
  4、部分的手写代码,结合UD的代码制作(从来没打开过code窗口的朋友可要注意哦);

  OK!做好准备了!就让我们开始吧!

  上篇:新闻的添加

  1、页面清单。在这个简单的新闻系统中,我们要用到如下页面:add.asp(添加新闻),browse.asp(新闻浏览),del.asp(删除新闻),example_updata.asp(模板修改), save.asp(保存新闻),ok.htm(成功页) ,updata.asp(修改新闻),updata_save.asp(保存修改)

  2、数据库准备。建立个数据库(这里我们采用Access2000)文件:asp2htm.mdb,建2个表:T_News,T_Example,具体如图: 


  3、建立模板。模板是做什么的?它就是我们最后见到的新闻页面,就好象我们以前做的新闻系统一样,不过这里我们只是用它来过个渡。我们建立一个任意名称的页,如:Example.htm(点击查看,可以保存这个页面成example.htm),我们可以在我们想要显示新闻内容的地方写上: E_Title(标题),E_Content(内容),E_Date(时间)。当然我们可以自己做个页面,关键是一定要有这就个变量,这个的作用是用来让数据库内容替换它,所以很重要。然后我们转到example.htm的代码窗口,选中全部的代码,拷贝它,打开数据库文件asp2htm.mdb,在T_Example表里查入一条新记录,把刚才拷贝的代码加进去。如图: 

  4、添加新闻页面add.asp。这个页面主要是一个表单,效果如图: 


  其中的表单各项的名称请按照图中的设置。我们看到表单里的有几项已经填了内容了,我们先不去管它。打开服务器行为面板(Window ---> Server Behaviors),添加一个Insert Record行为,这个我想大家都很熟了,就不多讲了,和表单中的各项对应好,把成功后的页面转到ok.htm页,就OK了。
  接下来我们就要给UD的代码做做手术了。转到代码窗口,拷贝从头开始到<html>标记前的代码:
  
  <%@LANGUAGE="VBSCRIPT"%>
  <!--#include file="../Connections/asp2htm.asp" -->
  ....................
  ....................
  ....................
   If (MM_editRedirectUrl <> "") Then
  Response.Redirect(MM_editRedirectUrl)
  End If
  End If

  End If
  %>

  接下来打开save.asp页面(可以是个空的页面),把这写代码贴进去,保存。这样我们就把UD生成的添加记录代码分离了哦!最后,要把表单发送到save.asp页面,发送类型“post”,action="save.asp"。


  5、用时间做文件名和取得静态*.htm页的保存路径。这里是一写手写的代码,主要有一个函数,用来把当前时间做为文件名,就好象 当前时间.htm,那就避免了文件重名的问题了。函数如下:

<%
function makefilename(fname)
fname = now()
fname = replace(fname,"-","")
fname = replace(fname," ","")
fname = replace(fname,":","")
fname = replace(fname,"PM","")
fname = replace(fname,"AM","")
fname = replace(fname,"上午","")
fname = replace(fname,"下午","")
makefilename=fname & ".htm"
end function
%>

  下面是取得文件保存路径的代码:

<%
Dim fname
Dim filepath
fname = makefilename(now()) '文件名
filepath=("../newsfile/"&fname)
%>

  把这两段代码拷贝到add.asp页的<html>标记上面,然后在表单N_FileName、N_FilePath、N_Date的value中插入代码,如下:

这是文件名的
<input type="text" name="N_FileName" size="32" value="<%=fname%>">
这是路径的
<input type="text" name="N_FilePath" value="<%=filepath%>" size="32">
这是时间的
<input type="text" name="N_Date" value="<%=Now()%>" size="32">

好了,我们浏览一下add.asp,是不是象刚才图上显示的一样啦!

  6、保存新闻、生成*.htm静态页的save.asp页面。我们刚才已经把add.asp的添加记录的代码拷贝过去了,如果直接运行add.asp页,就可以把记录插入到数据库中了,而我们现在是要把这条记录写成*.htm的形式。

  转到设计窗口,打开服务器行为面板(Window --> Server Behaviors),添加一个模板的记录集,如图: 



  转到代码窗口,接下我们就要添加写文件的FSO代码了,注意:

<%'这个函数DoWhiteSpace是用来转换空格和回车,让我们的长篇大论能够正常显示%>
<SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT>
function DoWhiteSpace(str)
DoWhiteSpace = Replace((Replace(str, vbCrlf, "<br>")), chr(32)&chr(32), "&nbsp;&nbsp;")
End Function
</SCRIPT>

<%
Dim N_Title
Dim N_Content
Dim N_Date
Dim fname
Dim filepath
Dim PostPath
fname = Request.Form("N_FileName") '取得表单的传递值

N_Title=Request.Form("N_Title")
N_Content=DoWhiteSpace(Request.Form("N_Content"))
N_Date=Request.Form("N_Date")

filepath=Request.Form("N_FilePath") '文件路径

pencat=rs.Fields.Item("E_Meno").Value '替换模板中的内容为输入的内容
pencat=replace(pencat,"E_Title",N_Title)
pencat=replace(pencat,"E_Content",N_Content)
pencat=replace(pencat,"E_Date",N_Date)

'把数据动态内容写成静态文件
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set fout = fso.CreateTextFile(Server.MapPath(filepath))
fout.WriteLine pencat
fout.close
%>

拷贝这段代码,粘贴到记录集rs的后面、从add.asp拷贝过来的代码的前面,就是如下位置:

<%
set rs = Server.CreateObject("ADODB.Recordset")
rs.ActiveConnection = MM_asp2htm_STRING
rs.Source = "SELECT * FROM T_Example"
rs.CursorType = 0
rs.CursorLocation = 2
rs.LockType = 3
rs.Open()
rs_numRows = 0
%>

贴到这里

<%
' *** Edit Operations: declare variables

MM_editAction = CStr(Request("URL"))
If (Request.QueryString <> "") Then
MM_editAction = MM_editAction & "?" & Request.QueryString
End If
............

  剩下的,还有一些html的代码(标记<html>到</html>),我们也可以删了他们,保存。

  7、添加成功页ok.htm和浏览页browse.asp。成功页ok.htm,在简单不过了,我们可以在写上“操作成功”,然后在下面写个“新闻浏览”,连接到browse.asp。

  浏览页browse.asp也比较简单,我们先建立一个记录集,如下图:

  然后,在页上添一个1*2的表格,插入记录,做好重复区域,如图: 

  选中{rsBrowse.N_Title},在属性Properties面板--->Link,上插入记录<%=(rsBrowse.Fields.Item("N_FilePath").Value)%>,如图:

  ok!现在浏览一下看能不能看到我们刚才添的新闻!!

  到目前为止我们算是看到小成果喽!是不是很有成就感?不过这还远远不够哦!我们还需要能够删除、更新还要能修改我们新闻页面的样式等等!

 

  1、模板的修改。我们先从简单的模板修改入手,这个原理很简单:把模板的数据记录取出来,使用Updata Record,就行了。我们在example_updata.asp页上放一个表单及一个text域(多行),建立一个记录集,如下图: 

  把记录<%=(rsUpdata.Fields.Item("E_Meno").Value)%>插入到你的text域中去,然后执行(Server Bahaviors ---> Updata Record),将成功页指向ok.htm就行了。

  2、新闻记录及页面的删除。普通的记录删除相信大家都会了,但是我们如果光删除了数据库中的记录,硬盘上还留有静态页的文件,这是我们不想见到的,所以我们还要用到FSO的DeleteFile方法。

  打开我们刚才做好的browse.asp页面,在表格的第2列,添一个表单域,1个按钮和2个隐藏域(name为N_FilePath和ID_News),设置表单的action="del.asp"。效果如图:

  分别将记录<%=(rsBrowse.Fields.Item("N_FilePath").Value)%>和<%=(rsBrowse.Fields.Item("ID_News").Value)%>插入到隐藏域N_FilePath和ID_News的Value里去,这个页ok了。

  3、删除新闻页del.asp。在这个页我们分别用command和FSO来删除记录和*.htm页,打开空白的del.asp页,打开Date Bindings --> Command(Stored Procedure) ,新建一个command命令,如图: 

  ok,删除数据库记录就做好了哦!是不是超简单!下面我们来添加删除新闻*.htm页的FSO代码。

  找到如下代码:

<%

set comDelNews = Server.CreateObject("ADODB.Command")
comDelNews.ActiveConnection = MM_asp2htm_STRING
comDelNews.CommandText = "DELETE FROM T_News WHERE ID_News =" + Replace(comDelNews__varID, "'", "''") + ""
comDelNews.CommandType = 1
comDelNews.CommandTimeout = 0
comDelNews.Prepared = true
comDelNews.Execute()

%>
  这是我们刚才添加的command命令,在这段代码下加上如下代码:

<% '删除新闻静态页面
Dim filepath
filepath=Request("N_FilePath")
Set fso = CreateObject("Scripting.FileSystemObject")
fso.DeleteFile(Server.mappath(filepath))
Set fso = nothing

response.redirect "ok.htm" '操作成功转向的页面
%>

  这样静态页的删除工作也做好了,保存!

 
  (PS:为什么要把FSO的代码放在command命令下面呢?这是为了以防万一运行del.asp页的时候,出现突发性事件,比如:停电、死机,可能上面的command命令已经执行完了,那么在浏览的时候,还是达到删除新闻的效果了,至少没有显示了。但是如果反过来,先执行了FSO把*.htm页删除了,但是数据库的记录还在,用户在点击浏览的时候就会找不到页面。这是个小问题,大家可以多思考一下)

  4、新闻修改更新。关于这个功能,更新数据库内容的方法我们都很熟了,用Updata Record行为就好了,这里主要是如何更新*.htm里的内容?其实一个比较简单的方法就是:重新创建一个*.htm的页,当然页面的名称和路径都是要更新的新闻页的名称和路径,这样,创建好了后,就覆盖了原来的文件,更新的操作也完成了。好!明白了道理,也有了前面添加新闻的基础,应该难不倒你喽!
我们首先在browse.asp页上添加个按钮,在前面“删除”按钮的后面,插入一个表格列,在里面插入一个表单,及1个按钮和1个隐藏域name=ID_News_updata(你也可以用文字,如:更新,连接到updata.asp页,参数为ID_News=<%=(rsBrowse.Fields.Item("ID_News").Value)%>),效果如图: 

  设置表单(这里是form2)的action="updata.asp",好了,这个页就ok了,保存!

  5、updata.asp页面。这里我们先建立一个记录集,如图:

  然后我们插入用来更新记录的表单,和添加新闻的add.asp页类似,效果如图:

  然后,添加一个Updata Record行为,成功页指向ok.htm。好了,这个页面我们先放一放!先做下面的!

  6、保存更新的updata_save.asp页。这个页,除了添加新闻Insert Record行为以外,updata_save.asp和save.asp页的代码应该是一样的,我们可以打开save.asp页,另存为updata_save.asp。ok,我们再打开updata.asp页,下面我们又要拆分UD的代码了,有了前面的经验,应该没什么问题了吧!剪切下如下代码:

<%
' *** Edit Operations: declare variables

MM_editAction = CStr(Request("URL"))
If (Request.QueryString <> "") Then
MM_editAction = MM_editAction & "?" & Request.QueryString
End If

' boolean to abort record edit
MM_abortEdit = false

......
......
.....中间代码略过.....

Set MM_editCmd = Server.CreateObject("ADODB.Command")
MM_editCmd.ActiveConnection = MM_editConnection
MM_editCmd.CommandText = MM_editQuery
MM_editCmd.Execute
MM_editCmd.ActiveConnection.Close

If (MM_editRedirectUrl <> "") Then
Response.Redirect(MM_editRedirectUrl)
End If
End If

End If
%>

  然后把updata.asp的表单的action="updata_save.asp",保存!

  打开updata_save.asp(这个页是刚才我们从save.asp页另存过来的),我们用刚才剪切下的更新代码,替换掉updata_save.asp页里的添加记录的代码(就是FSO代码下的那些,忘了,就看看前面),ok,保存!这样更新的功能也有了,试试!不错吧!

  到这里为止,我们的ASP2Htm新闻系统已经具备了必备的功能了,新闻的添加、删除、更新还包括模板的修改,但是这还远远不够,我们还需要更多人性化的功能,比如:可创建和选择多个模板,能够自定义并创建新闻目录文件夹,以及我们如何在其他地方妥善的使用FSO这个功能等等。还有很多程序的扩展等着我们!

 

  看完了前面的2章,相信你已经能够开发这样一个静态页新闻系统了。但是,对于一个完整意义上的新闻系统来说,这些是远远不够的。还有很多功能,比如:在新闻内容中插入图片、实现新闻分类、可以多选的模板等,当然你可以为你的新闻系统加上很多的功能,但有一个原则:让用户方便的管理和操作。任何的功能都是围绕用户的需要的使用习惯来的,切记切记!

  也许你会问,我们为什么要做这些新闻分类、模板多选等烦琐的事情呢?小田在刚开始做WEB程序开发的时候,和你的想法一样,而且对自己做的很容易满足!但是客户的要求往往是不根据你的想法而定的,他们往往在程序完成后或是开发的后期,提出一些另你很头疼的要求,使得你要更改你的程序,动动大手术。所以要在前期就了解客户的要求和使用习惯,并能想到他们可能提出的变化。比如:今天你的新闻系统做好了,客户突然提出要多一个新闻栏目,而且样式要不同的!!这时候你是瞪大眼睛看着他呢?还是找个地洞钻?还是最后灰溜溜的回去改你的程序!!!

  我们开始做上面说的几个功能。先来看新闻分类。

  1、首先是数据库的设计,我们要在原来的数据库中添加一个表:T_Type,如图:

  在里面先输入几个类别,如图:

  打开原来的表T_News,在里面添加一个新的字段N_Type_ID(用来对应新闻分类的外关键字),如图:

  如果这时候,你的新闻系统已经有了内容,还要在原来的数据内容上写上这分类的ID,为了方便起见,还是删除原来的新闻记录吧!

  2、修改新闻添加页面add.asp页。打开add.asp页,我们在新闻内容的上面插入一个表格行,左列写“新闻类型”,右列插入一个List表单项,name="News_Type",如图:

 

然后,我们再添加一个新闻分类的记录集,如图:



接下来我们要把记录集放到List表单中去,选中List表单,打开Server Behaviors-->Dynamic Elements-->Dynameic List/Menu,如图:


  单击OK,好了,新闻类型的记录集已经放在List里了。现在保存add.asp,ok!

  3、修改保存新闻页面save.asp页。这个页面我们只要改2句代码就好了,由于这里的添加新闻内容到数据库的代码是从add.asp页copy过去的,大家做的时候,没有特殊情况的话,把代码在add.asp页调整好,再整个copy到save.asp页就好了。现在我们得改改save.asp页面。打开save.asp页的代码窗口,找到如下代码:


MM_fieldsStr = "N_Title|value|N_Content|value|N_FileName|value|

N_FilePath|value|N_Date|value"
MM_columnsStr = "N_Title|',none,''|N_Content|',none,''|

N_FileName|',none,''|N_FilePath|',none,''|N_Date|',none,NULL" 


  替换为:


MM_fieldsStr = "N_Title|value|News_Type|value|N_Content|value|

N_FileName|value|N_FilePath|value|N_Date|value"
MM_columnsStr = "N_Title|',none,''|N_Type_ID|none,none,NULL|

N_Content|',none,''|N_FileName|',none,''|

N_FilePath|',none,''|N_Date|',none,NULL" 


  我们可以里面的变化,多加了|News_Type|value|(这表示从表单名为News_Type的value值传递过来的)和|N_Type_ID|none,none,NULL(这表示添加到数据字段N_Type_ID),保存save.asp页面。

  ps:UD的插入数据是使用insert into来做的,你看,取Request.Form的值是把表单项名称等组个数组,然后用函数Split()分开,再取Request的值,这样做是为了软件使用的方便,大家做添加数据可别这么做哦!要晕死的,呵:)

  4、修改新闻浏览页browse.asp页。这个页我们学着将新闻记录和新闻类型关联起来,这里应用了SQL语句。打开browse.asp页,重新打开记录集rsBrowse,点击Advanced...(高级),修改一下原来的SQL语句,如图:


看,这里的SQL语句:INNER JOIN ....ON....。把两个表关联起来了,点击OK。我们看到原来的Recordset已经有了变化了,如图:



然后我们在原来的新闻标题后面加上新闻的类型,如图:



浏览一下,是不是有了新闻类型了!!(分类的修改等等这里就不一一复述了,大家自己动动手吧)

ps:这里我们看到添加新闻的时候,插入T_News表的新闻类型是T_Type的ID值。也许你会问,为什么不直接插入T_Type的T_TypeName的值呢?这样的话调用的时候也不用2个表关联了!但是这么做有一个问题,如果你突然要修改新闻分类的名称,到时候是不是要修改所有新闻记录里的新闻分类名称呢!那就太……(电脑前的小田已经晕过去了)

  好了,简单的新闻分类也有了,下面我们看看模板的多选。这个部分比较简单,有些和上面的新闻分类相似。

1、仍然是数据的修改。打开原来的表T_Example,我们添加个新的字段E_Type,如图:



在数据窗口填个类别进去,如图:



2、修改新闻添加页add.asp。和上面的添加一个新闻分类的List一样,再添加个模板类别的List(name="Example_Type"),把记录集放到这个List中去(value=ID)。这里就不详细说了。



3、保存新闻页save.asp页。这个页主要是要根据add.asp里的List(name="Example_Type")传递过来的值取出相应的模板记录。如图:



保存页面,现在模板的多选也有了,我们可以多做几个模板玩玩。

  很多网友问,如何在新闻里插入图片、超链接等等。比较常规的方法就是使用UBB代码,就像我们在论坛的文章里插入图片等一样,如:[img]http://webdesign.chinaitlab.com/UploadFiles_8014/200604/20060413120052746.gif?http://www.xvna.com[/img],,这里需要你编写一段UBB代码,小田就不写了,给大家个写好的,点击这里下载。

  还记得我们前面save.asp页面中为了让新闻系统能够正常显示段落和空格的那段函数吗,现在打开它,并找到它:

<SCRIPT RUNAT=SERVER LANGUAGE=VBSCRIPT> 
function DoWhiteSpace(str) 
DoWhiteSpace = Replace((Replace(str, vbCrlf, "<br>")), chr(32)&chr(32), "&nbsp;&nbsp;") 
End Function 
</SCRIPT>

我们把下载下来的页面ubbcode.asp复制到新闻系统目录下,然后用一向语句替换上面的函数:

<!--#include file="ubbcode.asp" -->

然后在下面找到原来调用的函数语句:

N_Content=DoWhiteSpace(Request.Form("N_Content"))

替换为:

N_Content=UBBCODE(Request.Form("N_Content"))

同样,新闻更新页updata_save.asp也要同样的更改,ok,现在试试添加个新闻,内容写上:
htt://www.guitarsky.com,成功后,浏览看看,是不是有了超链接了!!

  OK,现在我们的ASP2Htm的新闻系统已经慢慢完善起来了,当然,你应该可以想到更多的功能来完善它,小田只是抛砖引玉,让大家能够更好的利用UD开发ASP系统。小田是由衷的喜爱UD这个软件,但是如果你过分依赖它,就会觉得它的功能越来越不能适应你的要求,小田要告诉大家的是,要多学习ASP(现在大家都要开始学ASP.NET了吧)的知识!软件是死的,你可不是哦!!

相关内容
赞助商链接