JavaWeb 项目 --- 在线 OJ 平台 (三)

article/2025/10/22 22:58:35

文章目录

  • 1. 设计网页页面
    • 1.1 列表页
    • 1.2 详情页
  • 2. 设计网页的前后端交互接口
    • 约定交互1: 获取题目的列表
    • 约定交互2: 获取指定题目的详情信息
    • 约定交互3: 向服务器提交编写的代码
  • 3. 服务器的API
    • 3.1 导入 JackSon 库
    • 3.2 创建 ProblemServlet 类
    • 3.3 测试 ProblemServlet 类
    • 3.4 创建 DescServlet 类
    • 3.5 测试 DescServlet 类
    • 3.6 创建 ResultServlet 类
      • 静态内部类 ResultRequest
      • 静态内部类 ResultResponse
      • 实现 doPost
      • 实现 readBody 方法
      • 实现 mergeCode 方法
    • 3.7 测试 ResultServlet 类
    • 3.8 这里发现 如果 id不存在 或者 code为空的时候出现服务器错误.
    • 3.9 再次对 ResultServlet 进行测试

1. 设计网页页面

在这里插入图片描述

1.1 列表页

只是大概模板

在这里插入图片描述

1.2 详情页

只是大概模板

在这里插入图片描述

2. 设计网页的前后端交互接口

在这里插入图片描述

约定交互1: 获取题目的列表

在这里插入图片描述

约定交互2: 获取指定题目的详情信息

在这里插入图片描述

约定交互3: 向服务器提交编写的代码

在这里插入图片描述

3. 服务器的API

由于这些前后交互需要用到 json 格式去传入数据.(可以不用,但是我这里约定了使用这样的一个格式)

3.1 导入 JackSon 库

在这里插入图片描述

3.2 创建 ProblemServlet 类

创建 api 包, 在包下创建 这个类
这个类对应的是交互1

package api;import com.fasterxml.jackson.databind.ObjectMapper;
import dao.Problem;
import dao.ProblemDao;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;
import java.util.List;@WebServlet("/problem")
public class ProblemServlet extends HttpServlet {// 这个 ObjectMapper 是 Jackson 中的一个重要的类private final ObjectMapper objectMapper = new ObjectMapper();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setStatus(200);resp.setContentType("application/json;charset=utf8");// 获取全部的题目列表ProblemDao problemDao = new ProblemDao();List<Problem> problems = problemDao.selectAll();// 转化成json格式字符串String respString = objectMapper.writeValueAsString(problems);resp.getWriter().write(respString);}
}

在这里插入图片描述

3.3 测试 ProblemServlet 类

在这里插入图片描述

3.4 创建 DescServlet 类

同样在api包下, 创建 DescServlet 类
这个类对应交互2

package api;import com.fasterxml.jackson.databind.ObjectMapper;
import dao.Problem;
import dao.ProblemDao;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("/desc")
public class DescServlet extends HttpServlet {private final ObjectMapper objectMapper = new ObjectMapper();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setStatus(200);resp.setContentType("application/json;charset=utf8");// 首先获取到idString idString = req.getParameter("id");if(idString == null || "".equals(idString)){resp.setContentType("text/html;charset=utf-8");resp.getWriter().write("<h3>id丢失</h3>");return;}int id = Integer.parseInt(idString);// 获取对应id题目的详情页ProblemDao problemDao = new ProblemDao();Problem problem = problemDao.selectOne(id);// 将problem 转成json格式字符串 写回响应String respString = objectMapper.writeValueAsString(problem);resp.getWriter().write(respString);}
}

3.5 测试 DescServlet 类

在这里插入图片描述

3.6 创建 ResultServlet 类

同样放到 api 包里.
这个类对应的是交互3

由于这里请求也需要带着这个json格式.所以使用两个静态内部类来表示请求body和响应body的格式.

静态内部类 ResultRequest

    /*** 结果的请求body格式*/static class ResultRequest{public int id;public String code;}

