冲浪提速秘技之使用多页面浏览器
利用ASP实现网上考试
一、前言
随着Internet的普及和国民对教育越来越重视,一些新兴的教学手段如远程教学、网上培训、网上学校在国内越来越普及,许许多多的培训单位、中小学学校和大中专院校也建设了校园网、园区网,在这种情况下,网上测试、网上作业、网上考试就具有了必要的环境,本文利用ASP(Active
Server Page)给出了网上考试、练习与测试的实现办法,本文所叙述的方法对标准化客观题目如选择题、填空题、判断题非常适用,对于其它类型的题目只要在本文的基础上稍加修改即可在Windows
NT/Window9X局域网或Intranet上使用。
二、程序组成及各部分的功能
Examination.mdb 数据库:它包括四个数据表:成绩表、数据结构、CPP、HTML语言,这四个数据表的具体结构及功能在第三部分数据库设计中详加阐述;
Login.asp:登录界面,只有输入正确的学号和姓名才能进入考试界面;
TestPaper.asp:显示试卷内容;
CalScore.asp:计算分数;
MyFunction.zw:包含Login.asp、TestPaper、CalScore.asp公用的函数
三、数据库设计
Examination.mdb:用Microsoft Access建立的标准MDB型数据库,它包括四个数据表:成绩表、数据结构、CPP、HTML;
成绩表:此表用来存贮每个学生各个科目的成绩,在本文中指数据结构、CPP(C++语言)、HTML语言三种科目的成绩,其结构如下表:

说明:如果某门课还没有考,分数设为-1,防止和分数为零的情况相混;
数据结构、CPP、HTML语言这三个表的结构完全相同,用来存贮相应各科题目(选择题),其数据表结构如下:

