一、项目概况
用纯MVC的模式实现前后端分离的“学生信息管理系统”,主要实现学生信息(姓名,学号,年龄,住址,密码)的增删改查功能,前端界面很low。下图是项目的主页面,然点击相应的按钮可以实现相应的功能。
二、开发环境
后端编译器:IDEA
前端的编译器:vscode
数据库:mysql
三、项目的目录结构
1.后端
2.前端
四、项目搭建步骤
1.创建数据库表
2.在Utils包下进行数据库连接测试
DBHelper.java
package com.whj.utils;
import java.sql.Connection;
import java.sql.DriverManager;
public class DBHelper {
static Connection conn=null;
public static Connection getConnection() {
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8";
String username="root";
String password="123456";
try {
Class.forName(driver);
conn=(Connection)DriverManager.getConnection(url, username, password);
}catch(Exception e) {
e.printStackTrace();
}
return conn;
}
public static void main(String[] args) {
if(new DBHelper().getConnection()!=null) {
System.out.println("成功");
}else if(new DBHelper().getConnection()==null){
System.out.println("失败");
}
}
}
3.在pojo包下创建与数据库表字段对应的实体类
Stu.java
package com.whj.pojo;
public class Stu {
private int sno;
private String sname;
private int sage;
private String saddress;
private String spwd;
public Stu(){}
@Override
public String toString() {
return "Stu{" +
"sno=" + sno +
", sname='" + sname + '\'' +
", sage=" + sage +
", saddress='" + saddress + '\'' +
", spwd='" + spwd + '\'' +
'}';
}
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getSage() {
return sage;
}
public void setSage(int sage) {
this.sage = sage;
}
public String getSaddress() {
return saddress;
}
public void setSaddress(String saddress) {
this.saddress = saddress;
}
public String getSpwd() {
return spwd;
}
public void setSpwd(String spwd) {
this.spwd = spwd;
}
public Stu(int sno, String sname, int sage, String saddress, String spwd) {
this.sno = sno;
this.sname = sname;
this.sage = sage;
this.saddress = saddress;
this.spwd = spwd;
}
public Stu( String sname, int sage, String saddress, String spwd) {
this.sname = sname;
this.sage = sage;
this.saddress = saddress;
this.spwd = spwd;
}
}
4.在dao包下创建项目所需要实现的所有方法的接口
StuDao.java
package com.whj.dao;
import com.whj.pojo.Stu;
import java.util.List;
public interface StuDao {
//登录验证
public boolean CheckLogin(String name,String pwd);
//学生信息展示
public List<Stu> SearchStuInfo();
//新增学生信息
public boolean addStuInfo(Stu student);
//删除学生信息
public boolean delStuInfo(int sno);
//更新学生信息
public boolean updateStuInfo(int sno,Stu student);
}
5.在dao包下创建StuDaoImpl.java来实现接口tuDao.java中的方法
StuDaoImpl.java
package com.whj.dao;
import com.whj.pojo.Stu;
import com.whj.utils.DBHelper;
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 StuDaoImpl implements StuDao{
Connection conn = DBHelper.getConnection();
//登陆验证
public boolean CheckLogin(String name, String pwd) {
boolean flag=false;
String sql = "select count(*) from stu where sname=? and spwd =?; ";
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1,name);
pstmt.setString(2,pwd);
ResultSet rs = pstmt.executeQuery();
if(rs.next()){
flag=true;
}else{
flag=false;
}
} catch (SQLException e) {
e.printStackTrace();
}
return flag;
}
//显示学生信息
public List<Stu> SearchStuInfo() {
ArrayList<Stu> student = new ArrayList<>();
boolean flag=false;
String sql="select * from stu";
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
int sno = rs.getInt("sno");
String sname = rs.getString("sname");
int sage = rs.getInt("sage");
String saddress = rs.getString("saddress");
String spwd = rs.getString("spwd");
Stu stu = new Stu(sno, sname, sage, saddress, spwd);
student.add(stu);
}
} catch (SQLException e) {
e.printStackTrace();
}
return student;
}
//新增学生信息
public boolean addStuInfo(Stu student) {
boolean flag=false;
String sql="insert into stu values(?,?,?,?,?)";
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,student.getSno());
pstmt.setString(2,student.getSname());
pstmt.setInt(3,student.getSage());
pstmt.setString(4,student.getSaddress());
pstmt.setString(5,student.getSpwd());
int i = pstmt.executeUpdate();
if(i>0)
flag=true;
else
flag=false;
} catch (SQLException e) {
e.printStackTrace();
}
return flag;
}
//删除学生信息
public boolean delStuInfo(int sno) {
boolean flag=false;
String sql="delete from stu where sno=?";
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,sno);
int i = pstmt.executeUpdate();
if(i>0)
flag=true;
else
flag=false;
} catch (SQLException e) {
e.printStackTrace();
}
return flag;
}
//更新学生信息
public boolean updateStuInfo(int sno, Stu student) {
boolean flag=false;
String sql="update stu set sname=?,sage=?,saddress=?,spwd=? where sno=?";
try {
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1,student.getSname());
pstmt.setInt(2,student.getSage());
pstmt.setString(3,student.getSaddress());
pstmt.setString(4,student.getSpwd());
pstmt.setInt(5,sno);
int i = pstmt.executeUpdate();
if(i>0)
flag=true;
else
flag=false;
} catch (SQLException e) {
e.printStackTrace();
}
return flag;
}
}
6.在controller包下依次创建servlet来进行逻辑实现和前后端的交互
①searchStuInfoServlet.java
package com.whj.controller;
import com.alibaba.fastjson.JSON;
import com.whj.dao.StuDao;
import com.whj.dao.StuDaoImpl;
import com.whj.pojo.Stu;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
import java.util.List;
//显示所有学生的信息
public class searchStuInfoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
System.out.println("进入了查询所有学生信息的界面");
/* 允许跨域的主机地址 */
response.setHeader("Access-Control-Allow-Origin", "*");
/* 允许跨域的请求方法GET, POST, HEAD 等 */
response.setHeader("Access-Control-Allow-Methods", "*");
/* 重新预检验跨域的缓存时间 (s) */
response.setHeader("Access-Control-Max-Age", "3600");
/* 允许跨域的请求头 */
response.setHeader("Access-Control-Allow-Headers", "*");
/* 是否携带cookie */
response.setHeader("Access-Control-Allow-Credentials", "true");
StuDao sd = new StuDaoImpl();
List<Stu> Students = sd.SearchStuInfo();
String Students_json_str = JSON.toJSONString(Students);
System.out.println(Students_json_str);
Writer out = response.getWriter();
// out.write("servlet中的学生信息返回成功");
out.write(Students_json_str);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
System.out.println("进入了查询所有学生信息的界面");
/* 允许跨域的主机地址 */
response.setHeader("Access-Control-Allow-Origin", "*");
/* 允许跨域的请求方法GET, POST, HEAD 等 */
response.setHeader("Access-Control-Allow-Methods", "*");
/* 重新预检验跨域的缓存时间 (s) */
response.setHeader("Access-Control-Max-Age", "3600");
/* 允许跨域的请求头 */
response.setHeader("Access-Control-Allow-Headers", "*");
/* 是否携带cookie */
response.setHeader("Access-Control-Allow-Credentials", "true");
StuDao sd = new StuDaoImpl();
List<Stu> Students = sd.SearchStuInfo();
String Students_json_str = JSON.toJSONString(Students);
System.out.println(Students_json_str);
Writer out = response.getWriter();
out.write("servlet中的学生信息返回成功");
out.write("stuinfo:"+Students_json_str);
}
}
②addStuInfoServlet.java
package com.whj.controller;
import com.whj.dao.StuDao;
import com.whj.dao.StuDaoImpl;
import com.whj.pojo.Stu;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
//新增学生信息
public class addStuInfoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
System.out.println("进入了查询所有学生信息的界面");
/* 允许跨域的主机地址 */
response.setHeader("Access-Control-Allow-Origin", "*");
/* 允许跨域的请求方法GET, POST, HEAD 等 */
response.setHeader("Access-Control-Allow-Methods", "*");
/* 重新预检验跨域的缓存时间 (s) */
response.setHeader("Access-Control-Max-Age", "3600");
/* 允许跨域的请求头 */
response.setHeader("Access-Control-Allow-Headers", "*");
/* 是否携带cookie */
response.setHeader("Access-Control-Allow-Credentials", "true");
int sno =Integer.parseInt(request.getParameter("sno"));
String sname = request.getParameter("sname");
int sage =Integer.parseInt(request.getParameter("sage"));
String saddress = request.getParameter("saddress");
String spwd = request.getParameter("spwd");
Stu student=new Stu(sno,sname,sage,saddress,spwd);
StuDao sd = new StuDaoImpl();
boolean rs = sd.addStuInfo(student);
if(rs){
System.out.println("学生信息返回是true");
response.sendRedirect("searchStuInfoServlet");//新增成功后再返回信息展示页面
Writer out = response.getWriter();
out.write("servlet中的新增学生信息返回成功");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
③delStuInfoServlet.java
package com.whj.controller;
import com.whj.dao.StuDao;
import com.whj.dao.StuDaoImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
//删除学生信息
public class delStuInfoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
System.out.println("进入了查询所有学生信息的界面");
/* 允许跨域的主机地址 */
response.setHeader("Access-Control-Allow-Origin", "*");
/* 允许跨域的请求方法GET, POST, HEAD 等 */
response.setHeader("Access-Control-Allow-Methods", "*");
/* 重新预检验跨域的缓存时间 (s) */
response.setHeader("Access-Control-Max-Age", "3600");
/* 允许跨域的请求头 */
response.setHeader("Access-Control-Allow-Headers", "*");
/* 是否携带cookie */
response.setHeader("Access-Control-Allow-Credentials", "true");
int sno = Integer.parseInt(request.getParameter("sno"));
StuDao sd = new StuDaoImpl();
boolean rs = sd.delStuInfo(sno);
if(rs){
Writer out = response.getWriter();
out.write("成功删除学生信息");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
④updateStuInfoServlet.java
package com.whj.controller;
import com.whj.dao.StuDao;
import com.whj.dao.StuDaoImpl;
import com.whj.pojo.Stu;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
//更新学生信息
public class updateStuInfoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
System.out.println("进入了查询所有学生信息的界面");
/* 允许跨域的主机地址 */
response.setHeader("Access-Control-Allow-Origin", "*");
/* 允许跨域的请求方法GET, POST, HEAD 等 */
response.setHeader("Access-Control-Allow-Methods", "*");
/* 重新预检验跨域的缓存时间 (s) */
response.setHeader("Access-Control-Max-Age", "3600");
/* 允许跨域的请求头 */
response.setHeader("Access-Control-Allow-Headers", "*");
/* 是否携带cookie */
response.setHeader("Access-Control-Allow-Credentials", "true");
int sno =Integer.parseInt(request.getParameter("sno"));
String sname = request.getParameter("sname");
int sage =Integer.parseInt(request.getParameter("sage"));
String saddress = request.getParameter("saddress");
String spwd = request.getParameter("spwd");
Stu student=new Stu(sname,sage,saddress,spwd);
StuDao sd = new StuDaoImpl();
System.out.println(sno);
boolean rs = sd.updateStuInfo(sno, student);
if(rs){
response.sendRedirect("searchStuInfoServlet");//新增成功后再返回信息展示页面
Writer out = response.getWriter();
out.write("servlet中的更新学生信息返回成功");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
7.前端代码
①StuDisplay.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>学生信息展示页面</title>
<script src="/statics/js/jquery.js"></script>
<script src="/statics/js/jquery.min.js"></script>
</head>
<style>
.table{
border: 1px solid black;
}
</style>
<body>
<table cellspacing="1" cellpadding="1" border="1" class="table" id="StuTable">
<button id="add">新增</button>
</table>
</body>
<script type="text/javascript">
$(function(){
//显示数据库中的所有学生信息
$.ajax({
url:"http://localhost:8080/searchStuInfoServlet",
type:"post",
header:{
'content-type':'application/json',
},
// dataType: "JSON",
success:function(res){
console.log(res);
var jsonArray=JSON.parse(res);//把json转换成json字符串
// var jsonArray=eval(res);//第二种方法把json转换成json字符串
console.log("结果是"+jsonArray[0].sname);//获取到的whj
var delid="del";
var editid="edit";
$.each(jsonArray,function (i, item) {//遍历
var tr = $("<tr>名字是:<td>" + jsonArray[i].sname+ "</td>学号是:<td>"
+ jsonArray[i].sno + "</td>年龄是:<td>"+ jsonArray[i].sage+ "</td>住址是:<td>"
+ jsonArray[i].saddress+ "</td>密码是:<td>" + jsonArray[i].spwd+"</td><td><button id='"+jsonArray[i].sno+"' onclick="+delid+"(this.id)"+">删除</button><button id='"+jsonArray[i].sno+"' onclick="+editid+"(this.id)"+">编辑</button></td></tr>");
//动态生成列表
$("#StuTable").append(tr);
});
},
error:function(res){
alert("学生信息返回失败")
}
})
});
//新增的方法
$("#add").click(function(){
$(window).attr('location',"add.html");
})
//编辑的方法
function edit(id){
$(window).attr('location',"edit.html");
}
//删除的方法
function del(id){
var sno=id;
alert("学号是:"+sno);
$.ajax({
url:"http://localhost:8080/delStuInfoServlet",
type:"post",
data:{
sno:sno,
},
success:function(res){
console.log(res)
alert("删除成功")
window.location.reload();
}
})
}
</script>
</html>
②add.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>新增学生信息界面</title>
<script src="/statics/js/jquery.js"></script>
<script src="/statics/js/jquery.min.js"></script>
</head>
<body>
<form id="form">
姓名:<input type="text" name="sname"><br>
学号:<input type="text" name="sno"><br>
年龄:<input type="text" name="sage"><br>
住址:<input type="text" name="saddress"><br>
密码:<input type="text" name="spwd"><br>
<input type="submit" id="save" value="新增">
<input type="button" id="back" value="返回"><br>
</form>
</body>
<script type="text/javascript">
$(function(){
$("#save").click(function(){
var formArray =$("#form").serializeArray();
alert(formArray[0].name+"--"+formArray[0].value+
formArray[1].name+"--"+formArray[1].value+
formArray[2].name+"--"+formArray[2].value+
formArray[3].name+"--"+formArray[3].value+
formArray[4].name+"--"+formArray[4].value);
$.ajax({
url:"http://localhost:8080/addStuInfoServlet",
type:"post",
data:{
sname:formArray[0].value,
sno:formArray[1].value,
sage:formArray[2].value,
saddress:formArray[3].value,
spwd:formArray[4].value
},
success:function(res){
alert("学生信息增加成功")
},
error:function(res){
alert("学生信息增加失败")
}
});
}),
$("#back").click(function(){
$(window).attr('location',"StuDisplay.html");
})
})
</script>
</html>
③edit.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="/statics/js/jquery.js"></script>
<script src="/statics/js/jquery.min.js"></script>
</head>
<body>
<form id="form">
姓名:<input type="text" name="sname"><br>
学号:<input type="text" name="sno"><br>
年龄:<input type="text" name="sage"><br>
住址:<input type="text" name="saddress"><br>
密码:<input type="text" name="spwd"><br>
<input type="submit" id="update" value="更新">
<input type="button" id="back" value="返回"><br>
</form>
</body>
<script>
$(function(){
$("#update").click(function(){
var formArray =$("#form").serializeArray();
alert(formArray[0].name+"--"+formArray[0].value+
formArray[1].name+"--"+formArray[1].value+
formArray[2].name+"--"+formArray[2].value+
formArray[3].name+"--"+formArray[3].value+
formArray[4].name+"--"+formArray[4].value);
$.ajax({
url:"http://localhost:8080/updateStuInfoServlet",
type:"post",
data:{
sname:formArray[0].value,
sno:formArray[1].value,
sage:formArray[2].value,
saddress:formArray[3].value,
spwd:formArray[4].value
},
success:function(res){
alert("学生信息更新成功")
},
error:function(res){
alert("学生信息更新失败")
}
});
})
$("#back").click(function(){
$(window).attr('location',"StuDisplay.html");
})
})
</script>
</html>
五、总结和展望
前端显示太low了,还是自己技术不行,vue框架没学过,之后会把这个项目用SSM框架再做一遍,然后也会抽空去学vue框架,争取做的更好看。加油哦。