一、视频展示
https://www.bilibili.com/video/BV1xM4y1K71m
二、基本介绍
1、关键技术
开发工具 | IntelliJ IDEA |
数据库 | MySQL 5.7 |
前端技术 | Jquery + Bootstrap + JSP |
后台技术 | Spring + Spring MVC + MyBatis |
日志记录 | log4j |
2、项目目录结构
项目的整体结构如下:
具体介绍如下:
(1)程序代码的存放目录——src下的java
controller | 负责在页面和程序之间传输数据的,做页面的跳转 |
dao | 负责对数据向数据库增删改查的操作 |
entity | 实体类。一般与数据库中的属性值基本保持一致 |
service | 负责业务模块的应用逻辑设计 |
utils | 工具包。 |
(2)资源文件的存放目录——resources
mapper | 存放Mabtis的映射文件 |
applicationContext-mybatis.xml | Spring整合MyBatis的配置文件 |
applicationContext-SpringMVC.xml | Spring整合Spring MVC的配置文件 |
jdbc.properties | MySQL的配置文件 |
log4j.properties | 日志配置文件 |
(3)页面文件的存放目录——webapp
bootstrap | 存放Boostrap的文件 |
css | 存放页面CSS样式 |
img | 存放图片资源 |
js | 存放js文件 |
WEB-INF | 包括了pages和web.xml。前者用于存放页面,后者则是web项目的配置文件信息 |
index.jsp | 项目启动时的首页 |
(4)测试类的目录——test
(5)maven的配置文件——pom.xml
3、项目处理流程
首先,用户在页面输入数据,由Controller接收数据,并对数据进行封装。之后再调用业务层(service),进行各种业务处理,而业务层收到这个数据之后,会调用DAO层,进行持久化操作。最后,再将查询得到的结果反馈给用户。如下图:
三、技术要点
1、查询结果的分页显示
分页查询是页面展示所必需的。当数据量小的时候,可以在一页展示。但是如果数据库中的数据量达到了成百上千条,若是将数据展示在一页上,则很影响用户体验。因此,就需要做分页查询。在该项目中,实现的分页查询是比较基础的,具体步骤如下:
(1)创建一个Page工具类
/**
* 分页实体类:存储当前页所有分页相关的数据
*/
public class Page {
//起始位置
public int start = 0;
//每页现实的条数
public int count = 3;
//结束位置
public int last = 0;
//当前页的页码
public int currentIndex = 1;
//总共的页数
public int totalIndex;
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public int getLast() {
return last;
}
public void setLast(int last) {
this.last = last;
}
public int getCurrentIndex() {
return currentIndex;
}
public void setCurrentIndex(int currentIndex) {
this.currentIndex = currentIndex;
}
public int getTotalIndex() {
return totalIndex;
}
public void setTotalIndex(int totalIndex) {
this.totalIndex = totalIndex;
}
public Page() {
}
public void calculateLast(int total) {
if(0==total%count) {
last = total-count;
}else {
last = total-total%count;
}
}
@Override
public String toString() {
return "Page{" +
"start=" + start +
", count=" + count +
", last=" + last +
'}';
}
}
(2)编写sql语句
sql语句用来查找指定条数的记录,故此需要使用到 limit关键字。如下:
获取数据库表中的记录
<select id="list" resultType="com.entity.TestEntity">
select * from t_test
<if test="start!=null and count!=null">
limit #{start},#{count}
</if>
</select>
获取记录总数
<select id="total" resultType="int">
select count(*) from t_test;
</select>
(3)通过Controller层调用service层,然后调用DAO层执行sql语句,这里直接给出Controller层的方法内容,如下:
@RequestMapping("/getTest")
public ModelAndView getTest(Page page){
ModelAndView mav = new ModelAndView();
//从数据库中获取记录
List<TestEntity> cs = testDao.list(page);
//获取记录总数
int total = testDao.total();
//计算得到总页数
int pageIndex = total / page.getCount();
pageIndex = total % page.getCount() == 0 ? pageIndex : pageIndex+1;
page.setTotalIndex(pageIndex);
page.calculateLast(total);
//将数据返回前端页面
mav.addObject("testList",cs);
mav.addObject("page",page);
mav.addObject("total",total);
mav.setViewName("test");
return mav;
}
2、HttpSession的使用
之所以用到了HttpSession,是因为在页面设计时,将顶部的导航栏提取出来,作为了公共部分。而在登陆之后,有一个欢迎XXX登录。考虑到因为侧边栏的切换而导致的数据在一次请求之后无法再次使用,所以在登录之后,在LoginController中将用户信息放入到了session之中。
四、存在问题
1、未解决Bootstrap的modal传值问题。(如果有小伙伴做过这方面的,希望能指点我一下)
2、如果条件查询时,没有符合条件的,未在前端页面没有做提示功能。
3、缺少对用户信息的JS校验。
4、缺少错误信息提示界面。
五、总结
从整体来讲,大部分功能基本完成,实现了基本的CRUD操作,整体可观,单略有不足,后期我也会慢慢纠正的。在做这个练手项目的时候,刚开始计划3-5天完成,后来因为考试和一些其他事情,搁置了将近半个月。结果第二次开始做的时候,忘了很多的功能点和注意点,反倒出现了掣肘现象。所以大家如果做什么项目,一定要趁热打铁,没时间也要挤时间,做事一定要有连续性,这样间断性的开发会浪费更多的时间。