web开发——基于动态Web工程框架的标准化考试系统的设计

  • 实验目的

理解Request、response对象的作用,Request对象的作用是与客户端交互,收集客户端的Form、Cookies、超链接,或者收集服务器端的环境变量。客户端可通过表单或在网页地址后面提供参数的方法提交数据,然后服务器通过Servlet控制器获得request对象封装的这些数据,经过逻辑运算后利用Response对象发送信息给用户,完成对客户端的动态响应,掌握基于Servlet的动态Web工程框架的搭建,熟悉Request、Response等内置对象在JSP编程中的运用;

二、  实验内容与设计思想

如下图1、图2所示编写两个页面程序,一个JSP页面作为单选题标准化考试页面,另一个是JSP评分页面,该评分页面利用request对象提取考试页面中的答题信息进行试卷评分,并最终给出成绩。

图1

图2

三、  实验使用环境

操作系统:  Microsoft Windows 10

编程环境:JDK1.8  、 TOMCAT 8 、DreamWeaver CS5/Eclipse Developer for JavaEE

、实验步骤和调试过程(写出完整的代码并附上清晰的效果截图)

package com.example.servlet;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/score")

public class ScoreServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 设置请求和响应的字符编码

request.setCharacterEncoding("UTF-8");

response.setContentType("text/html;charset=UTF-8");

// 获取表单参数并计算分数

int score = 0;

String q1 = request.getParameter("q1");

String q2 = request.getParameter("q2");

String q3 = request.getParameter("q3");

String q4 = request.getParameter("q4");

String q5 = request.getParameter("q5");

// 判断答案并计分(正确答案:C、A、C、D、C)

if ("C".equals(q1)) score += 20;

if ("A".equals(q2)) score += 20;

if ("C".equals(q3)) score += 20;

if ("D".equals(q4)) score += 20;

if ("C".equals(q5)) score += 20;

// 将分数存入请求属性

request.setAttribute("score", score);

// 转发到结果页面

request.getRequestDispatcher("/result.jsp").forward(request, response);

}

}

接收表单提交的答案参数(q1-q5)

比对正确答案(C、A、C、D、C),每题 20 分

计算总分后将结果存入 request 属性

转发到result.jsp页面显示结果

2. 修改前端表单(exam.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

<title>C语言标准化测试</title>

</head>

<body>

<h2>C语言标准化测试</h2>

<form action="score" method="post">

<!-- 题目内容保持不变 -->

<p>1. C语言程序是由 构成的。</p>

<input type="radio" name="q1" value="A"> A) 一些可执行语言<br>

<input type="radio" name="q1" value="B"> B) main函数<br>

<input type="radio" name="q1" value="C"> C) 函数<br>

<input type="radio" name="q1" value="D"> D) 包含文件中的第一个函数<br><br>

<p>2. 是构成C语言程序的基本单位。</p>

<input type="radio" name="q2" value="A"> A) 函数<br>

<input type="radio" name="q2" value="B"> B) 过程<br>

<input type="radio" name="q2" value="C"> C) 子程序<br>

<input type="radio" name="q2" value="D"> D) 子例程<br><br>

<p>3. C语言可执行程序从 开始执行。</p>

<input type="radio" name="q3" value="A"> A) 程序中第一条可执行语句<br>

<input type="radio" name="q3" value="B"> B) 程序中第一个函数<br>

<input type="radio" name="q3" value="C"> C) 程序中的main函数<br>

<input type="radio" name="q3" value="D"> D) 包含文件中的第一个函数<br><br>

<p>4. C语言程序从main()函数开始执行,所以这个函数要写在 。</p>

<input type="radio" name="q4" value="A"> A) 程序文件的开始<br>

<input type="radio" name="q4" value="B"> B) 程序文件的最后<br>

<input type="radio" name="q4" value="C"> C) 它所调用的函数的前面<br>

<input type="radio" name="q4" value="D"> D) 程序文件的任何位置<br><br>

<p>5. 以下说法中正确的是 。</p>

