内容连接组件实例应用

这部分是创建一个简单的讨论组的实例应用,用户在这里可以读取他人文章以及发表新的文章。

 

注意

对于这些很有代表性的实例,如果用户希望在线进行使用和测试以加深理解,建议访问http://www.aspsite.com

下面是一个特别简单的用户讨论组的范例,如果你希望也有这么一个讨论组,那么所有的程序放到你的服务器上就可以了(当然前提是你的服务器支持Active Server Pages)

创建这么一个讨论组,你只需要以下四个文件:

■发布文章页:这个页面用来发布文章

■文件包含页:用于用户读取文章,将发布的文章文件包容在该文件中。

■新项目处理页:将发布的文章进行保存并且更新组件连接所用的文本文件。

■讨论组主页:显示所有信息,提供发布文章的入口。

 

发布文章页

提供用户发布新消息的页面,这其实只是一个普通的HTML页,利用了HTML的Form进行文章填写,其中名字为subject的文本框是标题拦。

例20.1 post.cfm脚本

 

<HTML>

<HEAD><TITLE>文章发布页</TITLE></HEAD>

<BODY>

<h2>发布一个新消息</h2>

<form method=post action=newitem.asp>

主题:<input type=text name=subject size=50 maxlength=50>

<br>

<textarea name=Posting cols=60 rows=10wrap=Virtual></textarea>

<p>

<input type=Reset value=清除>

<input type=Submit Value=发布信息>

</Form>

</Body>

</Html>

 

文件包容页

每一个信息页显示时都应当包括前一篇和后一篇,同时还要有一个回主页的连接,这样信息页就必须用文件包容方式,这些连接显示显然是自动更新的,那么更新过程在下一个页面介绍中,这个页面介绍是如何动态显示。脚本如下:

例20.2:news.inc脚本

 

<hr>

<%

Set mylinks=Server.CreateObject(MSWC.NextLink)

IF mylinks.GetListIndex(news.txt)>1 THEN

%>

<a Href=<%=mylinks.GetPreviousURL(news.txt) %>>

前一篇文章</a>

<% End IF %>

<a Href=<%=mylinks.GetNextURL(news.txt) %>>

后一篇文章</a>

<p>

<a href=news.asp>返回主页</a>

 

显示结果应当无须赘述,有兴趣的读者可以自行浏览http://www.aspsite.com

 

新项目处理页

当用户发表完一个新消息后,就进入了新项目处理页,这个页面看上去很简单,但是处理工作最为复杂。

这个页面动态生成新的Active Server Pages文件,(天那,你知道这意味着什么?!) 当用户发表了新的消息,那么这个消息就存在一个文本文件中,不过,这里面的文本文件不是一般意义的纯文本,而是Active Server Pages文件。这个新的项目的依据的信息就是从HTML的FORM中接受到的。

同时该asp文件也将内容连接组件所依据的文本文件进行更新,主要是为新的消息创建一个对应的记录。因此达到动态的即时更新的效果。

 

下面的例子脚本明显比以前的长,当然,对于专业制作人士,这其实算不上什么。不过现在作为教程,我们会对每一部分详细解释。

例20.3新项目处理页

 

<%

创建这个发表内容

TheSubj=Server.cfmLEncode(Request.Form(subject))

If TheSubj =”” THEN TheSubj=无标题

ThePost=<HTML><HEAD><TITLE>&TheSubj&</TITLE></HEAD><BODY>

ThePost=ThePost&发表日期:&NOW&<Hr>

ThePost=ThePost&Server.cfmLEncode(Request.Form(Posting))

ThePost=ThePost&<!-- #INCLUDE VIRTUAL=””new.inc”” -->

ThePost=ThePost&</BODY></HTML>

 

创建一个新的文件名(不重名)

Set mylinks=Server.CreateObject(MSWC.NextLink)

TheName=item&mylinks.GetlistCount(news.txt)+1&.asp

TheNamePath=Server.Mypath(TheName)

 

保存该发表内容到文件中

Set MyFileObj=Server.CreateObject(Scripting.FileSystemObject)

Set MyOutStream=MyFileObj.CreatTextFile(TheNamePath)

MyOutStream.Write ThePost

MyOutStream.Close

 

对内容连接组件所需文本文件的更新

TheNews=Server.MyPath(news.txt)

Set MyNews=MyFileObj.OpenTextFile(TheNews,8,TRUE)

MyNews.WriteLine TheName&vbTab&TheSubj

MyNews.Close

%>

 

<HTML>

<HEAD><TITLE>新的项目</TITLE></HEAD>

<BODY>

<h2>谢谢发表文章</h2>

<a href=news.asp>返回主页</a>

</Body>

</HTML>

 

在本页中,创建了一个叫做ThePost的变量用来记载这个Active Server Page的内容, 在这里面,整个Active Server Page作为一个很长的字符串来处理,下面仔细看一下 这个字符串的生成过程:

 

创建这个发表内容

TheSubj=Server.cfmLEncode(Request.Form(subject))

If TheSubj =”” THEN TheSubj=无标题

