在线oj项目
项目介绍编译模块设计
创建Question类创建Answer类创建FileUtil类创建CommandUtil类创建Task类 题目用户管理设设计
设计数据库和库创建DBUtil类实现题目管理
创建Problem类创建ProblemDAO类
insert()方法delete()方法selectAll()方法selectOne()方法 ProblemDAO完整代码 实现用户管理
创建User类创建UserDAO类
insert()方法delete()方法selectAll()方法selectoneByName()方法selectOneById()方法 UserDAO完整代码 服务器API
实现Util类实现addProblemServlet实现CompileServlet实现deleteProblemServlet实现isAdminServlet实现LoginoutServlet实现LoginServlet实现ProblemServlet实现RegisterServlet 前端页面实现
login.htmlregister.htmlindex.htmlproblemDetail.htmlfunction.htmldeleteUser.htmldeleteProblem.htmladdUser.htmladdProblem.html 项目展示
管理员普通用户 Gitee地址
项目介绍该项目基于java,servlet,JDBC,ajax技术实现的,该项目实现了登录和注册功能,给用户更好的体验,此外还新增管理员用户,其比普通用户多了几个功能:新增题目,删除题目,删除用户,添加用户,查看题目这些功能,这些功能能让用户体验更加完好,用户提交代码后会给用户提示代码通过情况,此外在运行用户代码前进行安全性检测,这特别适合将目前所有学的知识给运用一下,让自己更好熟练相关技术。
编译模块设计 创建Question类package compile;
public class Question {
private String code;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
创建Answer类
package compile;
//返回前端以该类为标准
public class Answer {
private int error;
private String reason;
private String stdout;
private String stderr;
public int getError() {
return error;
}
public void setError(int error) {
this.error = error;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public String getStdout() {
return stdout;
}
public void setStdout(String stdout) {
this.stdout = stdout;
}
public String getStderr() {
return stderr;
}
public void setStderr(String stderr) {
this.stderr = stderr;
}
@Override
public String toString() {
return "Answer{" +
"error=" + error +
", reason='" + reason + ''' +
", stdout='" + stdout + ''' +
", stderr='" + stderr + ''' +
'}';
}
}
创建FileUtil类
package compile;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileUtil {
//读取文件内容
public static String readFile(String filePath){
StringBuffer buffer=new StringBuffer();
try (FileReader fileReader=new FileReader(filePath)){
while(true){
int ch=fileReader.read();
if (ch==-1){
break;
}
buffer.append((char)ch);
}
fileReader.close();
}
catch (IOException e) {
e.printStackTrace();
}
return buffer.toString();
}
//向指定文件写内容
public static void writeFile(String filePath,String content){
try(FileWriter fileWriter=new FileWriter(filePath)){
fileWriter.write(content);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
FileUtil.writeFile("d:/test.txt","hello world");
String content=FileUtil.readFile("d:/test.txt");
System.out.println(content);
}
}
创建CommandUtil类
package compile;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class CommandUtil {
public static int run(String cmd,String stdoutFile, String stderrFile){
try {
//创建进程
Process process=Runtime.getRuntime().exec(cmd);
if (stdoutFile!=null){
InputStream stdoutFrom=process.getInputStream();
FileOutputStream stdoutTo=new FileOutputStream(stdoutFile);
while (true){
int ch=stdoutFrom.read();
if (ch==-1){
break;
}
//讲内容输入进文件stdoutFile
stdoutTo.write(ch);
}
stdoutFrom.close();
stdoutTo.close();
}
if(stderrFile!=null){
InputStream stderrFrom=process.getErrorStream();
FileOutputStream stderrTo=new FileOutputStream(stderrFile);
while (true){
int ch=stderrFrom.read();
if (ch==-1){
break;
}
//讲内容输入进文件stderrFile
stderrTo.write(ch);
}
stderrFrom.close();
stderrTo.close();
}
int exitCode=process.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return 1;
}
public static void main(String[] args) {
CommandUtil.run("javac","stdout.txt","stderr.txt");
}
}
创建Task类
package compile;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class Task {
private static String WORK_DIR=null;
private static String CLASS=null;
private static String CODE=null;
private static String COMPILE_ERROR=null;
private static String STDOUT=null;
private static String STDERR=null;
public Task(){
//是每次文件夹名字不同
WORK_DIR="./tmp/"+ UUID.randomUUID().toString()+"/";
CODE=WORK_DIR+"Solution.java";
CLASS="Solution";
COMPILE_ERROR=WORK_DIR+"compileError.txt";
STDOUT=WORK_DIR+"stdout.txt";
STDERR=WORK_DIR+"stderr.txt";
}
public Answer compileAndRun(Question question){
Answer answer=new Answer();
File workDir=new File(WORK_DIR);
if (!workDir.exists()){
workDir.mkdirs();
}
//如果用户提交的代码不安全则直接反馈给用户
if (!checkCodeSafe(question.getCode())){
System.out.println("用户提交了不安全代码");
answer.setError(3);
answer.setReason("你提交的代码不安全!");
return answer;
}
FileUtil.writeFile(CODE,question.getCode());
//编译该代码
String compileCmd=String.format("javac -encoding utf8 %s -d %s",CODE,WORK_DIR);
System.out.println("编译命令:"+compileCmd);
CommandUtil.run(compileCmd,null,COMPILE_ERROR);
String compileError= FileUtil.readFile(COMPILE_ERROR);
System.out.println(compileError);
if (!compileError.equals("")){
System.out.println("编译出错");
answer.setError(1);
answer.setReason(compileError);
return answer;
}
//运行该代码
String runCmd=String.format("java -classpath %s %s",WORK_DIR,CLASS);
System.out.println("运行命令:"+runCmd);
CommandUtil.run(runCmd,STDOUT,STDERR);
String runError= FileUtil.readFile(STDERR);
if (!runError.equals("")){
System.out.println("运行出错");
answer.setError(2);
answer.setReason(runError);
return answer;
}
answer.setError(0);
answer.setStdout(FileUtil.readFile(STDOUT));
return answer;
}
private boolean checkCodeSafe(String code) {
List blackList=new ArrayList<>();
blackList.add("Runtime");
blackList.add("exec");
blackList.add("java.io");
blackList.add("java.net");
for (String string:blackList) {
int pos =code.indexOf(string);
if (pos>=0){
return false;
}
}
return true;
}
public static void main(String[] args) {
Task task=new Task();
Question question=new Question();
question.setCode("public class Solution {n" +
" public static void main(String[] args) {n" +
" System.out.println("sdfasdasd");n" +
" }n" +
"}n");
Answer answer=task.compileAndRun(question);
System.out.println(answer.toString());
}
}
此外为了用户提交恶意代码或者空代码交了两个CodeInValidException和ProblemNotFoundException类进行 抛出异常。
create database if not exists oj_database;
use oj_database;
drop table if exists oj_table;
create table oj_table(
id int primary key auto_increment,
title varchar(50),
level varchar(50),
description varchar(4096),
templateCode varchar(4096),
testCode varchar(4096)
);
drop table if exists oj_user;
create table oj_user(
id int primary key auto_increment,
username varchar(50) unique,
password varchar(50) not null,
isAdmin int
);
关于oj_table表单:id是自增主键,title是题目标题,level是代表该题目的难易程度,description是题目描述,templateCode是代码模板,testCode是测试代码。
关于oj_user表单:id是自增主键,username是用户名账号,password是用户密码,isAdmin是判断该用户是否为管理员。
该类是进行数据库连接操作,此外为了线程安全采用了单例模式、
package common;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBUtil {
private static final String URL="jdbc:mysql://127.0.0.1:3306/oj_database?characterEncoding=utf8&useSSL=false";//数据库地址
private static final String USERNAME="root";//数据库账号
private static final String PASSWORD="123456wjh.";//数据库命名
private static DataSource dataSource=null;
//单例模式
private static DataSource getDataSource(){
if (dataSource==null){
synchronized (DBUtil.class){
if (dataSource==null){
MysqlDataSource mysqlDataSource=new MysqlDataSource();
mysqlDataSource.setURL(URL);
mysqlDataSource.setUser(USERNAME);
mysqlDataSource.setPassword(PASSWORD);
dataSource=mysqlDataSource;
}
}
}
return dataSource;
}
public static Connection getConnection() throws SQLException {
return getDataSource().getConnection();
}
public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet) throws SQLException {
if (resultSet!=null){
resultSet.close();
}
if (statement!=null){
statement.close();
}
if (connection!=null){
connection.close();
}
}
}
实现题目管理
创建Problem类
创建该类为了以后得到数据库中的数据返回
package dao;
public class Problem {
private int id;
private String level;
private String description;
private String title;
private String templateCode;
private String testCode;
@Override
public String toString() {
return "Problem{" +
"id=" + id +
", level='" + level + ''' +
", description='" + description + ''' +
", title='" + title + ''' +
", templateCode='" + templateCode + ''' +
", testCode='" + testCode + ''' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getTemplateCode() {
return templateCode;
}
public void setTemplateCode(String templateCode) {
this.templateCode = templateCode;
}
public String getTestCode() {
return testCode;
}
public void setTestCode(String testCode) {
this.testCode = testCode;
}
}
创建ProblemDAO类
该类作用于题目的管理,与数据库进行交互
package dao;
import common.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class ProblemDAO {
//插入新题目
public void insert(Problem problem){
}
//删除题目
public void delete(int id){
}
//返回题目的基本信息
public List selectAll(){
}
//获取指定问题的详细问题
public Problem selectOne(int id){
}
}
insert()方法
//插入新题目
public void insert(Problem problem){
Connection connection=null;
PreparedStatement statement=null;
try {
connection= DBUtil.getConnection();//获取数据库连接
String sql="insert into oj_table values(null,?,?,?,?,?)";
statement=connection.prepareStatement(sql);
statement.setString(1,problem.getTitle());
statement.setString(2,problem.getLevel());
statement.setString(3,problem.getDescription());
statement.setString(4,problem.getTemplateCode());
statement.setString(5,problem.getTestCode());
int ret=statement.executeUpdate();//执行sql语句
if (ret==1){
System.out.println("插入成功!");
}else {
System.out.println("题目新增失败!");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,null);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
delete()方法
//删除题目
public void delete(int id){
Connection connection=null;
PreparedStatement statement=null;
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="delete from oj_table where id=?";
statement=connection.prepareStatement(sql);
statement.setInt(1,id);
int ret=statement.executeUpdate();//执行sql语句
if (ret==1){
System.out.println("删除题目成功!");
}else {
System.out.println("删除题目失败!");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,null);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
selectAll()方法
//返回题目的基本信息
public List selectAll(){
Connection connection=null;
PreparedStatement statement=null;
ResultSet resultSet=null;
List list=new ArrayList<>();
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="select id,title,level from oj_table";
statement=connection.prepareStatement(sql);
resultSet=statement.executeQuery();//执行sql语句
while (resultSet.next()){
Problem problem=new Problem();
problem.setId(resultSet.getInt("id"));
problem.setTitle(resultSet.getString("title"));
problem.setLevel(resultSet.getString("level"));
list.add(problem);
}
if (list!=null){
return list;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,resultSet);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
selectOne()方法
//获取指定问题的详细问题
public Problem selectOne(int id){
Connection connection=null;
PreparedStatement statement=null;
ResultSet resultSet=null;
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="select * from oj_table where id=?";
statement=connection.prepareStatement(sql);
statement.setInt(1,id);
resultSet=statement.executeQuery();//执行sql语句
if (resultSet.next()){
Problem problem=new Problem();
problem.setId(resultSet.getInt("id"));
problem.setTitle(resultSet.getString("title"));
problem.setLevel(resultSet.getString("level"));
problem.setDescription(resultSet.getString("description"));
problem.setTemplateCode(resultSet.getString("templateCode"));
problem.setTestCode(resultSet.getString("testCode"));
return problem;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,resultSet);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
ProblemDAO完整代码
package dao;
import common.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class ProblemDAO {
//插入新题目
public void insert(Problem problem){
Connection connection=null;
PreparedStatement statement=null;
try {
connection= DBUtil.getConnection();//获取数据库连接
String sql="insert into oj_table values(null,?,?,?,?,?)";
statement=connection.prepareStatement(sql);
statement.setString(1,problem.getTitle());
statement.setString(2,problem.getLevel());
statement.setString(3,problem.getDescription());
statement.setString(4,problem.getTemplateCode());
statement.setString(5,problem.getTestCode());
int ret=statement.executeUpdate();//执行sql语句
if (ret==1){
System.out.println("插入成功!");
}else {
System.out.println("题目新增失败!");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,null);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
//删除题目
public void delete(int id){
Connection connection=null;
PreparedStatement statement=null;
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="delete from oj_table where id=?";
statement=connection.prepareStatement(sql);
statement.setInt(1,id);
int ret=statement.executeUpdate();//执行sql语句
if (ret==1){
System.out.println("删除题目成功!");
}else {
System.out.println("删除题目失败!");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,null);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
//返回题目的基本信息
public List selectAll(){
Connection connection=null;
PreparedStatement statement=null;
ResultSet resultSet=null;
List list=new ArrayList<>();
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="select id,title,level from oj_table";
statement=connection.prepareStatement(sql);
resultSet=statement.executeQuery();//执行sql语句
while (resultSet.next()){
Problem problem=new Problem();
problem.setId(resultSet.getInt("id"));
problem.setTitle(resultSet.getString("title"));
problem.setLevel(resultSet.getString("level"));
list.add(problem);
}
if (list!=null){
return list;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,resultSet);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
//获取指定问题的详细问题
public Problem selectOne(int id){
Connection connection=null;
PreparedStatement statement=null;
ResultSet resultSet=null;
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="select * from oj_table where id=?";
statement=connection.prepareStatement(sql);
statement.setInt(1,id);
resultSet=statement.executeQuery();//执行sql语句
if (resultSet.next()){
Problem problem=new Problem();
problem.setId(resultSet.getInt("id"));
problem.setTitle(resultSet.getString("title"));
problem.setLevel(resultSet.getString("level"));
problem.setDescription(resultSet.getString("description"));
problem.setTemplateCode(resultSet.getString("templateCode"));
problem.setTestCode(resultSet.getString("testCode"));
return problem;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,resultSet);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
}
实现用户管理
创建User类
创建User类以便于数据库进行交互
package dao;
public class User {
private int id;
private String username;
private String password;
private int isAdmin;
public int getId() {
return id;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + ''' +
", password='" + password + ''' +
", isAdmin=" + isAdmin +
'}';
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getIsAdmin() {
return isAdmin;
}
public void setIsAdmin(int isAdmin) {
this.isAdmin = isAdmin;
}
}
创建UserDAO类
创建UserDAO类作为用户管理器类, 负责和数据库交互.
package dao;
import common.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class UserDao {
//新增用户
public void insert(User user){
}
//删除用户
public void delete(int id){
}
//返回所有用户的信息
public List selectAll(){
}
//通过姓名返回用户信息
public User selectOneByName(String username){
}
//通过id返回用户的信息
public User selectOneById(int id){
}
}
insert()方法
//新增用户
public void insert(User user){
Connection connection= null;
PreparedStatement statement=null;
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="insert into oj_user values(null,?,?,?)";
statement=connection.prepareStatement(sql);
statement.setString(1,user.getUsername());
statement.setString(2,user.getPassword());
statement.setInt(3,user.getIsAdmin());
int ret =statement.executeUpdate();//执行sql语句
if (ret==1){
System.out.println("插入成功!");
}else {
System.out.println("插入失败!");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,null);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
delete()方法
//删除用户
public void delete(int id){
Connection connection= null;
PreparedStatement statement=null;
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="delete from oj_user where id=?";
statement=connection.prepareStatement(sql);
statement.setInt(1,id);
int ret =statement.executeUpdate();//执行sql语句
if (ret==1){
System.out.println("删除成功!");
}else {
System.out.println("删除失败!");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,null);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
selectAll()方法
//返回所有用户的信息
public List selectAll(){
Connection connection=null;
PreparedStatement statement=null;
ResultSet resultSet=null;
List list=new ArrayList<>();
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="select * from oj_user";
statement=connection.prepareStatement(sql);
resultSet=statement.executeQuery();//执行sql语句
while (resultSet.next()){
User user=new User();
user.setId(resultSet.getInt("id"));
user.setUsername(resultSet.getString("username"));
user.setPassword(resultSet.getString("password"));
user.setIsAdmin(resultSet.getInt("isAdmin"));
list.add(user);
}
if (list==null){
return null;
}else {
return list;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,resultSet);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
selectoneByName()方法
//通过姓名返回用户信息
public User selectOneByName(String username){
Connection connection=null;
PreparedStatement statement=null;
ResultSet resultSet=null;
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="select * from oj_user where username=?";
statement=connection.prepareStatement(sql);
statement.setString(1,username);
resultSet=statement.executeQuery();//执行sql语句
if (resultSet.next()){
User user=new User();
user.setId(resultSet.getInt("id"));
user.setUsername(resultSet.getString("username"));
user.setPassword(resultSet.getString("password"));
user.setIsAdmin(resultSet.getInt("isAdmin"));
return user;
}else {
return null;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,resultSet);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
selectOneById()方法
//通过id返回用户的信息
public User selectOneById(int id){
Connection connection=null;
PreparedStatement statement=null;
ResultSet resultSet=null;
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="select * from oj_user where id=?";
statement=connection.prepareStatement(sql);
statement.setInt(1,id);
resultSet=statement.executeQuery();//执行sql语句
if (resultSet.next()){
User user=new User();
user.setId(resultSet.getInt("id"));
user.setUsername(resultSet.getString("username"));
user.setPassword(resultSet.getString("password"));
user.setIsAdmin(resultSet.getInt("isAdmin"));
return user;
}else {
return null;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,resultSet);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
UserDAO完整代码
package dao;
import common.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class UserDao {
//新增用户
public void insert(User user){
Connection connection= null;
PreparedStatement statement=null;
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="insert into oj_user values(null,?,?,?)";
statement=connection.prepareStatement(sql);
statement.setString(1,user.getUsername());
statement.setString(2,user.getPassword());
statement.setInt(3,user.getIsAdmin());
int ret =statement.executeUpdate();//执行sql语句
if (ret==1){
System.out.println("插入成功!");
}else {
System.out.println("插入失败!");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,null);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
//删除用户
public void delete(int id){
Connection connection= null;
PreparedStatement statement=null;
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="delete from oj_user where id=?";
statement=connection.prepareStatement(sql);
statement.setInt(1,id);
int ret =statement.executeUpdate();//执行sql语句
if (ret==1){
System.out.println("删除成功!");
}else {
System.out.println("删除失败!");
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,null);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
//返回所有用户的信息
public List selectAll(){
Connection connection=null;
PreparedStatement statement=null;
ResultSet resultSet=null;
List list=new ArrayList<>();
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="select * from oj_user";
statement=connection.prepareStatement(sql);
resultSet=statement.executeQuery();//执行sql语句
while (resultSet.next()){
User user=new User();
user.setId(resultSet.getInt("id"));
user.setUsername(resultSet.getString("username"));
user.setPassword(resultSet.getString("password"));
user.setIsAdmin(resultSet.getInt("isAdmin"));
list.add(user);
}
if (list==null){
return null;
}else {
return list;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,resultSet);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
//通过姓名返回用户信息
public User selectOneByName(String username){
Connection connection=null;
PreparedStatement statement=null;
ResultSet resultSet=null;
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="select * from oj_user where username=?";
statement=connection.prepareStatement(sql);
statement.setString(1,username);
resultSet=statement.executeQuery();//执行sql语句
if (resultSet.next()){
User user=new User();
user.setId(resultSet.getInt("id"));
user.setUsername(resultSet.getString("username"));
user.setPassword(resultSet.getString("password"));
user.setIsAdmin(resultSet.getInt("isAdmin"));
return user;
}else {
return null;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,resultSet);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
//通过id返回用户的信息
public User selectOneById(int id){
Connection connection=null;
PreparedStatement statement=null;
ResultSet resultSet=null;
try {
connection=DBUtil.getConnection();//获取数据库连接
String sql="select * from oj_user where id=?";
statement=connection.prepareStatement(sql);
statement.setInt(1,id);
resultSet=statement.executeQuery();//执行sql语句
if (resultSet.next()){
User user=new User();
user.setId(resultSet.getInt("id"));
user.setUsername(resultSet.getString("username"));
user.setPassword(resultSet.getString("password"));
user.setIsAdmin(resultSet.getInt("isAdmin"));
return user;
}else {
return null;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
DBUtil.close(connection,statement,resultSet);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
}
服务器API
实现Util类
package common;
import dao.User;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class Util {
//判断用户是否登录
public static User checkUser(HttpServletRequest req){
HttpSession session=req.getSession(false);
if (session==null){
return null;
}
User user= (User) session.getAttribute("user");
if (user==null){
return null;
}
return user;
}
}
实现addProblemServlet
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.io.InputStream;
import java.io.UnsupportedEncodingException;
@WebServlet("/addProblem")
public class addProblemServlet extends HttpServlet {
private ObjectMapper objectMapper=new ObjectMapper();
//编译响应
static class isCorrect{
public int correct;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf8");
resp.setContentType("application/json; charset=utf8");
String body=readBody(req);
isCorrect correct=new isCorrect();
//body为空则返回
if (body==null){
resp.setContentType("text/html; charset=utf8");
String html="提交的题目有问题,无法新加成功!";
resp.getWriter().write(html);
return;
}
Problem problem=objectMapper.readValue(body,Problem.class);
ProblemDAO problemDAO=new ProblemDAO();
problemDAO.insert(problem);
correct.correct=1;
String html=objectMapper.writevalueAsString(correct);
resp.getWriter().write(html);
}
//实现 readBody 方法, 用来把请求中的 body 部分全读出来。
private static String readBody(HttpServletRequest req) throws UnsupportedEncodingException {
int contentLength=req.getContentLength();
byte[] bytes=new byte[contentLength];
try (InputStream inputStream = req.getInputStream()){
inputStream.read(bytes);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return new String(bytes,"utf8");
}
}
实现CompileServlet
package api;
import com.fasterxml.jackson.databind.ObjectMapper;
import common.CodeInValidException;
import common.ProblemNotFoundException;
import common.Util;
import compile.Answer;
import compile.Question;
import compile.Task;
import dao.Problem;
import dao.ProblemDAO;
import dao.User;
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.io.InputStream;
import java.io.UnsupportedEncodingException;
@WebServlet("/compile")
public class CompileServlet extends HttpServlet {
private ObjectMapper objectMapper=new ObjectMapper();
//编译请求
static class CompileRequest{
public int id;
public String code;
}
//编译响应
static class CompileResponse{
public int error;
public String reason;
public String stdout;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("application/json;charset=utf8");
User user= Util.checkUser(req);
if (user==null){
resp.setStatus(403);
String html="当前用户未登录";
resp.getWriter().write(html);
return;
}
CompileResponse compileResponse=new CompileResponse();
CompileRequest compileRequest=null;
Problem problem=null;
try{
resp.setStatus(200);
String body=readBody(req);
compileRequest=objectMapper.readValue(body,CompileRequest.class);
ProblemDAO problemDAO=new ProblemDAO();
problem=problemDAO.selectOne(compileRequest.id);
if (problem==null){
throw new ProblemNotFoundException();
}
String testCode=problem.getTestCode();
String requestCode=compileRequest.code;
String finalCode=mergeCode(requestCode,testCode);
if (finalCode==null){
throw new CodeInValidException();
}
System.out.println(finalCode);
Task task=new Task();
Question question=new Question();
question.setCode(finalCode);
Answer answer=task.compileAndRun(question);
compileResponse.error=answer.getError();
compileResponse.reason=answer.getReason();
compileResponse.stdout=answer.getStdout();
} catch (ProblemNotFoundException e) {
compileResponse.error=3;
compileResponse.reason="题目没有找到 id="+compileRequest.id;
}catch (CodeInValidException e) {
compileResponse.error=3;
compileResponse.reason="提交的代码不符合要求";
}finally {String respString=objectMapper.writevalueAsString(compileResponse);
resp.getWriter().write(respString);
}
}
//合并用户提交的代码
private static String mergeCode(String requestCode, String testCode) {
int pos=requestCode.lastIndexOf("}");
if (pos==-1){
return null;
}
String string=requestCode.substring(0,pos);
string+=testCode+"n}";
return string;
}
//实现 readBody 方法, 用来把请求中的 body 部分全读出来。
private static String readBody(HttpServletRequest req) throws UnsupportedEncodingException {
int contentLength=req.getContentLength();
byte[] bytes=new byte[contentLength];
try (InputStream inputStream = req.getInputStream()){
inputStream.read(bytes);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return new String(bytes,"utf8");
}
}
实现deleteProblemServlet
package api;
import com.fasterxml.jackson.databind.ObjectMapper;
import common.Util;
import dao.Problem;
import dao.ProblemDAO;
import dao.User;
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.io.InputStream;
import java.io.UnsupportedEncodingException;
@WebServlet("/deleteProblem")
public class deleteProblemServlet extends HttpServlet {
//获取前端页面的数据
static class Accept{
public int id;
}
//响应
static class Result{
public int result;
}
private ObjectMapper objectMapper=new ObjectMapper();
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf8");
resp.setContentType("application/json; charset=utf8");
String body=readBody(req);
//body为空则返回
if (body==null){
resp.setContentType("text/html; charset=utf8");
String html="无法删除成功!";
resp.getWriter().write(html);
return;
}
Accept accept=objectMapper.readValue(body,Accept.class);
//调用ProblemDAO
ProblemDAO problemDAO=new ProblemDAO();
problemDAO.delete(accept.id);
Result result=new Result();
result.result=1;
String html=objectMapper.writevalueAsString(result);
resp.getWriter().write(html);
}
//实现 readBody 方法, 用来把请求中的 body 部分全读出来。
private static String readBody(HttpServletRequest req) throws UnsupportedEncodingException {
int contentLength=req.getContentLength();
byte[] bytes=new byte[contentLength];
try (InputStream inputStream = req.getInputStream()){
inputStream.read(bytes);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return new String(bytes,"utf8");
}
}
实现isAdminServlet
package api;
import com.fasterxml.jackson.databind.ObjectMapper;
import common.Util;
import dao.User;
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("/admin")
public class isAdminServlet extends HttpServlet {
private ObjectMapper objectMapper=new ObjectMapper();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("application/json;charset=utf8");
User user= Util.checkUser(req);
if (user==null){
resp.setStatus(403);
String html="当前用户未登录";
resp.getWriter().write(html);
// resp.sendRedirect("login.html");
return;
}
//给前端返回用户的信息
String html=objectMapper.writevalueAsString(user);
resp.getWriter().write(html);
}
}
实现LoginoutServlet
package api;
import common.Util;
import dao.User;
import dao.UserDao;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/logout")
public class LoginoutServlet extends HttpServlet {
//注销登录
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession(false);
if (session == null) {
resp.setContentType("text/txt; charset=utf-8");
String html = "当前尚未登录";
resp.getWriter().write(html);
return;
}
session.removeAttribute("user");
resp.sendRedirect("login.html");
}
//管理员删除用户
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf8");
String username=req.getParameter("username");
resp.setContentType("text/html; charset=utf8");
User user=Util.checkUser(req);
if (user==null){
String html=" 当前用户未登录 ";
resp.getWriter().write(html);
// resp.sendRedirect("login.html");
return;
}
if (user.getUsername().equals(username)){
String html="不能删除自己";
resp.getWriter().write(html);
return;
}
UserDao userDao=new UserDao();
User user1=userDao.selectOneByName(username);
if (user1==null){
String html="删除用户不存在";
resp.getWriter().write(html);
return;
}
userDao.delete(user1.getId());
resp.sendRedirect("function.html");
}
}
实现LoginServlet
package api;
import com.fasterxml.jackson.databind.ObjectMapper;
import dao.User;
import dao.UserDao;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
//用户登录操作
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf8");
resp.setContentType("text/html; charset=utf8");
UserDao userDao=new UserDao();
String username=req.getParameter("username");
String password=req.getParameter("password");
if (username==null||password==null||"".equals(username)||"".equals(password)){
String h3="输入格式错误";
resp.getWriter().write(h3);
return;
}
User user=userDao.selectOneByName(username);
if (user==null){
String h3="当前用户为空";
resp.getWriter().write(h3);
return;
}
if (!user.getUsername().equals(username)||!user.getPassword().equals(password)){
String h3="当前密码或者账号 错误!";
resp.getWriter().write(h3);
return;
}
//将登录用户放进session中
HttpSession session=req.getSession(true);
session.setAttribute("user",user);
resp.sendRedirect("index.html");
}
}
实现ProblemServlet
package api;
import com.fasterxml.jackson.databind.ObjectMapper;
import common.Util;
import dao.Problem;
import dao.ProblemDAO;
import dao.User;
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 {
private ObjectMapper objectMapper=new ObjectMapper();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置为json格式
resp.setContentType("application/json;charset=utf8");
User user= Util.checkUser(req);
if (user==null){
resp.setContentType("text/html; charset=utf-8");
resp.setStatus(403);
String html="当前用户未登录";
resp.getWriter().write(html);
return;
// resp.sendRedirect("login.html");
// return;
}
resp.setStatus(200);
String id=req.getParameter("id");
ProblemDAO problemDAO=new ProblemDAO();
if (id==null||"".equals(id)){
List list=problemDAO.selectAll();
//讲后台数据进行json格式化,方便前台获取后进行后续操作
String respString=objectMapper.writevalueAsString(list);
resp.getWriter().write(respString);
return;
}else {
Problem problem=problemDAO.selectOne(Integer.parseInt(id));
//讲后台数据进行json格式化,方便前台获取后进行后续操作
String respString=objectMapper.writevalueAsString(problem);
resp.getWriter().write(respString);
return;
}
}
}
实现RegisterServlet
package api;
import dao.User;
import dao.UserDao;
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("/register")
public class RegisterServlet extends HttpServlet {
//注册用户
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf8");
resp.setContentType("text/html; charset=utf8");
String username=req.getParameter("username");
String password=req.getParameter("password");
String admin=req.getParameter("admin");
UserDao userDao=new UserDao();
if (username==null||password==null||"".equals(username)||"".equals(password)){
String h3="输入格式错误";
resp.getWriter().write(h3);
return;
}
User user=userDao.selectOneByName(username);
if (user!=null){
String h3="该用户名字已被使用!";
resp.getWriter().write(h3);
return;
}
User registerUser=new User();
registerUser.setUsername(username);
registerUser.setPassword(password);
if (admin==null||"".equals(admin)){
registerUser.setIsAdmin(0);
userDao.insert(registerUser);
resp.sendRedirect("login.html");
}
else {
registerUser.setIsAdmin(Integer.parseInt(admin));
userDao.insert(registerUser);
resp.sendRedirect("function.html");
}
}
}
前端页面实现
前端的页面都是来源于网上免费的模板,这里只会出现前后端交互的相关代码。
login.htmlregister.html
index.html
problemDetail.html
function.html
deleteUser.html
deleteProblem.htmlSignUp Form
addUser.html题目列表
编号 标题 难度
addProblem.html
项目展示 管理员© by 文墨轩
在线oj代码地址



