在这章中,你会学到怎样处理多个主页。在第一部分,你会学到怎样从HTML的Form中接受信息。在第二部分中,将会讨论一些接受和处理Query字段的方法,第三部分,你会学会如何引导用户到一个新的主页地址,第四部分,则是在Active Server Pages中如何包容另一个Active Server Page。
从HTML的Form中接受信息
一般来说,你应当将HTML的FORM作为最主要的主页间传递信息的手段,使用户能够和你的Active Server Page充分实现交互和信息传递的最可靠手段就是它。
注意
如果你需要先去了解一下Form的类型和创建方法,请先到本书的第6章。
注意
利用Form来传递用户的信息是最可靠的,因为它适用于任何浏览器,你当然也可以选择其他很多种方法,例如Java applet, ActiveX控件,甚至是Adobe Acrodat文件创建,但是如果你的网站希望针对的是广域网上更多层次的使用者,笔者建议还是应当以HTML的Form为主。
假设你希望用户在使用网站前进行一个注册过程,那么显然你应当使用一个HTML Form, 如下面这个例子:
<HTML>
<HEAD><TITLE>注册页</TITLE></HEAD>
<BODY>
<h4>迈至科网络ASP教程注册页示例:</h4>
<FORM Method=“post” Action=“reresults.asp”>
<p>请输入姓名:<input name=“username” type=“text”><br>
所在公司:<input name=“usercompany” type=“text”>
<br>
<input type=submit value=“ 确认注册 ”>
</body>
</html>
那么相信看到这里的读者应当十分熟悉HTML了,显示结果应当想象到了(见图15.1)。(如果不是的话,请先看本书第6章或者其他主页入门书籍。)那么主页的介绍就不在多写了,请注意这里面的form的method=post,也就是说,text文本框内容在submit按钮点击确认后会传送到服务端,由于form的内容将作为HTTP请求的一部分,那么细心的读者应当已经意识到可以用Active Server Page的Request对象来处理了,针对这种目的,Active Server Page的Request对象特别指定了一个form集合来进行相关处理。form集合就可以包含所有添入HTML Form的信息。
图15.1 注册表单的一个简单例子
Form集合的每一个键都对应于HTML Form的输入内容。例如,上面那个简单的例子里面只有两个键:username和usercompany;分别对应于两个文本框。
单独取出一个键值的方式见下面这个脚本(reresults.asp对应于form的action):
<HTML>
<HEAD><TITLE>注册处理1</TITLE></HEAD>
<BODY>
迈至科技术人员谢谢<%=Request.form(“username”)%>的注册!
</body>
</HTML>
这页执行的时候,注册用户的姓名就会显示在浏览器上,特别注意对应于上面HTML的Form中的Action必须是指向这个脚本。
还有一点必须提醒的是,在HTML的Form中的文本框如果是空的,那么脚本执行就会报错,当然对这种情况的判断和相应附加约束也很简单,但是现在为了简化目前的主要问题,还没有涉及到,希望用户有所了解,在正式制作这种应用时,要尽量避免出现对form中某些区域空的情况没有约束或判断的现象。
很多互联网上都使用了附加页来感谢客户的注册等等,通常这就需要了解上一个主页的FORM中的内容,这种情况下,就需要request.form了。
Form集合多个内容的处理显示
如果想把上个主页form中所有内容显示出来,有好几种方法,如果你希望循环的将所有内容依次显示,可以参照下例:
<%
FOR EACH name IN Request.Form
Response.Write(“<BR>“&name&”=“)
Response.Write(“Request.Form(name))
NEXT
%>
那么这个脚本就会依次将上个Form中传递的键名和相应值成对显示出来:例如,如果迈至科公司的谢建云进行了注册,那么显示结果为:
USERNAME=谢建云
USERCOMPANY=迈至科公司
请注意这里面的键名是大写的,其实在Form的集合中,尽可以不去理会这些,因为大小写是通用的,也就是说,UserName和uSeRnaMe对于服务端处理是完全一样的。
除了FOR EACH循环外,你当然也可以用For ...Next循环,下面的脚本也会显示每个键的值。(但是不会显示键的名称)
<%
FOR I=1 to Request.form.Count
Response.Write(“<BR>“&Request.form(i))
NEXT
%>
在这里面Count属性可以用来了解具有Form的主页在提交时具体有多少个Form域被填写或选择(键)。
最后,对于如果Form集合中提交项,你只希望看到的是简单的URL-encoded字串(在程序调试过程中,这几乎是肯定会用的),还可以只是用下面这个脚本:
<%=Request.Form%>
下面是显示结果,(依然假设为迈至科公司谢建云注册,同时注意显示为小写)
username=谢建云&usercompany=迈至科公司
这里面,Form域名得到了保持,因为这时HTTP的Post内容尚未经过解析。
FORM的域对应多值的处理
有时,Form的某个域对应多个值,例如,对于checkbox类型来说,实现多项选择是最拿手的,看下面这个HTML Form。
<FORM METHOD=“POST” ACTION=“regresults.asp”>
请问您是怎样了解到迈至科公司的?
<br><input name=“HowHear” Type=checkbox Value=“Newspaper”>
新闻报纸以及广告
<br><input name=“HowHear” Type=checkbox Value=“SearchEngine”>
站点搜索引擎
<br><input name=“HowHear” Type=checkbox Value=“Friend”>
朋友介绍
<br><input name=“HowHear” Type=checkbox Value=“Stumble”>
网上冲浪时偶然进入
<p><input type=submit value=“ 确认进行了上述选择 ”>
</form>
这个form就可以用来考察用户了解本公司的途径,这样就可以认识到各种媒体的不同效应。不过很可能用户有多种途径了解该公司,那么就允许用户在多个checkbox中划上对勾(如果单选,应当用radio类型),这时,HowHear键就一次对应了多个值(见图15.2)。
图15.2 多重选择的表单例子
你怎样才能把它们都接受出来呢,这时你可以利用form集合的一个附加参数。见下面这个例子:(请注意这个程序名称必须是regresults.asp对应于上一个程序的Form Action=的文件名)
<HTML>
<HEAD><TITLE>你的响应</TITLE></HEAD>
<BODY>
根据你的回应,我们知道你了解我们公司有
<%=Request.Form(“HowHear”).Count%>种途径。
<p>你了解我们站点是依据:
<%
FOR EACH way in Request.Form(“HowHear”)
Response.Write(“<p>“&way)
NEXT
%>
</BODY>
</HTML>
在这个脚本中,Count属性用来检验复选框被选择的数目,在这里面与前面不同的是,count只是计算复选框中的选择数目而不是所有的form域提交的数目。那么这里面调用是:Request.Form(“HowHear”).count,带着参数”HowHear”。
由于使用了FOR EACH循环,那么用户的所有选择都会显示出来(显示的是Value的值,既:Newspaper、SearchEngine等)
Text Area的处理
你可以利用同样方式接受Text Area类型的文本内容。请注意VBScript的变量允许很长,而不是向其他许多种语言那样以255为限制。
下面是一个Text Area类型的例子:
<Form Mehthod=“POST” action=“response.asp”>
请输入您对我们迈至科网站的意见和建议:
<p>
<TextArea Name=“feedback” cols=30 rows=10></textarea>
<p><input type=submit value=“ 确认发送 “>
</form>
这个主页利用text area类型作为反馈表,这是很常用的,如果你希望显示反馈表内容,如下:
<HTML>
<HEAD><TITLE>反馈响应</TITLE></HEAD>
<BODY>
谢谢您的意见和建议,你的建议为:
<p>
<%=Request.Form(“FeedBack”)%>
</BODY>
</HTML>
Form中对HTML标记的处理
用户可以在文本输入区中输入一行带有HTML标记的文字,或者甚至在Text Area中输入多行HTML语言,你是无法阻止他的输入的。
有些时候,这种操作是允许甚至鼓励的,比如说你开辟了基于浏览器的网上论坛(例如迈至科网络的技术论坛),甚至就是网上主页开发辅助系统,那么用户自己定义一些文字颜色,添加<hr>这样的分行符等等都没有任何问题。
但是在一些场合下,例如在技术论坛中你希望解答一个关于主页的问题而输入了一段主页代码,你应当是希望用户看到的是这段代码而不是经服务端解释后的这段HTML主页,例如,你希望用户看到 “<b>这是粗体</b>”而不是“这是粗体”,那么,怎样实现呢?
幸运的是,Active Server Pages提供了Server.cfmLEncode()方法来处理这种目的的操作。例如,你就可以使用
<%=Server.cfmLEncode(“<B>这是粗体</B>“)%>
这样,显示的结果就是HTML代码而不是解释后的HTML主页。
注意
如果想要完全了解HTML字符代码,参见本书结尾的附录D。
测试form域是否存在
在前面曾经提到过你应当检查用户是否正确的填写了各种注册表,例如有些填写域你希望用户不要空置。那么你可以利用下面这种脚本来进行这样的检验(还是和本章初始的注册页对应)。
<%
IF Request.Form(“username”)=“” THEN
Response.Write(“你必须输入姓名”)
ELSE
Response.Write(“谢谢注册”)
END IF
%>
这个脚本就是测试了用户是否填写了姓名项,检验过程是与一个0长度的字段比较,如果用户没有填写,那么等式成立。
作为正式发布的站点,你当然应当引导用户返回上页,在后面章节中,涉及到了这种处理。