ThePost=<HTML><HEAD><TITLE>&TheSubj&</TITLE></HEAD><BODY>

ThePost=ThePost&发表日期:&NOW&<Hr>

ThePost=ThePost&Server.cfmLEncode(Request.Form(Posting))

ThePost=ThePost&<!-- #INCLUDE VIRTUAL=””new.inc”” -->

ThePost=ThePost&</BODY></HTML>

 

这个Active Server Page文件不仅包括了Form中传递过来的信息,还包括了日期信息 以及News.inc的一段用于动态显示的脚本。

 

注意

对于引号在字符串中的赋值是采用连着两遍的引号输入来进行的,即,在字串赋值中两个连着的引号相当于一个引号。例如,将MyString赋值为下面这个字段

我说:你好

那么赋值语句为MyString=我说:””你好”””

不过,对于中文输入法的双字节引号,不需要这样处理。

 

脚本的下一部分是给这个active Server Page起一个不重复的名字,你当然不希望新 的消息覆盖以前的,因此在存储该文件之前必须首先进行不重复的文件名的生成:再看这段脚本:

 

创建一个新的文件名(不重名)

Set mylinks=Server.CreateObject(MSWC.NextLink)

TheName=item&mylinks.GetlistCount(news.txt)+1&.asp

TheNamePath=Server.Mypath(TheName)

 

由于使用了内容连接组件的Count属性,就可以通过从文本文件中的记录数目来命名以保证不会有重复了,这里文件名分别为item1.asp,item2.asp,item3.asp等等,每一个信息对应一个不同的名称,不过,提醒注意的是,如果从news.txt中删除了一些信息,那么文件命名重复的现象就会发生,因为这只是简单示例,所以没有做这些考虑处理。

 

第三部分脚本是将将生成的ThsPost字符串以生成的TheNamePath路径名存入硬盘,这里面显然用到了FileSystemObject()方法来进行处理,那么详细的这种处理的介绍参见上一章。脚本如下:

 

保存该发表内容到文件中

Set MyFileObj=Server.CreateObject(Scripting.FileSystemObject)

Set MyOutStream=MyFileObj.CreatTextFile(TheNamePath)

MyOutStream.Write ThePost

MyOutStream.Close

 

最后部分是更新News.txt文件,该文件被内容连接组件用来检索信息,下面是这个更新部分的脚本:

 

对内容连接组件所需文本文件的更新

TheNews=Server.MyPath(news.txt)

Set MyNews=MyFileObj.OpenTextFile(TheNews,8,TRUE)

MyNews.WriteLine TheName&vbTab&TheSubj

MyNews.Close

%>

 

如果该news.txt不存在,那么系统会自动创建这个文件,因此当讨论组中发表了第一个文件,系统就会创建这个news.txt。

 

请注意这里面用到了VBScript的vbtab常量,这个常量就是tab键的作用,那么该news.txt必须用tab键进行URL地址和描述的分隔是上一章中介绍过的。

 

讨论组主页

最后当然要创建讨论组的主页,这个页面就是显示各个信息的标题并提供连接,以及提供发表新文章的入口连接,下面是这个页面的全部脚本:

例子:20.4讨论组主页

 

<%

创建内容连接组件

Set mylinks=Server.CreateObject(MSWC.NextLink)

%>

<HTML>

<HEAD><TITLE>讨论组主页</TITLE></HEAD>

 

<BODY>

发布信息数:<%=Mylinks.GetListCount(news.txt) %>

<hr>

[<a href=post.cfm> 发布新文章</a>]

<UL>

<%

显示信息列表

For i=1 to mylinks.GetListCount(news.txt)

%>

<LI>

<a href=<%=mylinks.GetNthURL(news.txt,i)%>>

<%=mylinks.GetNthDescription(news.txt,i)%></a>

<%

next

%>

</ul>

</body>

</html>

 

很容易理解,这个页面就是首先创建一个内容连接组件的事例,然后根据news.txt去判断连接文件的数目并显示,连接post.cfm没什么可以解释的,然后根据连接文件的数目进行For Next循环,将其描述显示出来并且连接相应URL地址。

那么这么一个例子对于创建讨论组很具有代表性,读者甚至可以直接利用这里面提供的脚本来制作自己的讨论组,当然,这个讨论组主要是教学性质,过于简化,下面部分讨论怎样扩展其功能。

 

讨论组示例功能拓展

这个简单的讨论组显然只能应用于小规模的范围,几个知交好友建立联系网站,互通声息还可以,一旦文章增加,很多问题解决不了,比如说,有人同时进行文章发布尝试,这个内容连接组件就没有考虑这种问题。利用诸如SQL Server这样的数据 库来创建讨论组就可以大大增强其功能应用,当然,这需要ActiveX Data对象,( 本书第22章将进行详细介绍),和内容连接组件不同的是,数据库进行大量信息的存储和读取将更加有效。

 

不过,这个内容连接组件的示例还是可以使你了解怎样对一定数量的文件连接进行有效的处理,这个组件所完成的动态页面更新是一个优秀的的站点负责人应当学会的。