最近在学习JavaWeb,整理一下。写了个很简单的学生信息管理系统。系统只包括简单的对学生信息进行增删改查。系统采用三层设计模式。
先展示一下系统的业务处理逻辑图:
逻辑如图所示,获取前端用户交互信息,逐步调用其他层,实现“增删改查”业务。
数据库设计(DDL信息):
CREATE TABLE `stu` (
`sno` varchar(11) NOT NULL,
`sname` varchar(20) DEFAULT NULL,
`sage` tinyint(4) DEFAULT NULL,
`saddress` varchar(30) DEFAULT NULL,
PRIMARY KEY (`sno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
项目主要几个Jsp页面如下:
1.首页,展示学生信息
2.点击学号超链接,进入学生详细信息页面
3.新增学生页面
页面都比较简单,只是几个输入框而已。。
接下来看一下项目文件结构:
这里对项目目录结构进行简单说明;
- dao:存放数据访问层的Java文件
- entity:存放实体类,对应数据库的表
- service:存放业务逻辑层的Java文件
- servlet:存放Servlet文件(本质上是一个Java文件),一个功能对应一个Servlet
- web目录放着JS、CSS(本项目没有)、jsp文件
项目开始时要先导入数据库jar包,教程可以参考一下网上资源,这里不作介绍
接下来开始展示每个页面的代码(为了篇幅不过长,省略部分代码),都比较简单,这里从底层往上介绍:
1.Student.java
package pers.student.entity;
public class Student {
private String sno;
private String sname;
private int age;
private String address;
public Student(){}
...此处省略其他构造方法和Setter、Getter
@Override
public String toString() {
return this.getSno() + " - " + this.getSname() + " - " + this.getAge() + " - " + this.getAddress();
}
}
2.StudentDao.java
package pers.student.dao;
import pers.student.entity.Student;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
//数据访问层,原子性的增删改查
public class StudentDao {
//数据库连接数据
private final String DRIVER = "com.mysql.cj.jdbc.Driver";
private final String DB = "javadb";
private final String USER = "java";
private final String PWD = "123456";
private final String URL = "jdbc:mysql://localhost:3306/"+DB+"?useUnicode = true&" +
"characterEncoding = utf-8&useSSL = false&serverTimezone = GMT&allowPublicKeyRetrieval=true";
/**
* 根据学号查询此人是否存在
* @param sno
* @return
*/
public boolean isExit(String sno) {
return queryStudentBySno(sno) != null;
}
/**
* 根据学号查询学生
* @param sno
* @return 返回一个学生对象
*/
public Student queryStudentBySno(String sno) {
Student student = null;
Connection connection = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
Class.forName(DRIVER);
connection = DriverManager.getConnection(URL, USER, PWD);
String sql = "select * from stu where sno = ?";
pstmt = connection.prepareStatement(sql);
pstmt.setString(1, sno);
rs = pstmt.executeQuery();
if (rs.next()) {
String no = rs.getString("sno");
String name = rs.getString("sname");
int age = rs.getInt("sage");
String address = rs.getString("saddress");
student = new Student(no, name, age, address);
}
return student;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
} catch (SQLException e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
...此处省略其他方法
}
3.StudentService.java
package pers.student.service;
import pers.student.dao.StudentDao;
import pers.student.entity.Student;
import java.util.List;
//业务逻辑层:逻辑性的增删改查( 增:先查后增 ),对dao层进行组装
public class StudentService {
StudentDao studentDao = new StudentDao();
/**
* 增加学生
* @param student
* @return
*/
public boolean addStudent(Student student) {
if (!studentDao.isExit(student.getSno())) {//不存在
return studentDao.addStudent(student);
} else {
//System.out.println("此人已存在!");
return false;
}
}
...此处省略其他方法
}
4.AddStudentServlet.java(Servlet只展示这一个)
package pers.student.servlet;
import pers.student.entity.Student;
import pers.student.service.StudentService;
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.PrintWriter;
@WebServlet(value = "/AddStudentServlet")
public class AddStudentServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
//获取前台数据
String no = request.getParameter("sno");
String name = request.getParameter("sname");
String sage = request.getParameter("sage");
int age = 0;
if (!(sage == null || sage.equals(""))) {
age = Integer.parseInt(sage);
}
String address = request.getParameter("saddress");
//封装进JavaBean
Student student = new Student(no, name, age, address);
StudentService studentService = new StudentService();
boolean flag = studentService.addStudent(student);
PrintWriter out = response.getWriter();
if (!flag) {
request.setAttribute("error","addError");
} else {
request.setAttribute("error","addSuccess");
}
// response.sendRedirect("QueryAllStudentServlet");
request.getRequestDispatcher("QueryAllStudentServlet").forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
5.index.jsp(jsp只展示这一个)
<%@ page import="java.util.List" %>
<%@ page import="pers.student.entity.Student" %><%-- Created by IntelliJ IDEA. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>学生信息列表</title>
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(function () {
$("tr:odd").css("background-color","lightgray");
});
</script>
</head>
<body>
<%
String error = (String) request.getAttribute("error");
if (error != null){
if (error.equals("addError")) {
out.print("增加失败");
} else if (error.equals("addSuccess")){
out.print("增加成功");
}
}
%>
<table border="1px">
<tr>
<th>学号</th>
<th>姓名</th>
<th>年龄</th>
<th>操作</th>
</tr>
<%
//获取request域中的数据
List<Student> students = (List<Student>) request.getAttribute("students");
for (Student student: students) {
%>
<tr>
<td><a href="QueryStudentServlet?sno=<%=student.getSno()%>"><%=student.getSno()%></a></td>
<td><%=student.getSname()%></td>
<td><%=student.getAge()%></td>
<%-- <td><%=student.getAddress()%></td>--%>
<td><a href="#" onclick="window.confirm('确认删除吗?')?this.href='DeleteStudentServlet?sno=<%=student.getSno()%>':this.href='javascript:void()';">删除</a></td>
</tr>
<%
}
%>
</table>
<a href="add.jsp">新增学生</a>
</body>
</html>
项目的代码基本上都展示出来了。最后要在web.xml中配置一下项目根目录默认启动页面,默认启动QueryAllStudentServlet:
<welcome-file-list>
<welcome-file>QueryAllStudentServlet</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
进行以上操作,就可以搭建出一个具有增删改查的简单的JavaWeb项目了。
该项目缺点:
- 界面比较简陋(丑)
- 内容很少,只涉及基本增删改查
- 连接数据库方面冗余代码较多,没有单独分出来
不过对于新手来说比较友好,涉及的内容不多,可以作为入门小小小项目。项目逻辑简单且明了。
如果需要源码的话,可以从CSDN下载,只需要3个C币,如果有C币的话,还请支持一下,地址为:
下载地址https://download.csdn.net/download/weixin_44215175/12582906
如果没有C币的话,也可以从GitHub上获取,GitHub源码地址:
源码地址https://github.com/Fjz-Kuroko/ThreeTierSample