JAVA+Servlet+JavaBean+MySsql+Maven 学生学籍信息管理系统
基于Maven的WEB学生信息管理系统
前言
为新学习 JSP 的开发爱好者小白写下这篇文章,教你若何创建一个自己的学生信息管理系统,可能有很多小白也在迷茫中,建议你不要灰心啊,在下面我讲给你叙述如何进行完成一套自己的系统,并且提供两套版本,一套为 IntelliJ IDEA 进行开发的版本,一套为 eclipse 开发的系统版本,接下来我以 Idea 开发为基础,整套开发方式完全基于 MVC 架构思想为新入门的小白们进行一步一步的讲解这一块的知识。以下所有信息都是个人完成,若有转载或者借鉴请注明出处。
环境
属性 | 工具 | 版本要求 |
---|---|---|
系统要求 | Windows 10 | 内存 8G 硬盘500G |
JDK | jdk1.8版本 | 1.8 |
开发工具 | IntelliJ IDEA | 2018.2.4 x64 |
数据库类型 | MySQL | 5.7.22 |
开发方式 | Maven | 3.6 |
环境说明
本项目基于 Maven进行开发,使用Maven进行管理 jar
包,所有大家若是不了解 Maven 开发的小白需要自行学习若何使用 Maven 进行开发项目。
设计数据库数据
数据库名字:assess
数据库连接默认数据库名:root
数据库连接默认密码:root
数据库中默认拥有用户名:admin
数据库中默认拥有密码:admin
序号 | 字段 | 描述 | 类型和长度 | 其他 | 默认值 |
---|---|---|---|---|---|
1 | id | 唯一编号 | int(100) | 主关键字、自增列 | 无 |
2 | username | 用户名 | varchar(50) | 非空 | 无 |
3 | password | 密码 | varchar(50) | 非空 | 无 |
4 | snum | 学号 | int(50) | 非空 | 无 |
5 | sex | 性别(男女分别:0是男,1是女;) | tinyint(50) | 非空 | 1 |
6 | major | 专业 | varchar(100) | 非空 | 无 |
7 | age | 年龄 | int(50) | 非空 | 无 |
登录页面 login.jsp
login.jsp
页面主要是为了进行登录,在这个表单页面主要有一个 <form></form>
标签,中间使用了两个 <input></input>
标签进行输入用户名与密码,以 post
方式进行提交到后台。 action
属性里面是提交的路径。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style type="text/css">
*{
height: auto;
width: auto;
}
</style>
</head>
<body>
<div align="center">
<form action="/login" method="post">
<div style="color: red ;font-size: 22px;" >
${msg_error == null ? "" : msg_error}
</div>
<img src="./images/background.png" style="height: auto;width: auto;background-size: 100%">
<div >
<div style="float: left; position: relative;top: -430px;left: 670px">
<input type="text" id="username" name="username" style="height: 36px;width: 204px;">
<br>
<input type="password" id="password" name="password" style="height: 36px;width: 204px;margin-top: 30px;">
<br>
<input type="submit" value="登录" style=" width: 70px;height:35px; margin-top: 25px;">
<input type="reset" value="重置" style=" width: 70px;height: 35px; margin-top: 25px;">
</tr>
</div>
</div>
</form>
</div>
</body>
</html>
LoginServlet 控制登录
设置 loginServlet
中的提交路径为 /login
提交方式为 POST
方式进行提交
整个项目第一个页面是使用 loginServlet
进行默认跳转到 login.jsp
页面,在注解@WebServlet(name = "login", value = {"", "/login"})
中有所体现。
因 login.jsp
页面使用的是 POST
方式的提交,所以,在 doPost
方法中进行获取前台提交的数据信息。获取方式为
String username = request.getParameter("username");
String password = request.getParameter("password");
紧接着就是进行判断,当前获取到的用户名是否为空,若是为空的话,默认跳转到登录页面。
若获取到的用户名不为空,则进行数据库连接,进行查找数据库中是否有这个用户,若是有这个用户,则把这个用户的信息都取出来赋给新建的 userBean
对象,拿到获取的不为空的对象,进行密码的比对,通过比对以后通过后,进行重定向到 index.jsp
主页面且进行第一次全部信息的查询。若是在数据库中没有查到这个用户,通过 reqest
重建新属性,返回到登录页面前面使用 el
表达式进行获取返回到前台的数值,且给出一个提示(该账号不存在!),若是有此用户,且用户密码比对不成功的话,给出提示(密码错误,请重新输入!)
package com.demo.web.controller;
import com.demo.bean.UserBean;
import com.demo.dao.JdbcUtils;
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.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@WebServlet(name = "login", value = {"", "/login"})
public class LoginController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
UserBean userBean = new UserBean();
if (!"".equals(username)) {
//获取数据库连接
Connection connection = JdbcUtils.getConnection();
String sql = "select * from studentinfo where username=\"" + username + "\"";
//获取当前用户信息
try {
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
userBean.setId(resultSet.getInt("id"));
userBean.setUsername(resultSet.getString("username"));
userBean.setPassword(resultSet.getString("password"));
userBean.setSnum(resultSet.getInt("snum"));
userBean.setSex(resultSet.getBoolean("sex"));
userBean.setMajor(resultSet.getString("major"));
userBean.setAge(resultSet.getInt("age"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if (connection.isClosed()){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
if (!"".equals(password) && userBean.getPassword().equals(password)) {
//登录成功重定向到主页
response.sendRedirect("/user?parm=selectAllUser");
} else {
request.setAttribute("msg_error", "密码错误,请重新输入!");
//登录失败跳转到登录页面
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
} else {
//账号不存在,跳转到登录页面
request.setAttribute("msg_error", "该账号不存在!");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
}
登录成功后直接跳转入主页面,并且进行第一次查询全部信息。
请求的是一个路径,且为后面介绍的 UserServlet
进行控制所有的请求路径信息。
//登录成功重定向到主页
response.sendRedirect("/user?parm=selectAllUser");
主页 index.jsp
通过后台查询全部的用户泛型列表数组返回到前端以后,需要对数据进行处理,在主页使用了前面提到的 el
表达式进行获取了数组,且引用了 jstl
标签中的 <c:forEach></c:forEach>
标签方法进行遍历数据。大家若是不懂这个标签,可以自行去百度中问度娘,在这里不进行啰嗦了。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<%--<meta http-equiv="Refresh" content="3;url=/userBean?parm=selectAllUser"/>--%>
<title>主页</title>
<link rel="stylesheet" href="/assets/bootstrap-3.3.7/css/bootstrap.min.css">
</head>
<body>
<div align="center">
<div style="max-width: 1000px">
<div>
${msg == null ? "" : "<div class='alert alert-info' role='alert'>"}
${msg == null ? "" : msg}
${msg == null ? "" : "</div>"}
</div>
<div style="margin-top: 20px;">
<table class="table table-striped table-bordered table-hover text-center">
<thead>
<tr>
<th colspan="7" class="text-center" style="height: 50px;font-size: 28px;background: dodgerblue">
学籍信息管理系统
</th>
</tr>
<tr>
<th colspan="7">
<form action="/user?parm=selectUserByName" method="post">
<div class="input-group">
<span class="input-group-btn">
<a class="btn btn-warning" href="/user?parm=selectAllUser" role="button"
target="_self">刷新主页</a>
<a class="btn btn-success" href="/user?parm=toAddUser" role="button" target="_self">添加学生信息</a>
<input type="submit" class="btn btn-primary" value="查询信息">
</span>
<input type="text" class="form-control" id="selectUserByName" name="selectUserByName"
value="${selectUserByName}" placeholder="Search for...">
</div>
</form>
</th>
</tr>
<tr>
<th class="text-center" style="background: aquamarine">id</th>
<th class="text-center" style="background: aquamarine">用户名</th>
<th class="text-center" style="background: aquamarine">学号</th>
<th class="text-center" style="background: aquamarine">性别</th>
<th class="text-center" style="background: aquamarine">专业</th>
<th class="text-center" style="background: aquamarine">年龄</th>
<th class="text-center" style="background: aquamarine">操作</th>
</tr>
</thead>
<tbody class="text-center">
<c:forEach items="${users}" var="user" varStatus="status">
<tr>
<td>${status.index+1}</td>
<td>${user.getUsername()}</td>
<td>${user.getSnum()}</td>
<td>${user.getSex()==false ? "男" : "女"}</td>
<td>${user.getMajor()}</td>
<td>${user.getAge()}</td>
<td>
<a href="/user?parm=toUpdateUser&uid=${user.getId()}" class="btn btn-info"
target="_self">修改</a>
<a href="/user?parm=deleteUser&uid=${user.getId()}" class="btn btn-danger"
target="_self">删除</a>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
进行第一次查询全部用户信息
查询全部用户信息,并且返回一个列表数组到前台页面。
在这里进行声明一下,每个请求路径都含有一个参数 parm
参数,参数的作用是为了进行导航这次的功能是为了做什么的,里面包含了请求做什么。举个例子:请求所有的信息查询为 /user?parm=selectAllUser
,接下来大家可以看下面的代码,方法中进行获取请求的参数 parm
中的内容,然后在下面进行每次的对比,若是 parm
等于前面这个方法即执行此方法中的方法。
下面这个查询全部信息以后,得到了以用户泛型列表数组,且返回到前台页面。
request.setCharacterEncoding("utf-8");
String parm = request.getParameter("parm");
//查询全部用户
if ("selectAllUser".equals(parm)){
List<UserBean> userBeanList = userService.selectAllUser(request, response);
request.setAttribute("users", userBeanList);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
增加用户
增加用户信息这一块使用了多个 input
标签进行输入值,也是同登录页一样,使用 POST
方法进行提交到后台,后台对齐进行数据的处理。
跳转进入增加用户界面
//跳转增加用户界面
else if ("toAddUser".equals(parm)){
request.getRequestDispatcher("/add.jsp").forward(request, response);
}
保存增加用户信息
request.setCharacterEncoding("utf-8");
String parm = request.getParameter("parm");
//增加用户
if ("addUser".equals(parm)){
Boolean isSuccess = userService.addUser(request, response);
if (isSuccess) {
List<UserBean> userBeanList = userService.selectAllUser(request, response);
request.setAttribute("msg", "增加用户成功");
request.setAttribute("users", userBeanList);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}else {
List<UserBean> userBeanList = userService.selectAllUser(request, response);
request.setAttribute("msg", "添加失败,有效信息不能为空");
request.setAttribute("users", userBeanList);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
修改用户信息
修改用户信息需要新对这个需要修改的用户进行一次的查询。并且获取该用户的所有信息返回到需要修改的用户框上面,这样的话,我们以用户唯一字段 id
进行查询,前台前端使用的方法为按钮方式进行提交到后台单独处理这条数据,且路径都是 /user?parm=toUpdateUser&uid=${user.getId()}
,这样对于每条数据都是单独的 id
请求路径,然后后台通过获取这个路径的 uid
即可得知操作的是哪一条数据
//跳转修改页面
else if("toUpdateUser".equals(parm)){
UserBean userBean = userService.selectUserById(request,response);
request.setAttribute("user", userBean);
request.getRequestDispatcher("/modify.jsp").forward(request, response);
}
然后进行获取当前页面的所有信息,进行存入数据库
//修改用户信息
else if("updateUser".equals(parm)){
Boolean isSuccess = userService.updateUser(request, response);
if (isSuccess) {
List<UserBean> userBeanList = userService.selectAllUser(request, response);
request.setAttribute("msg", "更新用户成功");
request.setAttribute("users", userBeanList);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}else {
List<UserBean> userBeanList = userService.selectAllUser(request, response);
request.setAttribute("msg", "更新失败,有效信息不能为空");
request.setAttribute("users", userBeanList);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
删除用户信息
同样删除用户信息也是使用唯一字段 id
进行操作的删除,同修改用户信息同理 /user?parm=deleteUser&uid=${user.getId()}
使用的单独的使用路径,操作每个用户的信息。
//删除用户信息
else if ("deleteUser".equals(parm)){
Boolean isSuccess = userService.deleteUser(request, response);
if (isSuccess) {
List<UserBean> userBeanList = userService.selectAllUser(request, response);
request.setAttribute("msg", "删除用户成功");
request.setAttribute("users", userBeanList);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
通过用户名关键字查询用户信息
//通过用户名关键词查询
else if ("selectUserByName".equals(parm)){
List<UserBean> userBeanList = userService.selectUserByName(request,response);
request.setAttribute("users", userBeanList);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
总结
总体来讲的话,整个项目严格按照 MVC 架构与思想进行设计开发,首先用户访问你的这个站点,需要进行登录,登录以后进入主页,主页的数据为实时的数据库中的数据信息,进行显示到主页面,使用了 JSP
中的标签进行排列读取数据信息,引入了 BootStrap
布局,让小白们接触一下布局风格,然后就是在每次的请求路径中都包含一个参数 parm
在此项目中,该参起到了至关重要的作用,主要作用就是进行导航每次的请求是为了做什么,这里面的 Servlet
起到了 Controller
的作用,进行路径请求的转发。其中的操作逻辑都交给 Service
来做业务逻辑操作。最后有什么问题可以在下面进行评论。哈哈
项目源码
Eclipse 开发版本下载 《JSP+Serlvet+JavaBean+Maven+MySql 学生 | 学籍 | 信息管理系统实战 Eclipse版本》
IDEA 开发版本下载 《JSP+Serlvet+JavaBean+Maven+MySql 学生 | 学籍 | 信息管理系统实战 Idea版本》