<input type="radio" name="q5" value="A"> A) C语言程序总是从第一个定义的函数开始执行<br>

<input type="radio" name="q5" value="B"> B) 在C语言程序中,要调用的函数必须在main()函数中定义<br>

<input type="radio" name="q5" value="C"> C) C语言程序总是从main()函数开始执行<br>

<input type="radio" name="q5" value="D"> D) C语言程序中的main()函数必须放在程序的开始部分<br><br>

<input type="submit" value="提交">

</form>

</body>

</html>

创建了一个包含 5 道单选题的测试表单

每道题有 4 个选项(A-D),使用 radio 按钮实现单选题功能

表单通过 POST 方法提交到/score路径

3. 创建结果展示页面(result.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

<title>测试结果</title>

</head>

<body>

<h1>测试成绩</h1>

<p style="color:red; font-size:24px;">

您的得分:<%= request.getAttribute("score") %>

</p>

<% 

Integer score = (Integer) request.getAttribute("score");

if (score != null) {

if (score >= 60) {

%>

<p style="color:green; font-size:18px;">恭喜您通过测试!</p>

<% } else { %>

<p style="color:red; font-size:18px;">很遗憾未通过测试,请继续努力!</p>

<% }

}

%>

<a href="exam.jsp">返回重新测试</a>

</body>

</html>

显示用户得分(红色 24px 字体)

根据分数判断:

得分≥60 分:显示绿色 "恭喜通过"

得分< 60 分:显示红色 "未通过,请努力"

提供返回按钮以便重新测试

Exam页面运行结果

成绩提交,大于等于60分显示如上图。

成绩提交,小于60分显示如上图。

同时配有返回键可重复完成测试。

实验小(必写)

   

本次实验聚焦于基于动态 Web 工程框架的标准化考试系统设计,在深入理解 Request、response 对象以及 Servlet、JSP 技术的基础上展开实践,收获颇丰。

从知识技能层面来看,通过实际编写代码,切实掌握了 Request 对象收集客户端数据、response 对象向客户端发送信息的工作机制。在 Servlet 中利用request.getParameter()获取表单数据,再结合request.setAttribute()和request.getRequestDispatcher().forward()实现数据在不同组件间的传递与页面跳转,深刻体会到了 Servlet 作为控制器在 Web 应用中的关键作用。在 JSP 页面中,无论是使用脚本代码还是 EL 表达式,都能有效展示数据和实现逻辑判断,这极大地提升了我们对 JSP 编程的熟练程度。

从系统实现角度分析,成功搭建了一个具备基本功能的标准化考试系统。前端的 JSP 页面设计了包含 5 道单选题的测试表单,使用radio按钮实现单选功能,并通过 POST 方法将数据提交给 Servlet。Servlet 准确接收数据、计算分数并将结果传递给结果展示页面。结果页面根据分数进行条件判断,展示不同的反馈信息,并提供返回按钮以便重新测试。整个系统流程清晰、功能完整,达到了实验预期目标。

不过,在实验过程中也遇到了一些问题。比如,在设置字符编码时曾出现乱码情况,经过仔细排查,发现是部分页面和 Servlet 中的编码设置不一致导致的,统一编码设置后问题得以解决。另外,在使用 EL 表达式获取数据时,由于对作用域理解不够深入,出现了数据获取失败的情况,通过查阅资料和调试,最终明确了数据存储和获取的正确方式。

针对这些问题,我们深入学习和研究,进一步加深了对 Web 编程技术的理解。这也让我们认识到在开发过程中,细节的处理至关重要,任何一个小的疏忽都可能导致系统出现错误。同时,在团队协作完成实验的过程中,成员之间的沟通交流也非常关键,通过相互讨论和协作,能够更快地解决问题,提高开发效率。

 

六、附录

《Web程序设计》,余元辉,清华大学出版社,2019.4第1版

《JSP设计》(第三版),Hans Bergsten主编,林琪、朱涛江翻译 O'Reilly Media,Inc 2014年。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值