学生管理系统(SSM简易版)总结
之前用 Servlet + JSP 实现了一个简易版的学生管理系统,在学习了 SSM 框架之后,我们来对之前写过的项目重构一下!
技术准备
为了完成这个项目,需要掌握如下技术:
- Java
基础知识 - 前端:
HTML, CSS, JAVASCRIPT, JQUERY - J2EE:
Tomcat, Servlet, JSP, Filter - 框架:
Spring, Spring MVC, MyBatis, Spring 与 MyBatis 整合, SSM 整合 - 数据库:
MySQL - 开发工具:
IDEA, Maven
开发流程
之前虽然已经使用 Servlet + JSP 完成了简单的开发,这次使用 SSM 仅仅是重构工作,但我们仍然按照商业项目的开发步骤来一步一步完成,进一步熟悉这个过程,重复的部分我就直接复制了。
① 需求分析
首先要确定要做哪些功能
- 使用数据库来保存数据
- 能增删改查学生的信息(学号,名称,年龄,性别,出生日期)
② 表结构设计
根据需求,那么只需要一个 student 表就能够完成功能了。
- 创建数据库:student
将数据库编码格式设置为 UTF-8 ,便于存取中文数据
- 创建学生表:student
不用学生学号(studentID)作为主键的原因是:不方便操作,例如在更新数据的时候,同时也要更改学号,那这样的操作怎么办呢?
所以我们加了一个 id 用来唯一表示当前数据。
MySQL 在 Windows 下不区分大小写,但在 Linux 下默认区分大小写,因此,数据库名、表明、字段名都不允许出现任何大写字母,避免节外生枝。
③ 原型设计
就是设计界面,在商业项目中,这是很重要的一步,我们可以解除界面原型,低成本、高效率的与客户达成需求的一致性。
这个项目一共就分为两个页面:
主页面:

④ SSM 环境搭建
在真正开始编写代码之前,我们首先需要先来搭建好我们的 SSM 环境。
第一步:创建 Maven webapp 项目
首先新建工程,选择 Maven 标签,然后勾选上【Create from archetype】选择 webapp:

点击下一步,填写上【GroupId】和【ArtifactId】:

- GroupId:项目组织唯一的标识符,实际对应 JAVA 的包的结构,也就是 main 目录下 java 的目录结构(包)
- AritifactId:项目的唯一标识符,实际对应项目的名称,就是项目根目录的名称
- 实际上你可以乱填上试试,我就不乱填了
然后是确认项目路径,这一步你可以看到 Maven 配置中的参数,不需要做改动,直接下一步就可以(图中的路径是我配置的本地 Maven 仓库的地址):

确认项目名称和路径,点击【Finish】即可:

等待一会儿,控制台就会有创建成功的提示信息,我们把【Enable Auto-Import】点上,这个提示会在每次 pom.xml 有改动时出现,自动导入,省掉麻烦:

第二步:搭建项目目录结构
下面就是 Maven 风格的 webapp 的默认目录结构:

- 注意: webapp 是默认没有 java 源文件也没有 test 目录的。
遵循 Maven 的统一项目结构,我们搭建出项目的完整目录结构如下图:

- 我们并没有使用 Log4j 来输出日志,而是使用 logback
- 提示:我们可以在 IDEA 中右键目录然后选择【Make Directory as】,让 IDEA 识别不同的目录作用

这里的目录建好之后还需要设置一下,让 IDEA 识别目录作用,选择【File】>【Project Structure】:

设置好之后点击 OK,即完成了项目目录的搭建。
第三步:配置文件内容
在【pom.xml】文件中声明依赖的 jar 包 :
<build>
标签是默认生成的- 我们在
<properties>
中声明了编码格式以及使用的 spring 和 mybatis 的版本号,然后在<dependencies>
中声明了具体的 jar 包
在【web.xml】中声明编码过滤器并配置 DispatcherServlet :
在【spring-mybatis.xml】中完成 spring 和 mybatis 的配置:
在【spring-mvc.xml】中完成 Spring MVC 的相关配置:
在【jdbc.properties】中配置 c3p0 数据库连接池:
在【logback.xml】中完成日志输出的相关配置:
以上就完成了 SSM 框架的基本配置:
- 添加进了 SSM 项目所需要的 jar 包
- 配置好了 spring/mybatis/spring MVC 的相关配置信息(自动扫描
cn.wmyskxz
包下的带有注解的类) - 通过 xml 配置的方式配置好了日志和数据库
⑤ 实体类设计
实体类仅仅是对数据库中表的一一映射(表中字段名应该和实体类中的名称一一对应),同时可能还需要兼顾对业务能力的支持。
- 在 Packge【cn.wmyskxz.entity】下创建 Student 类:
⑤ DAO 类的设计
DAO,即 Date Access Object,数据库访问对象,就是对数据库相关操作的封装,让其他地方看不到 JDBC 的代码。
在【cn.wmyskxz.dao】包下创建【StudentDao】接口:
然后在【resources/mapper】下创建好对应的映射文件【StudengDao.xml】:
编写好了 Dao 类是需要测试的,这里测试类就不给出了。
⑦ 业务类设计
- 问题: 为什么不直接使用 Dao 类而是还要在上面封装一层 Service 层呢?
- 回答:
基于责任分离的原则,Dao 层就应该专注于对数据库的操作,而在 Service 层我们可以增加一些非 CRUD 的方法去更好的完成本身抽离出来的 service 服务(业务处理)。
在【cn.wmyskxz.service】包下创建【StudentService】接口:
并在相同包名下创建实现类【StudentServiceImpl】:
⑧ 功能开发
在【cn.wmyskxz.controller】包下创建【StudentController】控制器,代码基本上都是复制黏贴之前在 Servlet 中的代码:
- 注意: 所有的学号都用 student_id 表示,为了契合在数据库中的字段名(包括下面的 JSP 文件)
JSP 文件也直接黏之前的就好了,不过需要注意所有的 name
属性:
- 【listStudent.jsp】:
- 【editStudent.jsp】:
- style.css 文件:
项目的整体结构