注意:1)在本文中只讲述单项选择与多项选择题的编写方法,其余类型在本文源代码基础上稍加修改即可;
2)本文所有选择题只有四个选择,在这三个表中可通过增加字段来增加选择项。
四、源代码(用Vbscript编写ASP程序)
MyFunction.zw的源代码如下:
<%
'------打开连接数据库,为存取数据表作准备-----
Function CreateMdbRecordset(数据库文件名, 数据表名或Select语句 )
Dim conn,Provider,DBPath
' ---------建立Connection 对象---------
Set conn = Server.CreateObject("ADODB.Connection")
Provider = "Provider=Microsoft.Jet.OLEDB.4.0;"
DBPath = "Data Source=" & Server.MapPath( "数据库文件名"
)
'-------------打开数据库 --------------
conn.Open Provider & DBPath
Set CreateMdbRecordset = Server.CreateObject("ADODB.Recordset")
' -------------打开数据表---------------
CreateMdbRecordset.Open "数据表名或Select语句", conn, 2, 2
End Function
%>
Login.asp的源代码如下:
'因为要用到myfunction.zw中的函数CreateMdbRecordset,所以要把它包括进来
<!--#include "myfunction.zw"-->
'---读取表单中表单域值并分别保存到变量StudentID、Name、Subject中---
<%StudentID=Request("StudentID")
Name=Request("Name")
Subject=Request("Subject")
If Request("send")<>Empty then
SQL='Select * From 成绩表 where StudentID='"
SQL=SQL&StudentID&"'and Name='"&name&"'"
Set Isvalid=CreateMdbRecordset("Examination.mdb",SQL)
'---------检验所输入的学号与姓名是否与成绩表中学号、姓名相符
If Isvalid is nothing then ' ------如果不能打开成绩表
ErrorMessage="程序错误,请询问管理员"
Else if Isvalid.EOF then '------成绩表无此学号或姓名
ErrorMessage="不正确的学号或姓名"
Elseif Invalid(Subject)<>-1 then '----分数不为零,见数据库设计说明
ErrorMessage="你已经参加过这一门的考试了"
Else
'-显示试题,且把Name、StudentID、Subject当作参数传递给Testpaper.asp
Reponse.Redirect "TestPaper.asp?"&Request.QueryString
Endif
Endif
%>
<html>
<head>
<title>登录 </title>
<h3>请输入考生信息:</h3>
<BlockQuote> '-显示登录表单域
<Form action="login.asp" Method="Get">
<p>学号:<Input type="text" size="30" name="StudentID"
value="<%=StudentID%"></p>
<p>姓名:<Input type="text" size="30" Name="Name"
value="<%=Name%>"</p>
<p>考试科目:
<Select name="Subject" size="1">
<option value="数据结构"> 数据结构</option>
<option value="CPP">C++语言</option>
<option value="HTML语言">HTML语言</option>
</select></p>
<p><input type="Submit" Name="send" value="确定"></p>
</form>
</BlockQuote>
<hr>
<Font color=red><%=Errormessage%></font>
</body>
</html>
TestPaper.asp
#include "myfunction.zw"
<%
'-读取Login.asp附带的Subject、StudentID及Name参数值
Subject=Request("Subject")
StudentID=RequestID("StudentID")
Name=Request("Name")
'-打开题目库即数据结构题库或C++题库或HTM语言题库,由Subject而定
SQL="Select * From"& Subject&"Order by 题目序号 DESC"
Set Problemrs=CreateMdbRecordset("Examination.mdb",SQL)
%>
<html>
<body bgcolor=white>
<h3><%=subject%>考试题目</h3><hr>
<Form action="CalScore.asp" Method="Get">
'-----通过下面三个隐藏表单对象,把学号、姓名及科目名称传给CalScore.asp
<Input Type="Hidden" Name=Subject value=<%=Subject%>>
<Input Type="Hidden" Name=StudentID value=<%=StudentID%>>
<Input Type="Hidden" Name=Name value=<%=Name%>>
<%
'------显示题目
While not Problemrs.EOF
%>
'------显示题目序列号、题目内容和题分数
<B><%=ProblemRS("题目序号")、<%=Problemrs("题目")%>(<%=Problem("本题分数")>)</B>
<BlockQuote>
<%
if Problemrs("题目类型")="Single" then
ProblemType="Radio"
Else
ProblemType="Checkbox"
Endif
'------显示四个选择项
for n=1 to 4
%>
<Input Type=<%=ProblemType%> Name=No&<%=Problem.rs("题目序号")%>
value=<%=n%><%=Problemrs("选择项"&n)%><br>
<%
Next
Response.write "</BlockQuote>"
Rs.MoveNext
Wend
%>
'----单击"交卷",根据Form的Action属性调用CalScore.asp计算分数
<Input Type=Submit value="交卷">
</Form>
</body></html>
CalScore.asp计算分数
<!--#include "myfunction.zw"à
'----从TestPaper.asp中的三个隐藏变量中取得数值
<% Subject=Request("Subject")
StudentID=Request("StudentID")
Name=Request("Name")
Set rs=CreateMdbRecordset("Examination.mdb",Subject)
%>
<html>
<body>
<h2><%=name%>的考试成绩如下表:</h2>
<%
score=0
while not rs.eof
'----读取各题的答案
selection=Request("No"&rs("题目序号")
Answer=rs("正确答案")
If Answer=Selection then
Score=score+rs("本题分数")
Endif
Rs.MoveNext
Wend
'----把成绩保存在成绩表中
SQL="select * from 成绩表 where studentid='"&StudentID&"'and
name='"&name&"'"
Set rs=CreateMdbRecordset("Examination.mdb",SQL)
Rs.Score(Subject)=score
Rs.update
%>
//用表格显示分数
<BlockQuote>
<%=name%>的分数如下表<br>
<Table border=1>
<Tr Bgcolor=Green><TD>学科</td><td>总分</td></tr>
<tr><td>数据结构</td>
<td><%=rs("Datastru")%></td></tr>
<tr><td>C++</td>
<td><%=rs("CPP")%></td></tr>
<tr><td>HTML语言</td>
<td><%=rs("HTML")%></td></tr>
</table>
</blockquote>
<hr>
<font color=Blue align=center> 说明:如果某门课的分数为-1,说明这门课还没有考</font>
<hr>
<a href="Login.asp?StudentID=<%=StudentID>&Name=<%=Name%>
</body></html>
五、总结
本文所设计的数据库结构适合若干门课选择题的考试,但如我们修改一下数据库结构的设计,在Examination.mdb数据中库中建立如下的数据表:填空题库、单选题库、多选题库、判断题库,利用VBScript中的Rnd函数可随机生成试题,这样非常适合对某一门课的题库设计,有兴趣的同仁只要在本文的基础上稍加修改即可。
在本文中尤其需要注意的是三个ASP文件通过Name、Student、Subject三个变量值的相互传递而构成一个整体,传递的方法主要有:利用隐藏型表单域传递、直接给调用的ASP指明参数,这也是ASP文件数据共享最简单的方法。
(张 伟)