第十章 综合编程实例 前9章分别介绍了JSP概念、运行环境、页面组成、各种技术的应用方法。本章将综合各章概念、技术和方法,把这些概念、技术和方法运用到实际应用当中,使读者对JSP技术和应用有更深刻的理解。本章涉及到4个应用:留言板、成绩管理、问卷调查和在线考试。 学习目标 理解4个应用的设计原理和设计方法 学会设计合理的程序结构 提高综合运用各项编程技术和方法
10.1 留言板 10.1.1 留言设计原理 本系统实现客户在留言版上留下自已的姓名、邮箱和留言内容。 1. 系统构成。 10.1 留言板 本系统实现客户在留言版上留下自已的姓名、邮箱和留言内容。 10.1.1 留言设计原理 1. 系统构成。 本系统由三个页面文件和一个文本文件构成。它们的作用如表10-1所示。 表10-1 文件名 作用 Form.jsp 提供一个窗口,客户在此窗口中输入留言 setMsg.jsp 将客户输入的留言写入文件Message.txt,并输出留言 showMsg.jsp 将所有留言显示出来 Message.txt 客户每次输入的留言都保存在该文件中
2.系统执行流程 本系统执行流程如图10-1所示。 setMsg.jsp 页面 showMsg.jsp Form.jsp 写好了 showMsg.jsp Form.jsp 回留言板 Message.txt 写入 读出 查看留言 图10-1 系统执行流程
10.1.2输入留言 Form.jsp: 提供一个客户输入留言的窗口。本模块由Form.jsp页面实现。 程序算法: Form.jsp: 1.创建表单,该表单包含两个文本框和一个文本区,分别用来录入留言者姓名、邮箱和留言内容。 2.创建一个连接,连接到showMsg.jsp页面。
10.1.3保存留言 将客户输入的留言保存到文件Message.txt中。本模块由setMsg.jsp页面实现。 程序算法: 2.以文件名Message.txt为参数构造文件输出流:fw 3.以fw为参数构造缓冲输出流:bw 4.将客户留言信息(Msg)写入缓冲输出流bw中。 5.关闭流bw,fw 6.将客户留言输出到客户端。 7.建立超连接,连接到Form.jsp页面。
10.1.4查看留言 读取文件Message.txt中的所有留言,输出到客户端。本模块由showMsg.jsp页面实现。 程序算法: showMsg.jsp: 1.以文件名Message.txt为参数,构造文件对象:f 2.以f为参数,构造文件输入流:in 3.以in为参数,构造缓冲输入流:bufferin 4.将缓冲输入流(bufferin)中的数据输出到客户端。 5.建立超连接,连接到Form.jsp页面。
10.2 成绩管理系统 本系统实现用户登录、成绩管理、成绩录入、修改、查询、删除等6个摸块。 10.2.1成绩管理系统设计原理 系统构成。 10.2 成绩管理系统 本系统实现用户登录、成绩管理、成绩录入、修改、查询、删除等6个摸块。 10.2.1成绩管理系统设计原理 系统构成。 本系统由6个模块组成。它们是用户登录模块、成绩管理模块、成绩录入模块、成绩修改模块、成绩查询模块、成绩删除模块共6个摸块组成。
模块设计 本系统模块结构如图10-2所示。 用户登录模块 成绩管理模块 成绩录入 成绩修改 成绩查询 成绩删除 图10-2 系统模块结构
学生表(students)的结构如表10-2所示;帐号表(Login)的结构如表10-3所示。 数据库设计 本系统包含两张表。一个是学生成绩表(students),该表保存学生成绩;一个是用户登录网站的帐号表(Login),该表保存用户帐号。两张表属于数据库db.mdb中。 学生表(students)的结构如表10-2所示;帐号表(Login)的结构如表10-3所示。 表(students)10-2 字段名 数据类型 字段宽度 number 文本 5 name 10 math 单精度数字 自动 english phics
假设管理员在Login表中加入一条记录XM是ken,PW是123。则客户可以用此帐号和密码登录本系统。 字段名 数据类型 字段宽度 XM 文本 10 PW 假设管理员在Login表中加入一条记录XM是ken,PW是123。则客户可以用此帐号和密码登录本系统。
LogFrm.htm页面检查输入帐号的合法性;Login.jsp检查输入帐号的正确性。本登录模块与其它页面关系如图10-3所示。 10.2.2用户登录 在网站设计中,希望某些网页只有具有特定权限的用户才能访问。这时需要建立登录机制。这里假设由系统管理员给访问者分配帐号。只有具有帐号的客户才能访问网页。本系统实现登录模块的页面由LogFrm.htm和Login.jsp组成。 程序结构: LogFrm.htm页面检查输入帐号的合法性;Login.jsp检查输入帐号的正确性。本登录模块与其它页面关系如图10-3所示。
1.定义一函数datacheck(),检查帐号和密码输入的完整性。 2.创建一表单,该表单包含两个文本框,用于登录客户输入用户名和密码。 Login.jsp LoginSuccess.jsp LogFrm.htm 登录成功才进入此页面 登录失败 请重新登录 登录 图10-3 登录页面 程序算法: LogFrm.htm: 1.定义一函数datacheck(),检查帐号和密码输入的完整性。 2.创建一表单,该表单包含两个文本框,用于登录客户输入用户名和密码。
Login.jsp: 1.定义函数CheckLogin(String Login1, String Password1),检查帐号和密码的正确性。 2.获取表单的帐号(UserNm)和密码(UserPasswd)。 3.若帐号或密码为空,则转向LogFrm.htm页面。 4.检查帐号与密码的正确性 5.若帐号和密码正确,则将帐号和密码保存到session中,并转向LoginSuccess.jsp页面(成绩管理)。若登录失败,则执行以下语句。 6.输出登录失败原因(strCheckLogin)。 7. 建立超连接,连接到LogFrm.htm页面。
该模块只是提供一个界面,通过该界面进入成绩录入、成绩修改、成绩查询、成绩删除界面。 10.2.3成绩管理 该模块只是提供一个界面,通过该界面进入成绩录入、成绩修改、成绩查询、成绩删除界面。 程序结构: 该模块由LoginSuccess.jsp页面实现。下面是该模块与其它页面的交互关系如图10-4所示。 append_1.jsp (成绩录入) update_1.jsp (成绩修改) LoginSuccess.jsp (成绩管理) del/del_1.jsp (删除记录) query_1.jsp (成绩查询) LogFrm.htm (登录模块) 若客户未登录 成绩录入 成绩查询 成绩修改 删除记录 图10-4 成绩管理模块
若帐号为空(表示客户还未登录),则定向到LogFrm.htm页面。 创建4个超连接,分别连接到4个页面。 程序算法: LoginSuccess.jsp 获取session中的帐号: Name 若帐号为空(表示客户还未登录),则定向到LogFrm.htm页面。 创建4个超连接,分别连接到4个页面。
10.2.4 成绩录入 该模块提供一个界面,用户在此界面录入学生成绩。 程序结构: 该模块由两个页面完成。append_1.jsp页面提供成绩录入界面,把成绩提交给append_2.jsp页面,由append_2.jsp页面把成绩保存到数据表(students)中。页面交互关系如图10-5所示。 append_1.jsp 成绩录入 append_2.jsp LoginSuccess.jsp (成绩管理) 添加 返回 添加数据 表(students) 图10-5 成绩录入模块
程序算法: 创建一个表单,该表单包含5个文本框,这些文本框用于输入学生成绩。 append_1.jsp: 创建一个表单,该表单包含5个文本框,这些文本框用于输入学生成绩。 提交该表单后,从session中获取添加执行标志(tianjia=成功|失败)。 创建一个超连接,该连接指向LoginSuccess.jsp页面。 append_2.jsp: 定义boolean insert()方法,该方法向students表中添加记录。 从表单中获取要添加的数据 调用insert(number,name,m,e,p)方法,添加数据到students表中。 若添加成功,则把属性-值对("tianjia","成功")加入session中。 否则把属性-值对("tianjia","失败")加入到session中。 返回到append_1.jsp页面。
10.2.5 成绩修改 该模块提供一个界面,用户通过此界面根据学号修改学生成绩。 程序结构: 该模块提供一个界面,用户通过此界面根据学号修改学生成绩。 程序结构: 该模块由两个页面完成。update_1.jsp页面提供一个修改成绩的界面,它把修改后的数据提交给update_2.jsp页面,update_2.jsp页面首先在表中查询该学号是否存在,若存在该学号,则执行查询。页面交互关系如图10-6所示。 update_1.jsp 成绩修改 update_2.jsp LoginSuccess.jsp (成绩管理) 更新 返回 修改数据 表(students) 图10-6 成绩修改模块
程序算法: update_1.jsp: 1. 创建一个表单,该表单包含4个文本框,用于输入关键字(学号)和修改后的成绩。 2. 提交该表单后,从session中获取修改执行标志(xiugai=成功|失败|无此学号) 3. 输出修改执行标志:xiugai 4.创建一个超连接,连接到LoginSuccess.jsp页面。
update_2.jsp: 1.定义方法boolean query(String number),该方法查询学号为number的学生是否存在,若存在返回值为true,否则为false。 2.定义方法String update(),该方法修改学号为number的成绩。方法返回值有三种情况:"修改成功"| "修改失败"| "没有这个学号" 3.从表单中获取学号和新的成绩数据。 4.执行修改操作:del=update(number, math,english, physics)。 5. 根据执行情况,将属性-值对 ("xiugai",del)加入到session中。 6.重新定向到update_1.jsp页面。
10.2.6 成绩查询 根据学号查询学生的成绩。 程序结构: 该模块由两个页面完成。在query_1.jsp页面中输入学号,提交给query_2.jsp页面,query_2.jsp页面完成学生查询。页面交互关系如图10-7所示。 query_1.jsp 成绩查询 query_2.jsp LoginSuccess.jsp (成绩管理) 查询 返回 查询数据 表(students) 图10-7 成绩查询模块
程序算法: query_1.jsp: 1.创建一个表单,该表单包含一个文本框,客户在此框输入学号。 2.提交该表单后,从session中获取结果集:rs。 3.以表格形式输出结果集数据:rs。 4.创建一超连接,连接到LoginSuccess.jsp页面。 query_2.jsp: 1.定义方法ResultSet chaxun(String number),该方法获取学号是number的结果集。 2.从表单中获取学号:number。 3.执行查询,获得结果集数据:shu 4.如果shu不为空,则把属性-值对("rs",shu)加入session 中。 5.重新定向到query_1.jsp页面。
10.2.7 删除记录 根据学号删除学生记录。 程序结构: 10.2.7 删除记录 根据学号删除学生记录。 程序结构: 该模块由两个页面完成。在del_1.jsp页面中输入学号,提交给del_2.jsp页面,del_2.jsp页面完成学生记录删除。页面交互关系如图10-8所示。 del_1.jsp 删除记录 del_2.jsp LoginSuccess.jsp (成绩管理) 删除 返回 表(students) 图10-8 成绩删除模块
程序算法: del_1.jsp: 1.创建一个表单,该表单包含一文本框,客户在此框中输入学号。 2.提交表单后,从session中获取删除标志(del),del有3种取值:"删除成功"|"删除失败"|"没有这个学号" 。 3.输出删除标志del。 4.创建一个超连接,连接到LoginSuccess.jsp页面。
del_2.jsp: 定义方法boolean query(String number),查询学号是number的学生。查找成功,则返回值为true,否则返回值是false。 定义方法String del(String number) ,删除学号是number的学生。返回结果标志有3种值:"删除成功"|"删除失败"|"没有这个学号"。 获取表单提交的学号number 。 执行删除操作:del(number)。 根据删除返回的标志("删除成功"|"删除失败"|"没有这个学号"),向session中,添加相应的属性-值对。 重新定向到del_1.jsp页面。
10.3 问卷调查 本题以试卷的方式,调查客户意见,并对调查结果作出统计。问卷包括3道题目,每道题目包含相同的5个选项。 10.3.1问卷设计原理 系统构成 本系统由4个模块构成。它们是问卷界面模块、数据库连接模块(组件)、保存问卷记录模块(组件)、查看问卷结果模块。
模块的作用 4个模块的作用如表10-4所示。 模块名 模块作用 DBCon.java 建立与数据库的连接:组件 QusBean.java 保存问卷题目,选项,问卷记录:组件 QusFrm.jsp 产生问卷调查界面,客户在此界面选择选项 QusRes.jsp 从库中获取调查结果,并加以统计显示
本系统包含一张问卷表(Qus),该表保存问卷数据。表(Qus)保存在数据库db.mdb中。问卷表(Qus)的结构如表10-5所示 。 数据库设计 本系统包含一张问卷表(Qus),该表保存问卷数据。表(Qus)保存在数据库db.mdb中。问卷表(Qus)的结构如表10-5所示 。 表(Qus)10-5 字段名 数据类型 字段宽度 字段作用 ID 文本 自动 关键字段 Qus1 数字 第一题选项值 Qus2 第二题选项值 Qus3 第三题选项值 说明:问卷中,每一题有5个选项,当客户选择第1选项时,其选项值就是1,如此类推,当客户选择第i个选项时,其选项值就是i。i的取值是:1~5。
该模块产生一个问卷界面,客户在此界面选择自已对问题的答案。该模块由QusFrm.jsp页面实现。 10.3.2 创建问卷界面 该模块产生一个问卷界面,客户在此界面选择自已对问题的答案。该模块由QusFrm.jsp页面实现。 程序结构: QusFrm.jsp页面从Qus组件(由类QusBean.class创建)中获取问题和选项,创建问卷界面。然后把客户选择的答案提交给Qus组件。由Qus组件把客户选择的答案保存到数据表Qus中。本页面与其它页面(组件)的交互关系如图10-9所示。
QusFrm.jsp QusRes.jsp 统计结果 表Qus Param(客户答案) Return( ) Param( ) Return(试题) 连接 客户答案写入Qus表中 提交客户答案 DBCon.java (组件) QusBean.java 图10-9 创建问卷界面
用类small.dog.QusBean创建组件,组件名为qus。 程序算法: QusFrm.jsp 用类small.dog.QusBean创建组件,组件名为qus。 若提交控件(submit1)的值为空(还未创建问卷界面), 则执行下面步骤(来创建问卷界面),否则转第5步。 输出组件qus的标题(title)和副标题(subTitle)属性值。 输出问卷题目和选项,转第6步。 将问卷数据加入数据库表Qus中。 结束。
本模块由两个组件来完成。其功能是把客户的答案保存到数据库表中。 10.3.3 保存问卷答案 本模块由两个组件来完成。其功能是把客户的答案保存到数据库表中。 程序结构: DBCon.java 组件实现数据库连接。QusBean.java 组件有两个方面的作用: 保存问卷题目和每个题目的选项(用于创建问卷界面)。 将用户选择的问卷答案加入数据库表Qus中。 说明:两个类文件(DBCon.class, QusBean.class)部署在small.dog包中。
此模块由一个QusRes.jsp页面实现,其作用是从数据库中获取客户的答卷数据并加以统计,用条状图方式输出问卷结果。 10.3.4 查看问卷结果 此模块由一个QusRes.jsp页面实现,其作用是从数据库中获取客户的答卷数据并加以统计,用条状图方式输出问卷结果。 程序算法: QusRes.jsp 用类small.dog.DBCon创建连接对象:con。 用类small.dog.QusBean创建问卷对象:qus。 输出问卷bean(qus)的标题(title)和副标题(subTitle) 属性值 。 用第1层循环输出问卷题目 用第2层循环输出选项和该选项选中的百分比(用长形条表示)
10.4 在线考试 本系统的考试题由系统从题库中随机抽取,每道试题包含4个选项(单选),考生做完试题交卷后,系统自动改卷,自动评分。 10.4 在线考试 本系统的考试题由系统从题库中随机抽取,每道试题包含4个选项(单选),考生做完试题交卷后,系统自动改卷,自动评分。 10.4.1 考试设计原理 系统构成 本系统由三个模块组成。它们是产生试卷模块、获取试题题(组件)和改卷模块。
本数据库包含一张表(Exam),该表用来存放考试题目、每道题的四个选项、答案编号。该表结构如表10-7所示。 模块的作用 各模块的作用如表10-6所示。 表10-6 文件名 作用 TopicBean 组件。获取库中的题目,选项,答案 Exam.jsp 产生考题界面 ExamRes.jsp 改卷 数据库设计 本数据库包含一张表(Exam),该表用来存放考试题目、每道题的四个选项、答案编号。该表结构如表10-7所示。
字段名 数据类型 字段宽度 字段作用 QID 文本 自动 关键字段 Qus 255 考题 Opt1 50 第1选项。对应编号是:1 Opt2 表(Exam)10-7 字段名 数据类型 字段宽度 字段作用 QID 文本 自动 关键字段 Qus 255 考题 Opt1 50 第1选项。对应编号是:1 Opt2 第2选项。对应编号是:2 Opt3 第3选项。对应编号是:3 Opt4 第4选项。对应编号是:4 Ans 1 答案编号,取值:1~4
系统执行流程 本系统执行流程如图10-10所示。 Exam.jsp ExamRes.jsp 表:Exam TopicBean.java 提交答案 表:Exam Param( ) Return(题目,选项,答案编号) 从表Exam中读取题目,选项,答案编号 TopicBean.java (组件) 图10-10 执行流程
10.4.2 产生试卷 本模块由Exam.jsp页面实现。它从Exam表中获取题目、选项和 答案编号,创建试卷,客户在试卷上选择答案。 程序算法: Exam.jsp 用类small.dog.TopicBean 创建一个bean,其名称是top。 声明一个结果集类型的变量:rs 创建表单,该表单数据提交给ExamRes.jsp页面。 获取组件top的结果集:rs(包含Exam表的所有记录) 创建一个布尔型数组chcQus[],用来标识表中已被选取的题目。 创建随机数对象:Rnd。 通过外循环随机产生7道试题。把正确答案编号(Ans) 、试题(Qus)、正确答案(Opt),分别以属性名"Ans" + i 、"Qus" + i 、"RghOpt" + i保存到session对象中。 通过内循环为每道试题产生4个单选按钮和选项。
10.4.3 获取试题 本模块由组件(TopicBean.java)实现的。其功能是从试题库(表:Exam)中获取试题和答案(rs)。 程序算法: TopicBean.java 定义三个成员变量,分别保存连接对象(con)、语句对象(stmt)、结果集对象(rs)。 定义构造方法TopicBean()。加载驱动程序、创建连接对象和语句对象。 定义方法ResultSet getRs(String sql)。获取sql语句的结果集。 定义方法closeBean()。释放各种对象
本模块(ExamRes.jsp)获取客户提交的答案,并与试题库(表:Exam)中的正确答案比较来批改试题,最后统计考生的得分。 10.4.4 批改试卷 本模块(ExamRes.jsp)获取客户提交的答案,并与试题库(表:Exam)中的正确答案比较来批改试题,最后统计考生的得分。 程序算法: ExamRes.jsp 声明变量(RightAns),用来保存客户答对试题的数目。 通过循环语句(遍历试题),批改每道试题 。批改步骤如下: 从session对象中获取正确答案编号(Ans)。 从表单中获取客户提交的答案编号(UserAns)。 若客户提交的答案编号为空,即未选择答案(UserAns == null),则输出:试题,正确答案编号,答案。 若客户选择的答案与正确答案相同,则输出信息:答对了 若客户选择了错误的答案,则输出信息:答错了,试题,正确答案编号,答案。 输出答对题的数目:RightAns。
本章小结 本章具体实例介绍了四个应用系统的编程思路,它们是留言板、成绩管理、问卷调查和在线考试,他们综合运用了JSP技术和方法。通过本章的学习,使我们加深对相关的概念、方法和技术的理解和灵活运用。
习题 1.以你所在的学校的教学业务为例,请用JSP技术开发网上教学评估系统。