静态内部类 ResultResponse

    /*** 结果的响应body格式*/static class ResultResponse{// error 0:运行成功 1: 编译出错 2: 运行出错 3:其他错误public int error;public String reason;public String stdout;}

实现 doPost

private final ObjectMapper objectMapper = new ObjectMapper();@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setStatus(200);resp.setContentType("application/json;charset=utf8");// 1. 读取请求正文, 按照json格式读取String body = readBody(req);ResultRequest resultRequest = objectMapper.readValue(body, ResultRequest.class);// 2. 根据 id 从数据库中查找到题目的测试用例ProblemDao problemDao = new ProblemDao();Problem problem = problemDao.selectOne(resultRequest.id);// 测试用例代码String testCode = problem.getTestCode();// 提交的代码String requestCode = resultRequest.code;// 3. 把用户提交的代码和测试用例的代码,给瓶装成一个完整的代码String finalCode = mergeCode(requestCode,testCode);// 4. 创建一个 Task 实例, 调用里面的 compileAndRun 来进行编译运行Task task = new Task();Question question = new Question();question.setCode(finalCode);Answer answer = task.compileAndRun(question);// 5. 根据 Task 运行的结果, 包装成一个 Http 响应ResultResponse resultResponse = new ResultResponse();resultResponse.error = answer.getError();resultResponse.reason = answer.getReason();resultResponse.stdout = answer.getStdout();String respString = objectMapper.writeValueAsString(resultResponse);resp.getWriter().write(respString);}

实现 readBody 方法

    /*** 读取请求的正文* @param req 请求* @return 以字符串形式返回* @throws UnsupportedEncodingException 字符编码不支持的异常*/private String readBody(HttpServletRequest req) throws UnsupportedEncodingException {// 1. 根据 Content-Length 获取 body 中的长度(单位是字节)int contentLength = req.getContentLength();// 2. 按照找个长度准备一个 byte[]byte[] buffer = new byte[contentLength];// 3. 通过 req 里面的 getInputStream 方法, 获取body的流对象(body比较长)try (InputStream inputStream = req.getInputStream()){// 4. 基于这个流对象,读取内容,将读取到内容放到byte[]数组中inputStream.read(buffer);} catch (IOException e) {e.printStackTrace();}// 5. 把这个 byte[] 的内容构造成一个 Stringreturn new String(buffer,"utf8");}

实现 mergeCode 方法

    /*** 测试用例代码和提交的代码合并* @param requestCode 提交的代码* @param testCode 测试用例代码* @return 返回合并后的代码*/private String mergeCode(String requestCode, String testCode) {// 找到最后一个"}"的位置int index =requestCode.lastIndexOf("}");if (index == -1){// 这里是不存在的情况return null;}// 截取前面的代码String curCode = requestCode.substring(0,index);// 拼接代码return curCode + testCode + "\n}";} 

3.7 测试 ResultServlet 类

打开postman应用
如果不会使用postman 可以看 博文 Postman的使用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.8 这里发现 如果 id不存在 或者 code为空的时候出现服务器错误.

更改代码
在这里插入图片描述
并在 comon包中 创建这两个类继承 Exception
在这里插入图片描述
在这里插入图片描述
当catch到异常的时候, 设置状态码为3
在这里插入图片描述

3.9 再次对 ResultServlet 进行测试

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/thcajf2S.shtml

相关文章

华为oj题目c语言,【华为OJ平台习题】

【华为OJ平台练习题】 /* 描述: 输入整型数组和排序标识&#xff0c;对其元素按照升序或降序进行排序 接口说明 原型&#xff1a; void sortIntegerArray(Integer[] pIntegerArray, int iSortFlag); 输入参数&#xff1a; Integer[] pIntegerArray&#xff1a;整型数组 int iSo…

HUSTOJ平台的搭建

HUSTOJ平台的搭建 首先&#xff0c;你要有一个服务器&#xff0c;本次记录的是阿里云Ubuntu18.04平台下的搭建 搭建LAMP环境(LAMP指的Linux&#xff08;操作系统&#xff09;、ApacheHTTP 服务器&#xff0c;MySQL&#xff08;有时也指MariaDB&#xff0c;数据库软件&#xff…

搭建学校oj平台-创建项目

创建项目 创建git 在gitee创建仓库 同步本地 云端本地成功 创建数据库&#xff08;学习mysql常用操作&#xff09; 连接用户名为root创建OJ数据库create database OJ;使用数据库OJuse OJ 创建后端项目 使用idea创建SpringBoot项目 选择Spring Initialize 创建项目 选择版…

OJ平台代码模板自动生成

文章目录 前言一、分析数据二、解析输入读取一个整数读取多行整数读取一行中的多个整数 三、解析输出打印一个整数打印一个整数数组 四、完整模板总结 前言 经常使用CSDN的小伙伴应该知道, 最近CSDN举办了好几期编程竞赛, 其中的编程模板, 都是有python脚本自动生成的, 这篇文…

OJ平台输入输出注意事项

文章目录 输入输出多组数据的处理输入不给你说有几组输入给你说输入几组不给你说有几组输入&#xff0c;但是会有一个特殊输入作为结束标志。 输出两组数据之间没有空行两组数据之间存在空行输出之间有空行 输入输出 多组数据的处理 由于ACM竞赛题目的输入数据和输出数据一般…

C++/Linux实战项目 - 负载均衡式在线OJ平台

目录 总览 简述 项目核心的三个模块 项目宏观结构 compile_server 编译与运行服务 总览分析 compiler.hpp runner.hpp compile_run.hpp compile_server.cc oj_server 基于MVC结构的oj服务设计 总览分析 Model 提供对数据的操作方法 View 使用后端数据对前端页面进…

OJ平台架构/用户权限验证/JAVA后端开发

转载自: 我的个人博客 OJ实验平台&#xff0c;采用沙箱后端运行代码&#xff0c;实现安全的实时评测&#xff08;OJ&#xff09;。此平台搭建的初衷为学校的数据结构实验提供课程代码的编写和测评&#xff0c;以此方便学生实验时得到实时的反馈&#xff0c;此后陆续被多个实验…

sql中检查时间是否重叠

先画一个时间轴&#xff0c;方便理解。 设新的时间块&#xff0c;开始时间为start&#xff0c;结束时间为end。数据库中的数据为item 这样可以直观的看出来&#xff0c;新的时间块插入进来&#xff0c;只需要判断 start<item.end and end > item.start 即可 当然上…

JS判断多个时间段是否有重叠(时分)

多个时间段比较 let dateAr [{ s: 01:00, e: 14:08 },{ s: 01:04, e: 02:05 },{ s: 05:21, e: 08:00 },{ s: 10:20, e: 12:08 }, ] function Fn() {for (let k in dateAr) {if (!judege(k)) {return false}}return true } function judege(idx) {for (let k in dateAr) {if (…

合并所有重叠的区间

Python-合并区间 题目 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 示例 1: 输入&#xff1a;interva…

关于sql语句中,统计时间重叠和时间不重叠

关于sql统计时间重叠和时间不重叠的问题 我们在开发过程中总会遇到这样的情况&#xff0c;一行数据中&#xff0c;有id、组、开始时间、结束时间。但是开始时间和结束时间肯定会出现时间重叠问题&#xff0c;比如说下面这种情况。 我们先找出时间重叠的公式&#xff1a; 可以发…

开始时间与结束时间重叠

let endNum ; //整个二维数组for(let itemName of showDate) {//for (let i 0; i < itemName.children.length; i) {if(itemName.screenId itemName.children[i].screenId) {// console.log(itemName.children[i])//把开始时间和结束时间转化成时间戳if(parseInt(itemNam…

在SQL Server中合并重叠日期

1.合并SQL中的时间重叠的记录方法:A --创建临时表&#xff0c;里面有重叠的日期declare t table (Name varchar(100), starttime datetime, endtime datetime); insert into t values(A , 2017-01-02 00:00 , 2017-03-28 00:10),(A , 2017-05-14 23:50 , 2017-05-29 23…

Java判断多个时间段是否重叠

因为项目需求用到比较给定时间段是否与已知时间段有重叠&#xff0c;所以写了一个比较简单易懂的方法&#xff0c;经测试可以满足本人目前的需求&#xff0c;大家如果发现该方法有什么问题可以提出来&#xff0c;如果有更好的方法也可以分享。 package com.demo;import java.u…

SQL中如何求解时间重叠的问题?

点击上方SQL数据库开发&#xff0c;关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 问题描述 时间重叠指上下两行数据的时间段有重叠部分&#xff0c;现在要找出这些在时间上有重叠的记录。 具体问题 有7个会议室&#xff0c;每个会议室每天都有人开…

多个日期时间段进行合并计算时长,剔除重叠时间段

多个日期时间段进行合并&#xff0c;算出经历的时长_itrytellyou的博客-CSDN博客_多个时间段合并多个日期时间段进行合并&#xff0c;算出经历的时长背景描述思路代码背景描述在公司进行人员描图模块开发时&#xff0c;涉及到了人员参会时长和参会次数的数据&#xff0c;比如一…

【js】判断时间段之间是否有重叠

一、需求 可以有多个时间段&#xff08;hh:mm&#xff09;&#xff0c;添加下一个时间段以及提交时需要判断各个时间段不能交叉&#xff0c;如下图&#xff1a; 一、方法 let dateAr [{ s: 02:00, e: 03:00 },{ s: 03:00, e: 04:01 },{ s: 05:00, e: 06:00 },{ s: 07:00, e:…

SQL中的时间重叠问题

点击关注上方“SQL数据库开发”&#xff0c; 设为“置顶或星标”&#xff0c;第一时间送达干货 SQL专栏 SQL基础知识第二版SQL高级知识第二版 问题描述 时间重叠指上下两行数据的时间段有重叠部分&#xff0c;现在要找出这些在时间上有重叠的记录。 具体问题 有7个会议室&#…

判断两个时间段交集、时间重叠问题

判断两个时间段范围是否有交集(时间重叠)问题经常遇到&#xff0c;比如预约会议室开会&#xff0c;活动的开始结束等&#xff0c;本文做此分析。 前提&#xff1a;本文时间传参已做限制&#xff0c;结束时间必须大于开始时间 1、正向思维 代码如下 (oneStartTime < other…

判断时间范围是否重叠(原理)

首先问题来源&#xff1a;因为业务需求需要在前端设置一个时间范围&#xff0c;并且可以多次增加&#xff0c;但要保证时间范围不重叠。某一个时间范围内做特定的事情。 让我们来分析一下时间重叠有几种情况 第一种情况&#xff1a;R1的开始时间在R2时间范围内 图① 第二种情…