分页功能
- 首先在 Packge【util】包下创建一个 Page 工具类:
- totalPage 是计算得来的数,用来表示页码一共的数量
在首页显示的 StudentList 用 page 的参数来获取:
并且在映射文件中用 LIMIT 关键字:
-
第一个参数为 start,第二个参数为 count
这样就能根据分页的信息来获取到响应的数据 -
编写分页栏:
1.写好头和尾
2.写好«
‹
这两个功能按钮
使用 <c:if>
标签来增加边界判断,如果没有前面的页码了则设置为disable状态
再通过 JavaScrip 代码来完成禁用功能:
3.完成中间页码的编写
从 0
循环到 page.totalPage - 1
,varStatus
相当于是循环变量
- status.count 是从1开始遍历
- status.index 是从0开始遍历
- 要求:显示当前页码的前两个和后两个就可,例如当前页码为3的时候,就显示 1 2 3(当前页) 4 5 的页码
- 理解测试条件:
-10 <= 当前页*每一页显示的数目 - 当前页开始的数据编号 <= 30

- 只要理解了这个判断条件,其他的就都好理解了
4.在控制器中获取参数
Date 转换的问题
最开始的时候,我们看到页面上显示的日期是这样的格式:

这显然是我们不希望看到的
- 解决方案:在映射文件中设置日期显示的类型。

重新部署文件,然后刷新页面,就能看到我们希望的效果啦:

项目总结
- 由于之前的项目代码都有,所以在重构的时候,基本上没有花什么时间就完成了项目的搭建,能够体会到代码分离的重要性,这在很大程度上保证了我们的代码复用。
- 相较于之前用 Servlet + JSP 来完成,很明显的感觉是DAO层的编写方便了很多,仅仅需要编写一个 xml 映射文件和一个 Dao 层接口就可以完成功能,而不用自己再去重复的去在每一个 CRUD 方法中去处理结果集,重复而且繁琐。
- 注解真的很方便,这不仅仅提升了我们自身开发的效率,写起来也很带劲儿。
- 开发效率快,而且低耦合,我们基于 xml 配置了大部分的工作,在基于 SSM 框架开发时,我们可以把专注点集中在逻辑处理上。
- 在 SSM 框架中能方便的对项目进行修改,这不仅仅得益于框架的约定,使得代码分离并且可复用,也得益于 Maven 工具对于项目的管理。
- 我们能够通过一个 Controller 来完成五个 Servlet 的功能,并且通过注解来完成配置。
项目改进
项目很简单,仅仅也只是在数据库增删改查的基础上增加了一个界面,我们来动手改一改。
改进一:增加删除提示
第一个想到的就是删除提示,没有删除提示是很要命的一件事情,如果手滑了一下那可能就悲剧了....
首先我们在顶部的 <head>
标签中的 <script>
中增加一段代码:
然后在删除 a 标签页中增加 onclick 属性:
当我们刷新页面后,点击删除就会弹出提示信息:

改进二:编辑页面自动勾选上性别
在当前的项目中,如果点击编辑按钮进入到编辑页面后,性别这个选项是空选的状态,这就很low:

这个也很简单,在 editStudent 页面增加一些判断就好了:

用 <c:if>
标签来判断 sex 的值,然后根据对应的属性增加 checked 属性,这样就可以自动勾选上所对应的属性:

改进三:空值判断
我们允许设置为 null 的值仅仅为出生日期,其他的值均不允许出现空值,所以我们需要加入空值判断:
然后再为 form 创建一个 id 属性值为 “addForm” 并添加进判断空值的方法:

- 注意: 这里需要写在 $(function(){}) 里面,等待文档加载完毕才能生效。
- 这里并没有为 sex 属性判断空值,我们采用一个简单的为 sex 添加一个默认勾选项来省略空值的判断。
同样的,我们也在编辑页面,采用同样的方法进行空值判断:

- 当进入编辑页面的时候已经有默认的勾选项了,所以 sex 值仍然不需要判空
- 最后给出项目地址:https://github.com/wmyskxz/StudentManager-SSM
欢迎转载,转载请注明出处!
简书ID:@我没有三颗心脏
github:wmyskxz
欢迎关注公众微信号:wmyskxz_javaweb
分享自己的Java Web学习之路以及各种Java学习资料
__EOF__

本文链接:https://www.cnblogs.com/wmyskxz/p/8933898.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?