【基于轻量型架构的WEB开辟】课程 上|第15章 云借阅图书管理系统 《Java EE
第15章 云借阅图书管理系统学习目标/Target
[*]了解云借阅图书管理系统架构
[*]了解云借阅图书管理系统的文件组织结构
[*]认识系统环境搭建步调
[*]掌握登录模块功能的实现
[*]掌握图书管理模块功能的编写
[*]掌握访问权限控制的实现
章节概述/Summary
本章将通过前面章节学习的SSM(Spring+Spring MVC+MyBatis)框架知识来实现一个简单的云借阅图书管理系统。云借阅图书管理系统在开辟过程中,整合了三大框架,并在框架整合的基础上实现了系统功能。
目次/Contents
[*] 01 系统概述
[*] 02 数据库设计
[*] 03 系统环境搭建
[*] 04 用户登录模块
[*] 05 图书管理模块
[*] 06 访问权限控制
15.1 系统概述
了解系统概述,可以大概说出云借阅系统的功能结构、系统的结构层次、文件组织结构和系统开辟运行环境。
15.1.1 系统功能介绍
云借阅系统功能模块介绍
本系统后台使用SSM框架编写,前台页面使用当前主流的Bootstrap和jQuery框架编写。(关于Bootstrap的知识,可参考黑马程序员编著的《响应式Web开辟项目教程》)。
云借阅图书管理系统主要实现了两大功能模块:用户登录模块和图书管理模块,用户登录模块主要用于实现用户的登录与注销;图书管理模块主要用于管理图书,如新书推荐、图书借阅等。
云借阅系统功能结构图
https://i-blog.csdnimg.cn/direct/81d698d4a32c4672afb541bcce733b05.png
15.1.2 系统架构设计
云借阅系统结构层次
根据功能的不同,云借阅图书管理系统项目结构可以分别为以下几个层次。
[*]长期对象层(长期层或长期化层):该层由多少长期化类(实体类)构成。
[*]数据访问层(DAO层):该层由多少DAO接口和MyBatis映射文件构成。DAO接口的名称统一以Mapper结尾,且MyBatis的映射文件名称要与接口的名称雷同。
[*]业务逻辑层(Service层):该层由多少Service接口和实现类构成。逻辑层主要用于实现系统的业务逻辑。
[*]Web表现层:该层主要包括Spring MVC中的Controller类和JSP页面。
云借阅系统各个层次的关系和作用
https://i-blog.csdnimg.cn/direct/00c04eef3d414590a31212031151344f.png
15.1.3 文件组织结构
云借阅系统项目文件组织结构
https://i-blog.csdnimg.cn/direct/87362b8d71bd4b62a92e865d1fd465e0.png
15.1.4 系统开辟及运行环境
云借阅系统的开辟环境
云借阅图书管理系统开辟环境如下。
[*]操作系统:Windows 7。
[*]Web服务器:Tomcat 8.5.24。
[*]Java开辟包:JDK 8。
[*]开辟工具:IntelliJ IDEA 2019.3.2。
[*]数据库:MySQL 5.7.17。
[*]欣赏器:Mozilla Firefox 84.0(64位)。
15.2 数据库设计
认识数据库数据,可以大概独立完成数据库设计。
云借阅系统所涉及的表
云借阅图书管理系统中主要包括用户登录和图书管理两大模块,用户登录模块会用到用户表,图书管理模块会用到图书信息表。除此之外,在图书管理模块中,每次图书借阅完成后,系统会记载图书借阅情况,因此,图书管理模块还须要一个借阅记载表。
用户表(user)的表结构
https://i-blog.csdnimg.cn/direct/7879e87f3ea54dcd9b00d513cfac39f4.png
图书信息表(book)的表结构(1)
https://i-blog.csdnimg.cn/direct/ab48bd244a06416da0ecd6d368b0dfb6.png
图书信息表(book)的表结构(2)
https://i-blog.csdnimg.cn/direct/48e44eb8b6ac471b86ba16266cd63b25.png
借阅记载表(record)的表结构
https://i-blog.csdnimg.cn/direct/a38a1a51ee0942f5baa5257926654902.png
15.3 系统环境搭建
15.3.1 须要引入的依靠
认识系统环境搭建,可以大概搭建开辟环境。
云借阅系统需引入三大框架的依靠
由于云借阅图书管理系统基于SSM框架和Maven开辟,因此须要在项目中引入这三大框架的依靠。此外,项目中还涉及到数据库连接、JSTL标签等,因此还要引入数据库连接、JSTL标签等其他依靠。整个系统所须要引入的依靠如下所示。
Spring、Spring MVC、MyBatis框架相关的依靠
[*]Spring框架相关的依靠:spring-context(Spring上下文);spring-tx(Spring事务管理);spring-jdbc(Spring JDBC)。
[*]Spring MVC框架相关的依靠:spring-webmvc(Spring MVC核心)。
[*]MyBatis框架相关的依靠:mybatis(MyBatis核心)。
分页插件、MyBatis与Spring整合、数据库、ServletAPI相关的依靠
[*]分页插件相关的依靠:pagehelper(分页插件)。
[*]MyBatis与Spring整合的依靠:mybatis-spring(MyBatis与Spring整合)。
[*]数据库驱动依靠:mysql-connector-java(mysql的数据库驱动)。
[*]数据源相关依靠:druid(阿里提供的数据库连接池)。
[*]ServletAPI相关的依靠:jsp-api(jsp页面使用request等对象)servlet-api
[*](java文件使用request等对象)。
JSTL标签库、 Jackson相关的依靠
[*]JSTL标签库相关依靠:jstl(jsp标准标签库);taglibs(taglibs指令);
[*]Jackson相关依靠:jackson-core(jackson核心);jackson-databind(jackson数据转换);jackson-annotations(jackson核心注解)。
15.3.2 准备数据库资源
通过SQL命令导入sql文件
通过MySQL 5.7 Command Line Client登录数据库后,创建一个名称为cloudlibrary的数据库。通过SQL命令将书的资源中提供的cloudlibrary.sql文件导入到cloudlibrary数据库中,即可导入云借阅图书管理系统所使用的全部数据。
导入数据的SQL命令
创建数据库并导入数据的具体SQL命令如下。
(1)创建数据库
CREATE DATABASE cloudlibrary; (2)选择所创建的数据库
USE cloudlibrary; (3)导入数据库文件
这里假设该文件在F盘的根目次下,导入命令如下所示
source F:\cloudlibrary.sql; 除了使用命令导入数据库文件之外,还可以通过其他数据库管理工具导入数据库文件,如Navicat Premium和SQLyog等。
15.3.3 准备项目环境
创建项目,引入依靠
接下来,根据第14章14.2.1节中的思绪整合SSM框架,并在SSM整合之后引入已经提供好的页面资源,具体如下所示。
在IntelliJ IDEA中,创建一个名称为cloudlibrary的MavenWeb项目,将系统所须要的依靠配置到项目标pom.xml文件中。
编写配置文件和配置类
(1)在项目标src\main\resources目次下创建数据库连接信息的配置文件jdbc.properties,jdbc.properties配置文件配置的内容除了连接的数据库须要换成cloudlibrary,其他的都和第14章的14.1.3节一样,这里不再重复演示。
(2)本项目使用纯注解的方式整合SSM框架,使用配置类替换框架的相关配置文件。在项目标src\main\java目次下创建一个名称为com.itheima.config的类包,并在config类包下分别创建并配置以下6个配置类。
config类包下的配置类
[*]ServletContainersInitConfig.java:用于初始化Servlet容器的配置类。
[*]JdbcConfig.java:用于读取数据库连接信息的配置类。
[*]MyBatisConfig.java:MyBatis相关的配置类。
[*]SpringConfig.java:Spring相关的配置类。
[*]SpringMvcConfig.java:Spring MVC相关的配置类。
[*]EncodingFilter.java:编码拦截器。
引入页面资源
将项目运行所须要的CSS文件、图片、js和JSP文件按照项目文件组织结构引入到项目中。此中系统首页index.jsp实现了一个转发功能,在访问时会转发到登录页面,其实现代码如下所示。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 访问时自动转发到登录页面 -->
<jsp:forward page="/admin/login.jsp"/>页面结果展示
将项目发布到Tomcat服务器中,启动项目cloudlibrary,并在欣赏器中访问项目首页,访问地点为http://localhost:8080/cloudlibrary/index.jsp,访问结果如图所示。
https://i-blog.csdnimg.cn/direct/dc0948f1fd8a4bb0b3003c4e3b161099.png
15.4 用户登录模块
在系统中实现用户登录模块中的用户登录功能。
15.4.1 用户登录
用户登录流程图
https://i-blog.csdnimg.cn/direct/c3eb0993c66345f280c2b02c898260aa.png
从图中可以看出,用户登录过程中起首要验证用户名和密码是否正确,假如正确,可以乐成登录系统,系统会主动跳转到主页;假如错误,则在登录页面给出错误提示信息。
STEP 01 创建长期化类:
创建用户长期化类User,并在User类中定义用户相关属性以及相应的getter/setter方法。
public class User implements Serializable {
private Integer id; //用户id
private String name; //用户名称
private String password; //用户密码
private String email; //用户邮箱(用户账号)
private String role; //用户角色
private String status; //用户状态
...
getter/setter方法
}STEP 02 实现DAO:
创建一个用户接口UserMapper,并在接口中定义login()方法,login()方法通过用户账号和用户密码查询用户信息。
public interface UserMapper {
// 使用@Select注解定义SQL查询语句
// 从user表中选择所有字段,条件是user_email和user_password匹配,并且user_status不等于'1'
@Select("select * from user where user_email=#{email} AND user_password=#{password} AND user_status!='1'")
// 使用@Results注解定义查询结果与Java对象属性的映射关系
@Results(id = "userMap", value = {
// 使用@Result注解定义具体的映射关系
// id属性设置为true,表示user_id是主键
// column属性指定数据库表中的字段名,property属性指定Java对象中的属性名
@Result(id = true, column = "user_id", property = "id"),
// 这里应该还有其他字段的映射关系,但图片中未显示
})
...
// 定义login方法,接受一个User类型的参数
User login(User user);
} STEP 03 实现Service:
(1)创建UserService接口,并在该接口中定义login()方法,login()方法通过用户账号和用户密码查询用户信息。
package com.itheima.service;
import com.itheima.domain.User;
/**
* 用户接口
*/
public interface UserService {
/**
* 通过User的用户账号和用户密码查询用户信息
*/
User login(User user);
} (2)创建UserService接口的实现类UserServiceImpl,在类中重写接口的login()方法。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
// 注入UserMapper对象
@Autowired
private UserMapper userMapper;
/**
* 通过User的用户账号和用户密码查询用户信息
*/
@Override
public User login(User user) {
return userMapper.login(user);
}
}STEP 04 实现Controller:
创建用户控制器类UserController,类中定义用户登录的方法login()。
import javax.servlet.http.HttpServletRequest;
@RequestMapping("/login")
public String login(User user, HttpServletRequest request) {
User u = userService.login(user);
if (u != null) {
request.getSession().setAttribute("USER_SESSION", u);
return "redirect:/admin/main.jsp";
} else {
request.setAttribute("msg", "用户名或密码错误");
return "forward:/admin/login.jsp";
}
// ...其他代码此处省略
}STEP 05 实现登录页面功能:
在15.3.3节中引入页面资源时,已经把登录页面login.jsp导入到项目中了,登录页面主要包含一个登录表单。
<form id="loginform" class="sui-form" action="${pageContext.request.contextPath}/login" method="post">
<div class="input-prepend">
<span class="add-on loginname">用户名</span>
<input type="text" placeholder="企业邮箱" class="span2 input-xfat" name="email">
</div>
<div class="input-prepend">
<span class="add-on loginpwd">密码</span>
<input type="password" placeholder="请输入密码" class="span2 input-xfat" name="password">
</div>
<!-- 其他代码此处省略 -->
</form> STEP 06 启动项目,登录测试:
在实行登录操作之前,先检察一下数据库中user表中的数据。
https://i-blog.csdnimg.cn/direct/3a3daeee44554864b930ee7a36e5b46e.png
将项目部署到Tomcat服务器并启动项目,访问登录页面,在登录页面中分别输入账号itheima@itcast.cn和密码123456,单击“登录”按钮登录系统,登录乐成后系统后台首页如图所示。
https://i-blog.csdnimg.cn/direct/843714ee68b441df811a155cbfa470b4.png
15.4.2 实现登录验证
在系统中实现用户登录模块中的登录验证功能。
其他系统访问系统首页的情况
虽然现在已经实现了用户登录功能,但此功能还并不完善。假设控制器类中也存在其他访问系统首页的方法,那么用户完全可以绕过登录步调,而直接通过访问该方法进入系统后台首页。为了验证上述假设,在UserController控制器类中新增一个方法toMainPage(),用于跳转到系统后台首页,其代码如右图所示。
// 跳转到系统后台首页的方法
@RequestMapping("/toMainPage")
public String toMainPage() {
return "main"; // 返回视图名称,通常对应于一个JSP页面或Thymeleaf模板
} 如上代码中toMainPage()方法只用于页面跳转。toMainPage()方法会处理URL为toMainPage的请求,并跳转到名称为main的页面。
直接访问系统后台首页时的页面跳转
当其他系统访问系统首页时,此时,不进行用户登录,直接在欣赏器访问跳转到系统后台首
页的地点http://localhost:8080/cloudlibrary/toMainPage,页面跳转如下图所示。
https://i-blog.csdnimg.cn/direct/9e13a2ef6a634458af497d41ed27a69c.png
从上图能看出来,未登录也能直接访问到系统后台首页。显然,让未登录的用户直接访问到系统的后台页面,将是非常不安全的。
办理直接访问后台首页的方法
未登录用户也能直接访问到系统后台首页,这对系统来说是不安全的。为了制止此种情况的发生,提拔系统的安全性,可以创建一个拦截器来拦截全部请求。当用户处于登录状态时,直接放行该用户的请求;假如用户没有登录,但是访问的是登录相关的请求,也放行;否则将请求转发到登录页面,并提示用户登录。
拦截器的实行流程图
https://i-blog.csdnimg.cn/direct/9f006a7bd03e41b9bfabc57411f5a849.png
用户登录验证的具体实现如下。
STEP 01 创建登录拦截器类:
创建登录拦截器类ResourcesInterceptor,用于对用户访问进行拦截控制。
// ...其他代码此处省略
User user = (User) request.getSession().getAttribute("USER_SESSION");
String uri = request.getRequestURI(); // 获取请求的路径
// 如果用户是已登录状态,放行
if (user != null) {
return true;
}
// 用户登录的相关请求,放行
if (uri.indexOf("login") >= 0) {
return true;
}
// 其他情况都直接跳转到登录页面
request.setAttribute("msg", "您还没有登录,请先登录!");
request.getRequestDispatcher("/admin/login.jsp").forward(request, response);
return false;
// ...其他代码此处省略
STEP 02 配置拦截器:
在SpringMvcConfig配置类中重写addInterceptors()方法,将自定义的资源拦截器添加到拦截器注册类中,重写的addInterceptors()方法具体代码如下所示。
// 在拦截器注册类中添加自定义拦截器。addPathPatterns()方法设置拦截的路径;excludePathPatterns()方法设置不拦截的路径
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new ResourcesInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/css/**", "/js/**", "/img/**");
} STEP 03 检察运行结果:
启动cloudlibrary项目,不进行用户登录,直接访问跳转到系统后台页面的地
址http://localhost:8080/cloudlibrary/toMainPage,页面跳转如图所示。
https://i-blog.csdnimg.cn/direct/a3bc693a6e9d4b53b002e94552750eda.png
从图中可以看出,未登录的用户直接实行访问控制器方法后,并没有乐成跳转到系统后台首页,而是转发到了系统登录页面,同时在登录页面中也给出了用户未登录的提示信息。这表明用户登录验证功能已乐成实现。
15.4.3 注销登录
在系统中实现用户登录模块中的注销登录功能。
接下来,实现用户登录模块的注销登录功能,具体实现如下。
STEP 01 main.jsp 文件中,“注销”超链接的代码如下:
<ul class="nav navbar-nav">
<li class="dropdown user user-menu">
<a>
<img src="${pageContext.request.contextPath}/img/user.jpg" class="user-image" alt="User Image">
<span class="hidden-xs">${USER_SESSION.name}</span>
</a>
</li>
<li class="dropdown user user-menu">
<a href="${pageContext.request.contextPath}/logout">
<span class="hidden-xs">注销</span>
</a>
</li>
</ul> STEP 02
在UserController控制器类中新增一个注销登录的方法logout(),该方法中,起首扫除Session中的用户信息,然后跳转到登录页面。logout()方法的具体代码如下所示。
@RequestMapping("/logout")
public String logout(HttpServletRequest request) {
try {
HttpSession session = request.getSession();
session.invalidate(); // 销毁Session
return "forward:/admin/login.jsp";
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("msg", "系统错误");
return "forward:/admin/login.jsp";
}
} STEP 03
至此,注销登录的功能就实现了。重启项目并登录系统后,单击系统后台页面中的“注销”链接,跳转到的页面如图所示。
https://i-blog.csdnimg.cn/direct/16015eb2e730470eb19c5e441c6f07a8.png
从图中可以看出,用户黑马程序员的登录状态已经被注销,并跳转到了登录页面。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]