数据库
在数据库中有三张表
- student表(学生信息表)
- student_homework表(学生提交作业记录表)
- teacher_homework表(教师发布作业记录表)
数据映射类
新建三个类(student类、studentHomework类、TeacherHomework类)
建立数据映射的目的就是可以方便的将表中的一条记录抽象成java中的一个对象
下面上代码
- student类
public class Student {
private Long studentId;
private String studentName;
public Long getStudentId() {
return studentId;
}
public void setStudentId(Long studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
}
- StudentHomework类
public class StudentHomework {
private Long id;
private Long studentId;
private Long homeworkId;
private String homeworkTitle;
private String homeworkContent;
private Timestamp creatTime;
private Timestamp updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getStudentId() {
return studentId;
}
public void setStudentId(Long studentId) {
this.studentId = studentId;
}
public Long getHomeworkId() {
return homeworkId;
}
public void setHomeworkId(Long homeworkId) {
this.homeworkId = homeworkId;
}
public String getHomeworkTitle() {
return homeworkTitle;
}
public void setHomeworkTitle(String homeworkTitle) {
this.homeworkTitle = homeworkTitle;
}
public String getHomeworkContent() {
return homeworkContent;
}
public void setHomeworkContent(String homeworkContent) {
this.homeworkContent = homeworkContent;
}
public Timestamp getCreatTime() {
return creatTime;
}
public void setCreatTime(Timestamp creatTime) {
this.creatTime = creatTime;
}
public Timestamp getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Timestamp updateTime) {
this.updateTime = updateTime;
}
}
- TeacherHomework类
public class TeacherHomework {
private long homeworkId;
private String homeworkTitle;
public long getHomeworkId() {
return homeworkId;
}
public void setHomeworkId(long homeworkId) {
this.homeworkId = homeworkId;
}
public String getHomeworkTitle() {
return homeworkTitle;
}
public void setHomeworkTitle(String homeworkTitle) {
this.homeworkTitle = homeworkTitle;
}
}
创建数据库操作类
- Homeworkjdbc类
public class HomeworkJdbc {
//获取所有学生提交的作业
public static List<StudentHomework> selectAllStudentHomework() throws ClassNotFoundException {
String url="jdbc:mysql://127.0.0.1:3306/javaee?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
String drivername = "com.mysql.cj.jdbc.Driver";
String sqlString = "select * from student_homework ";
List<StudentHomework>list=new ArrayList<>();
Class.forName(drivername);//可以省略
try (Connection connection = DriverManager.getConnection(url, "root", "0016")) {
//通过连接获取statement
try (Statement statement = connection.createStatement()) {
//statement (增、删、改、查)
try (ResultSet resultSet = statement.executeQuery(sqlString)) {
//获取执行结果
while (resultSet.next()) {
StudentHomework sh = new StudentHomework();
sh.setId(resultSet.getLong("id"));
sh.setStudentId(resultSet.getLong("student_id"));
sh.setHomeworkId(resultSet.getLong("homework_id"));
sh.setHomeworkTitle(resultSet.getString("homework_title"));
sh.setHomeworkContent(resultSet.getString("homework_content"));
sh.setCreatTime(resultSet.getTimestamp("create_time"));
sh.setUpdateTime(resultSet.getTimestamp("update_time"));
list.add(sh);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
//获取所有教师布置的作业
public static List<TeacherHomework> selectAllTeacherHomework() throws ClassNotFoundException {
String url="jdbc:mysql://127.0.0.1:3306/javaee?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
String drivername = "com.mysql.cj.jdbc.Driver";
String sqlString = "select * from teacher_homework ";
List<TeacherHomework>list=new ArrayList<>();
Class.forName(drivername);//可以省略
try (Connection connection = DriverManager.getConnection(url, "root", "0016")) {
//通过连接获取statement
try (Statement statement = connection.createStatement()) {
//statement (增、删、改、查)
try (ResultSet resultSet = statement.executeQuery(sqlString)) {
//获取执行结果
while (resultSet.next()) {
TeacherHomework th = new TeacherHomework();
th.setHomeworkId(resultSet.getLong("homework_id"));
th.setHomeworkTitle(resultSet.getString("homework_title"));
list.add(th);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
//老师布置作业时向数据中添加一条记录
public static boolean addHomework(TeacherHomework nth) throws ClassNotFoundException {
String url="jdbc:mysql://127.0.0.1:3306/javaee?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
String drivername = "com.mysql.cj.jdbc.Driver";
Class.forName(drivername);//可以省略
boolean isSuccess = true;
try (Connection connection = DriverManager.getConnection(url, "root", "0016")) {
//通过连接获取statement
//Preparestatement (增、删、改、查)
String sqlString = "insert into teacher_homework(homework_id,homework_title) values (?,?)";
PreparedStatement ps = connection.prepareStatement(sqlString);
ps.setLong(1,nth.getHomeworkId());
ps.setString(2,nth.getHomeworkTitle());
//成功返回false 失败返回true
isSuccess = ps.execute();
} catch (SQLException e) {
e.printStackTrace();
}
//为了方便后面操作 返回相反的结果
return !isSuccess;
}
//学生提交作业时向数据库中添加一条记录
public static String handHomework(StudentHomework nsh) throws ClassNotFoundException {
String url="jdbc:mysql://127.0.0.1:3306/javaee?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
String drivername = "com.mysql.cj.jdbc.Driver";
Class.forName(drivername);//可以省略
String respone = "提交成功";
List<StudentHomework> shlist = HomeworkJdbc.selectAllStudentHomework();
List<Student> slist = StudentJdbc.selectAllStudent();
List<TeacherHomework> thlist = HomeworkJdbc.selectAllTeacherHomework();
boolean studentExist = false;
boolean homeworkExist = false;
//检查学生id
for(Student s:slist){
if(s.getStudentId().equals(nsh.getStudentId())){
studentExist=true;
break;
}
}
if(!studentExist){
return "当前输入的学生id不存在";
}
//检查作业是否存在
for(TeacherHomework th:thlist){
if(th.getHomeworkId()==nsh.getHomeworkId()){
homeworkExist=true;
nsh.setHomeworkTitle(th.getHomeworkTitle());
break;
}
}
if(!homeworkExist){
return "未发现该作业";
}
try (Connection connection = DriverManager.getConnection(url, "root", "0016")) {
//通过连接获取statement
String sqlString = "insert into student_homework(id,student_id,homework_id,homework_title,homework_content,create_time)values(?,?,?,?,?,?)";
PreparedStatement ps = connection.prepareStatement(sqlString);
ps.setLong(1,shlist.size()+1);
ps.setLong(2,nsh.getStudentId());
ps.setLong(3,nsh.getHomeworkId());
ps.setString(4,nsh.getHomeworkTitle());
ps.setString(5,nsh.getHomeworkContent());
ps.setTimestamp(6, nsh.getCreatTime());
//成功返回false 失败返回true
if(ps.execute()){
return "提交失败,请检查后再提交";
}
} catch (SQLException e) {
e.printStackTrace();
}
//为了方便后面操作 返回相反的结果
return respone;
}
}
- Studentjdbc类
public class StudentJdbc {
//获取所有的学生的信息
public static List<Student> selectAllStudent() throws ClassNotFoundException {
String url="jdbc:mysql://127.0.0.1:3306/javaee?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
String drivername = "com.mysql.cj.jdbc.Driver";
String sqlString = "select * from student ";
List<Student>list=new ArrayList<>();
Class.forName(drivername);//可以省略
try (Connection connection = DriverManager.getConnection(url, "root", "0016")) {
//通过连接获取statement
try (Statement statement = connection.createStatement()) {
//statement (增、删、改、查)
try (ResultSet resultSet = statement.executeQuery(sqlString)) {
//获取执行结果
while (resultSet.next()) {
Student student = new Student();
student.setStudentId(resultSet.getLong("student_id"));
student.setStudentName(resultSet.getString("student_name"));
list.add(student);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
//向数据库中添加一个学生
public static boolean addStudent(Student newStudent) throws ClassNotFoundException {
String url="jdbc:mysql://127.0.0.1:3306/javaee?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
String drivername = "com.mysql.cj.jdbc.Driver";
List<Student>list=new ArrayList<>();
Class.forName(drivername);//可以省略
boolean isSuccess = true;
try (Connection connection = DriverManager.getConnection(url, "root", "0016")) {
//通过连接获取statement
//Preparestatement (增、删、改、查)
String sqlString = "insert into student(student_id,student_name) values (?,?)";
PreparedStatement ps = connection.prepareStatement(sqlString);
ps.setLong(1,newStudent.getStudentId());
ps.setString(2,newStudent.getStudentName());
//成功返回false 失败返回true
isSuccess = ps.execute();
} catch (SQLException e) {
e.printStackTrace();
}
//为了方便后面操作 返回相反的结果
return !isSuccess;
}
public static void main(String[] args) throws ClassNotFoundException {
List<Student> list=selectAllStudent();
for(Student student:list){
System.out.println(student.getStudentId());
}
}
}
首页——导航界面
首页是四个简单的按钮
因为首页就是四个按钮,暂时不需要写一个接口,我这里直接写在index.jsp中
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<
<html>
<head>
<title>作业系统</title>
</head>
<body align="center">
<h1 >
作业系统
</h1>
<a href="http://localhost:8081/searchallhomwork" >
<button >教师---作业列表</button>
</a>
<br/><br/>
<a href="http://localhost:8081/searchstudent" >
<button>教师---学生列表</button>
</a>
<br/><br/>
<a href="http://localhost:8081/searchteacherhomework" >
<button>教师---发布作业</button>
</a>
<br/><br/>
<a href="http://localhost:8081/handinhomework" >
<button>学生---提交作业</button>
</a>
</body>
</html>
这四个按钮分别指向我后面写的四个接口,用来跳转界面
教师—作业列表
- 创建一个servlet
//这里的@WebSerlet("/")是用来声名接口的
@WebServlet("/searchallhomwork")
//继承HttpServlet重写doGet和doPost来实现GET和POST请求
public class TeacherSearchServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<StudentHomework> studentHomeworkList = null;
try {
studentHomeworkList = HomeworkJdbc.selectAllStudentHomework();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//向req中添加数据(只能添加单一数据,无法实现多数据的传递)
req.setAttribute("studenthomeworklist",studentHomeworkList);
//跳转到search.jsp然后传递req(request)和resp(response)
req.getRequestDispatcher("search.jsp").forward(req,resp);
}
}
- 创建一个search.jsp文件:(具体解释看代码中的注释)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>家庭作业</title>
</head>
<body>
<!-- 第一个表格用来展示教师布置过的作业-->
<h1 align="center">
作业列表
</h1>
<table align="center" width="970" border="1" bgcolor="black" cellpadding="1" cellspacing="1">
<tr bgcolor="aqua">
<td align="center">作业编号</td>
<td align="center">作业标题</td>
</tr>
<!--jsp代码块
HomeworkJdbc.selectAllTeacherHomework()此方法将所有老师布置的作业都存为一个TeacherHomework实体对象
for循环内部可以嵌套一些标签但是标签并不在<%%>中
-->
<%
List<TeacherHomework> tlist = HomeworkJdbc.selectAllTeacherHomework();
if(null == tlist||tlist.size()<=0){
out.println("None data.");
}else{
for(TeacherHomework th:tlist){
%>
<tr align="center" bgcolor="white" height="30">
<td><%=th.getHomeworkId()%></td>
<td><%=th.getHomeworkTitle()%></td>
</tr>
<%}}%>
</table>
<!--第二个表格是作业提交记录的表格-->
<h1 align="center">
作业提交记录
</h1>
<table align="center" width="970" border="1" bgcolor="black" cellpadding="1" cellspacing="1">
<tr bgcolor="aqua">
<td align="center">ID</td>
<td align="center">学号</td>
<td align="center">作业编号</td>
<td align="center">作业标题</td>
<td align="center">作业内容</td>
<td align="center">创建时间</td>
</tr>
<!--这里的(List<StudentHomework>)request.getAttribute("studenthomeworklist")是用来接收servlet中传来的list对象的-->
<%
List<StudentHomework> slist = (List<StudentHomework>)request.getAttribute("studenthomeworklist");
if(null == slist || slist.size()<=0){
out.println("None data.");
}else{
for(StudentHomework sh: slist){
%>
<tr align="center" bgcolor="white" height="30">
<td><%=sh.getId()%></td>
<td><%=sh.getStudentId()%></td>
<td><%=sh.getHomeworkId()%></td>
<td><%=sh.getHomeworkTitle()%></td>
<td><%=sh.getHomeworkContent()%></td>
<td><%=sh.getCreatTime()%></td>
</tr>
<%}}%>
</table>
</body>
</html>
教师—学生列表
输入已存在的id会出现一下界面,然后3s后跳转到导航页面
创建成功后的界面,然后 3s后跳转到导航界面
上一个界面我只使用了一个接口来实现
这个界面我使用了两个接口
实际上每次跳转界面都是向一个接口发送请求,然后由服务器来跳转jsp的
但是这次我们有一个提交的需求,所以我们要再写一个接口用来接收提交请求并跳转jsp
- 第一个跳转界面接口
@WebServlet("/searchstudent")
public class TeacherSearchStudentServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<Student> list = null;
try {
list = StudentJdbc.selectAllStudent();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
req.setAttribute("studentlist",list);
req.getRequestDispatcher("student.jsp").forward(req,resp);
}
}
- 添加学生接口
这里提交我更倾向于post
get的话会把提交的参数和属性都在地址栏里标出会泄露信息
post相对更安全一些些(只是个人比较喜欢哈哈)
@WebServlet("/addstudent")
public class TeacherAddStudentServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Student newStudent = new Student();
newStudent.setStudentId(Long.parseLong(req.getParameter("studentid")));
newStudent.setStudentName(req.getParameter("studentname"));
List<Student> studentList = null;
try {
studentList = StudentJdbc.selectAllStudent();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
boolean isExist = false;
for(Student student:studentList){
//使用equals方法,这里比较迷我有些地方可以用==但是有些地方只有equals才行 不知道为啥 希望知道的大佬可以留言讲解一下
if( newStudent.getStudentId().equals(student.getStudentId())){
isExist = true;
break;
}
}
resp.setContentType("text/html;charset=UTF-8");
if(isExist){
//中文编码
resp.getWriter().println("该学号已被注册,3s后跳转");
}else {
try {
if(newStudent.getStudentName().equals("")){
resp.getWriter().println("姓名不为空,请检查后再添加,3s后跳转");
}else{
if(StudentJdbc.addStudent(newStudent)){
resp.getWriter().println("添加成功,3s后跳转");
}else {
resp.getWriter().println("添加失败,请检查后再添加,3s后跳转");
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//延时跳转
resp.setHeader("refresh","3;URL=index.jsp");
}
}
- 界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>作业系统</title>
</head>
<body>
<h1 align="center">
学生列表
</h1>
<table align="center" width="970" border="1" bgcolor="black" cellpadding="1" cellspacing="1">
<tr bgcolor="aqua">
<td align="center">学号</td>
<td align="center">姓名</td>
</tr>
<%
List<Student> list = (List<Student>) request.getAttribute("studentlist");
if(null == list||list.size()<=0){
out.println("None data.");
}else{
for(Student s:list){
%>
<tr align="center" bgcolor="white" height="30">
<td><%=s.getStudentId()%></td>
<td><%=s.getStudentName()%></td>
</tr>
<%}}%>
</table>
<br/>
<br/>
<br/>
<br/>
<h1 align="center">
添加学生
</h1>
<!-- 注意这个表单 action后填写接口 method填写使用post和get-->
<form align="center" action="/addstudent" method="post">
学号:<input type="number" name="studentid">
<br><br><br>
姓名:<input type="text" name="studentname">
<br><br>
<input type="submit" value="添加">
</form>
</body>
</html>
后面的界面大同小异,不多解释,上代码
教师-发布作业
这里也是有错误检测的
1.界面跳转接口:
@WebServlet("/searchteacherhomework")
public class TeacherHomeworkServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<TeacherHomework> teacherHomeworkList = null;
try {
teacherHomeworkList = HomeworkJdbc.selectAllTeacherHomework();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
req.setAttribute("teacherhomeworklist",teacherHomeworkList);
req.getRequestDispatcher("addhomework.jsp").forward(req,resp);
}
}
- 提交接口
@WebServlet("/addhomework")
public class TeacherAddHomeworkServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
TeacherHomework nth = new TeacherHomework();
nth.setHomeworkId(Long.parseLong(req.getParameter("homeworkid")));
nth.setHomeworkTitle(req.getParameter("homeworktitle"));
List<TeacherHomework> thList = null;
try {
thList = HomeworkJdbc.selectAllTeacherHomework();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
boolean isExist = false;
for(TeacherHomework th:thList){
//使用equals方法
if(nth.getHomeworkId()==th.getHomeworkId()){
isExist = true;
break;
}
}
resp.setContentType("text/html;charset=UTF-8");
if(isExist){
//中文编码
resp.getWriter().println("该id已被使用,3s后跳转");
//延时跳转
}else {
try {
if(nth.getHomeworkTitle().equals("")){
resp.getWriter().println("id不为空,请检查后再添加,3s后跳转");
}else{
if(HomeworkJdbc.addHomework(nth)){
resp.getWriter().println("添加成功,3s后跳转");
}else {
resp.getWriter().println("添加失败,请检查后再添加,3s后跳转");
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//延时跳转
}
resp.setHeader("refresh","3;URL=index.jsp");
}
}
3.界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1 align="center">
作业列表
</h1>
<table align="center" width="970" border="1" bgcolor="black" cellpadding="1" cellspacing="1">
<tr bgcolor="aqua">
<td align="center">作业编号</td>
<td align="center">作业标题</td>
</tr>
<%
List<TeacherHomework> tlist = (List<TeacherHomework>) request.getAttribute("teacherhomeworklist");
if(null == tlist||tlist.size()<=0){
out.println("None data.");
}else{
for(TeacherHomework th:tlist){
%>
<tr align="center" bgcolor="white" height="30">
<td><%=th.getHomeworkId()%></td>
<td><%=th.getHomeworkTitle()%></td>
</tr>
<%}}%>
</table>
<br>
<br>
<br>
<br>
<h1 align="center">
发布作业
</h1>
<form align="center" action="/addhomework" method="post">
作业编号:<input type="number" name="homeworkid">
<br><br><br>
作业名称:<input type="text" name="homeworktitle">
<br><br><br>
<input type="submit" value="发布">
</form>
</body>
</html>
作业提交界面
这个界面虽然没有之前的表格,但是还是需要一个跳转接口的
1.跳转界面的接口:
@WebServlet("/handinhomework")
public class StudentHandInHomeworkServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("handinhomework.jsp").forward(req,resp);
}
}
2.提交作业接口:
@WebServlet("/submit")
public class StudentAddHomework extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
StudentHomework nsh = new StudentHomework();
nsh.setStudentId(Long.parseLong(req.getParameter("studentid")));
nsh.setHomeworkId(Long.parseLong(req.getParameter("homeworkid")));
nsh.setHomeworkContent(req.getParameter("homeworkcontent"));
Timestamp dateNow=new Timestamp(System.currentTimeMillis());
nsh.setCreatTime(dateNow);
resp.setContentType("text/html;charset=UTF-8");
try {
resp.getWriter().println(HomeworkJdbc.handHomework(nsh)+",3s后跳转");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
resp.setHeader("refresh","3;URL=index.jsp");
}
}
3.界面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>提交作业</title>
</head>
<body>
<h1 align="center">
学生作业提交
</h1>
<form align="center" action="/submit" method="post">
学生学号:<input type="number" name="studentid">
<br><br><br>
作业编号:<input type="number" name="homeworkid">
<br><br><br>
作业内容:<input type="text" name="homeworkcontent">
<br><br><br>
<input type="submit" value="提交">
</form>
</body>
</html>
完整项目GitHub地址: https://github.com/word000000/JavaEE02__HomeWorkSystem.