用jsp简单实现C语言标准化测试系统

C语言标准化测试系统

在Web编程技术的学习过程中,我们小组为了深入理解相关技术原理,提升实践能力,开发了一个基于动态Web工程框架的C语言标准化考试系统。现在,就来和大家分享一下我们的项目经历。

一、实验目的剖析

这个项目主要是为了搞清楚Request和response对象的工作原理。Request对象负责和客户端“交流”,收集客户端传来的各种数据,像表单信息、Cookies,甚至服务器端的环境变量都能获取到。客户端可以通过表单提交数据,也能在网页地址后面添加参数来传递信息。服务器拿到这些数据后,经过逻辑处理,再用Response对象把信息反馈给用户,这样就完成了一次动态交互。同时,我们也希望借此掌握基于Servlet的动态Web工程框架搭建,熟练运用Request、Response等内置对象进行JSP编程。

二、系统设计与实现

(一)开发环境搭建

我们选择的开发环境包括Microsoft Windows 11操作系统,JDK8、TOMCAT 9作为开发工具,再搭配DreamWeaver CS5或Eclipse Developer for JavaEE进行代码编写,这些工具为项目的顺利推进提供了有力支持。

(二)代码实现细节

  1. 考试页面(exam.jsp):考试页面是考生答题的地方。页面用JSP编写,整体风格简洁明了。它的布局合理,题目排列有序,使用了HTML和CSS进行设计。比如,通过设置body的字体样式和边距,让页面看起来更加舒适;h1标签用于显示页面标题,突出主题;每个题目都放在div容器中,设置了合适的边距和内边距,使题目之间区分明显。选项部分,使用input type="radio"创建单选框,搭配label标签关联选项文本,方便用户选择答案。最后,用一个submit按钮提交试卷,点击按钮后,表单数据会发送到GradeServlet进行处理。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>C语言标准化测试</title><style>body { font-family: Arial, sans-serif; margin: 20px; }h1 { color: #333; }.question { margin-bottom: 15px; padding: 10px; }.options { margin-left: 20px; }.submit-btn { padding: 10px 20px; background-color: #4CAF50; color: white; border: none; cursor: pointer; font-size: 16px;}</style>
</head>
<body><h1>C语言标准化测试</h1><form action="GradeServlet" method="post"><!-- 题目内容 --><input type="submit" value="提交试卷" class="submit-btn"></form>
</body>
</html>

效果图:
在这里插入图片描述

  1. 评分Servlet(GradeServlet.java):评分模块是整个系统的核心逻辑部分。它继承自HttpServlet,通过@WebServlet("/GradeServlet")注解映射到指定的URL。在doPost方法中,首先获取用户在考试页面提交的答案,存放在数组userAnswers中。接着,将用户答案与预设的正确答案数组ANSWERS进行比对,计算得分。每答对一题得10分,答错不得分。最后,把得分、答题对错情况、用户答案和正确答案等信息通过request.setAttribute方法设置到请求属性中,再将请求转发到结果页面result.jsp
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/GradeServlet")
public class GradeServlet extends HttpServlet {private static final long serialVersionUID = 1L;// 正确答案private static final String[] ANSWERS = {"C", "A", "C", "D", "C","B","A","C","B","A"};private static final int QUESTIONS_COUNT = 10;private static final int SCORE_PER_QUESTION = 10;protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取用户答案String[] userAnswers = new String[QUESTIONS_COUNT];for(int i=0;i<QUESTIONS_COUNT;i++) {userAnswers[i] = request.getParameter("q"+(i+1));}// 计算得分int score = 0;boolean[] correct = new boolean[QUESTIONS_COUNT];for (int i = 0; i < QUESTIONS_COUNT; i++) {if (userAnswers[i] != null && userAnswers[i].equals(ANSWERS[i])) {score += SCORE_PER_QUESTION;correct[i] = true;} else {correct[i] = false;}}// 设置结果属性request.setAttribute("score", score);request.setAttribute("correct", correct);request.setAttribute("userAnswers", userAnswers);request.setAttribute("answers", ANSWERS);// 转发到结果页面request.getRequestDispatcher("result.jsp").forward(request, response);}
}
  1. 结果页面(result.jsp):结果页面主要用来展示考试成绩。页面同样是JSP页面,通过EL表达式(如${score})获取后端传递过来的分数信息,并进行显示。页面样式美观大方,使用了CSS进行精心设计。比如,通过result-page类设置页面整体布局,让内容垂直水平居中显示;result-container类控制结果容器的样式,添加了边框圆角和阴影效果;result类突出显示分数,设置了较大的字体、绿色的文本颜色和背景色;return-btn类为“返回考试页面”按钮添加了样式和交互效果,鼠标悬停时背景色会发生变化。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head><title>测试结果</title><link rel="stylesheet" href="styles.css">
</head>
<body class="result-page"><div class="container result-container"><h1>您的测试结果</h1><div class="result">您本次C语言测试成绩: <strong>${score}</strong> 分 </div><a href="exam.jsp" class="return-btn">返回考试页面</a></div>
</body>
</html>
.result-page {display: flex;justify-content: center;align-items: center;min-height: 100vh;
}.result-container {text-align: center;padding: 40px 30px;border-radius: 15px;box-shadow: 0 0 20px rgba(0,0,0,0.15);
}.result {font-size: 2.5em;color: #4CAF50;font-weight: bold;margin: 20px 0;padding: 20px;border-radius: 10px;background-color: #e8f5e9;
}.return-btn {display: inline-block;padding: 12px 30px;background-color: #4CAF50;color: white;text-decoration: none;border-radius: 5px;font-size: 1.1em;transition: background-color 0.3s;
}.return-btn:hover {background-color: #45a049;
}

结果界面的效果图:
在这里插入图片描述

(三)项目结构图

在这里插入图片描述

三、项目测试与优化

在测试过程中,遇到了不少问题。比如,当用户有题目未作答时,会出现NullPointerException错误。我们通过在评分逻辑中增加判空处理,解决了这个问题。还有,将项目部署到云端时,由于本地和云端的JDK版本不同,出现了500错误。后来把云端的JDK版本改成和本地一致,重新部署后问题就解决了。经过反复测试和优化,系统在浏览器中能够稳定运行,不管是页面跳转,还是不同答案输入下的评分,都准确无误。

四、项目成果与收获

(一)系统功能完善

最终,我们成功完成了基于JSP/Servlet的动态Web考试系统。考试页面能展示C语言标准化试题,评分模块可以自动评分,结果页面也能清晰地显示得分。这个系统虽然还有一些可以优化的地方,但已经基本满足了C语言标准化测试的需求。

(二)技术能力提升

通过这次实验,我们深入理解了JSP/Servlet的核心技术,特别是Request/Response对象在Web交互中的关键作用。以前对这些技术的理解停留在理论层面,通过实际项目开发,真正掌握了它们的应用。同时,学会了使用EL表达式简化JSP页面开发,这让我们在开发过程中能够更高效地获取和显示数据。

(三)团队协作经验

这次项目是团队合作的成果。小组四人分工明确,各展所长,在遇到问题时一起讨论解决。通过这次合作,我们的团队协作能力得到了很大提升,也为今后的项目积累了宝贵的经验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QMK键盘固件自定义指南 - 打造你的专属键盘体验

QMK键盘固件自定义指南 - 打造你的专属键盘体验 &#x1f680; 前言 在机械键盘的世界里&#xff0c;QMK固件让你的键盘不再只是简单的输入设备&#xff0c;而是可以按照你的意愿定制的强大工具。本文将深入浅出地介绍如何自定义QMK键盘的行为&#xff0c;从基础概念到高级应…

5.9培训

文件上传 先找文件上传的地方&#xff0c;打开代理链接BP&#xff0c;它需要一个xls文件 我们创建一个sqzr.xls bp拦截了之后&#xff0c;我们修改请求&#xff0c;把后缀改成php&#xff0c;发送请求 找到我们的静态资源所在的位置 访问http://192.168.1.100:81/static/upload…

【FAQ】HarmonyOS SDK 闭源开放能力 — PDF Kit

1.问题描述&#xff1a; 预览PDF文件&#xff0c;文档上所描述的loadDocument接口&#xff0c;可以返回文件的状态&#xff0c;并无法实现PDF的预览&#xff0c;是否有能预览PDF相关接口&#xff1f; 解决方案&#xff1a; 1、执行loadDocument进行加载PDF文件后&#xff0c…

AutoDL实现端口映射与远程连接AutoDL与Pycharm上传文件到远程服务器(李沐老师的环境)

文章目录 以上配置的作用前提AutoDL实现端口映射远程连接AutoDLPycharm上传文件到远程服务器以上配置的作用 使用AutoDL的实例:因本地没有足够强的算力,所以需要使用AutoDL AutoDL端口映射:当在实例上安装深度学习的环境,但因为实例的linux系统问题,无法图形化显示d2l中的文件…

【Linux系列】跨平台安装与配置 Vim 文本编辑器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

CountDownLatch 并发编程中的同步利器

CountDownLatch 并发编程中的同步利器 文章目录 CountDownLatch 并发编程中的同步利器一、CountDownLatch 基础概念1.1 什么是 CountDownLatch&#xff1f;1.2 CountDownLatch 的核心方法1.3 基本使用示例 二、CountDownLatch 实战应用2.1 应用场景一&#xff1a;并行任务协调2…

Linux 内核链表宏的详细解释

&#x1f527; Linux 内核链表结构概览 Linux 内核中的链表结构定义在头文件 <linux/list.h> 中。核心结构是&#xff1a; struct list_head {struct list_head *next, *prev; }; 它表示一个双向循环链表的节点。链表的所有操作都围绕这个结构体展开。 &#x1f9e9; …

分书问题的递归枚举算法

分数问题的递归枚举算法 一、问题引入二、解题步骤1.问题分析思维导图2.解题步骤 三、代码实现1.代码2.复杂度分析 四、个人总结 一、问题引入 分书问题是指&#xff1a;已知 n 个人对 m 本书的喜好&#xff08;n≤m&#xff09;&#xff0c;现要将 m 本书分给 n 个人&#xf…

密码学--AES

一、实验目的 1、完成AES算法中1轮加密和解密操作 2、掌握AES的4个基本处理步骤 3、理解对称加密算法的“对称”思想 二、实验内容 1、题目内容描述 &#xff08;1&#xff09;利用C语言实现字节代换和逆向字节代换&#xff0c;字节查S盒代换 &#xff08;2&#xff09;利…

【工具记录分享】提取bilibili视频字幕

F12大法 教程很多 但方法比较统一 例快速提取视频字幕&#xff01;适用B站、AI字幕等等。好用 - 哔哩哔哩 无脑小工具 哔哩哔哩B站字幕下载_在线字幕解析-飞鱼视频下载助手 把链接扔进去就会自动生成srt文件 需要txt可以配合&#xff1a; SRT转为TXT

使用fdisk 、gdisk管理分区

用 fdisk 管理分区 fdisk 命令工具默认将磁盘划分为 mbr 格式的分区 命令&#xff1a; fdisk 设备名 fdisk 命令以交互方式进行操作的&#xff0c;在菜单中选择相应功能键即可 [rootlocalhost ~]# fdisk /dev/sda # 对 sda 进行分区 Command (m for help): # 进入 fdis…

【Linux基础】程序和软件安装管理命令

目录 install命令 which命令 install命令 作用&#xff1a;它是用于安装或复制文件到指定位置&#xff0c;并且可以同时设置文件的权限、所有者和所属组等属性。它通常用于脚本中&#xff0c;用于自动化安装程序或配置文件的部署。 基本用法&#xff1a; install [选项] 源…

C++模板梳理

目录 函数模板 类模板 变量模板 模板全特化 模板偏特化 模板显式实例化解决文件分离问题 折叠表达式 模板的二阶段编译 待决名(dependent name) SFINAE 概念与约束 函数模板 函数模板不是函数&#xff0c;只有实例化的函数模板&#xff0c;编译器才能生成实际的函数…

数据链共享:从印巴空战到工业控制的跨越性应用

摘要 本文通过对印巴空战中数据链共享发挥关键作用的分析&#xff0c;引出数据链共享在工业控制领域同样具有重大价值的观点。深入阐述 DIOS 工业控制操作系统作为工业数据链共享基础技术的特点、架构及应用优势&#xff0c;对比空战场景与工业控制场景下数据链共享的相…

巡检机器人数据处理技术的创新与实践

摘要 随着科技的飞速发展&#xff0c;巡检机器人在各行业中逐渐取代人工巡检&#xff0c;展现出高效、精准、安全等显著优势。当前&#xff0c;巡检机器人已从单纯的数据采集阶段迈向对采集数据进行深度分析的新阶段。本文探讨了巡检机器人替代人工巡检的现状及优势&#xff0c…

在 Flink + Kafka 实时数仓中,如何确保端到端的 Exactly-Once

在 Flink Kafka 构建实时数仓时&#xff0c;确保端到端的 Exactly-Once&#xff08;精确一次&#xff09; 需要从 数据消费&#xff08;Source&#xff09;、处理&#xff08;Processing&#xff09;、写入&#xff08;Sink&#xff09; 三个阶段协同设计&#xff0c;结合 Fli…

当可视化遇上 CesiumJS:突破传统,打造前沿生产配套方案

CesiumJS 技术基础介绍 CesiumJS 是一款基于 JavaScript 的开源库&#xff0c;专门用于创建动态、交互式的地理空间可视化。它利用 WebGL 技术&#xff0c;能够在网页浏览器中流畅地渲染高分辨率的三维地球和地图场景。CesiumJS 支持多种地理空间数据格式&#xff0c;包括但不…

RabbitMQ深入学习

继续上一节的学习&#xff0c;上一节学习了RabbitMQ的基本内容&#xff0c;本节学习RabbitMQ的高级特性。 RocketMQ的高级特性学习见这篇博客 目录 1.消息可靠性1.1生产者消息确认1.2消息持久化1.3消费者消息确认1.4消费失败重试机制1.5消息可靠性保证总结 2.什么是死信交换机…

Linux系统:虚拟文件系统与文件缓冲区(语言级内核级)

本节重点 初步理解一切皆文件理解文件缓冲区的分类用户级文件缓冲区与内核级文件缓冲区用户级文件缓冲区的刷新机制两级缓冲区的分层协作 一、虚拟文件系统 1.1 理解“一切皆文件” 我们都知道操作系统访问不同的外部设备&#xff08;显示器、磁盘、键盘、鼠标、网卡&#…

在c++中老是碰到string,这是什么意思?

定义一个string类型变量的引用&#xff0c;相当于给现有变量起个别名&#xff0c;与指针还是不一样的。比如string a;string& ba;这两句&#xff0c;b与a实际上是一回事&#xff0c;表示的是同一块内存。 std是系统的一个命名空间(有关命名空间可以参阅namespace_百度百科)…