将原本MVC架构的jpetstore用Spring Boot重构。
github 地址:https://github.com/SwordHarry/mypetstoreSpringBoot
开发环境:IntelliJ IDEA
集成框架:Spring Boot
前端渲染工具:Thymeleaf
ORM框架:Mybatis
在此基本要求上实现的额外功能:
1.添加验证码功能:在用户注册和用户登录模块中添加验证码功能。
(博客: jpetstore-Spring Boot-验证码_by_一把健)
2.AJAX功能:至少在项目的用户注册模块(用户名是否已存在)和购物车模块(购物车结算)两个部分添加AJAX功能,提升用户体验。(博客: jpetstore-Spring Boot-AJAX_by_一把健)
3.国际化功能:使得JPetStore的账户管理模块支持中、英文两种语言,在账户登录、账户注册两个页面的顶部提供超链接或按钮进行语言的切换。
4.日志功能:数据库中添加日志信息表,给项目添加日志功能,用户登录后记录用户行为,比如浏览了哪些商品、将商品添加进购物车、生成订单等。(此处博主使用了spring boot自带的log4j日志工具,生成的是日志文件,并不是日志信息表)
一、准备工作
1.创建项目,选择SpringInitializr,Spring 初始化工具
注意其中的一行灰色注释:Make sure your net workconnection is active before continuing.
因为Spring Boot使用了版本控制工具maven,故你接下来勾选的工具或者框架在确定生成项目之后会从网上download到本地和项目对接,IntelliJ的Spring初始化工具十分智能化。
2.输入项目名称,组织信息和项目描述等
3.选择集成的工具或者框架
注意此处选择:
web : web 表明这是一个web项目
TemplateEngines: Thymeleaf 模板引擎使用Thymeleaf,即前端使用Thymeleaf渲染
SQL: MySQL , JDBC, MyBatis 数据库使用MySQL,连接方式为JDBC,ORM框架为MyBatis
二、项目构建和分析
与传统MVC架构不同,下面是SpringBoot架构的jpetstore目录结构,其中有些重要的属性配置文件。
(1)首先是位于项目根目录下的pom.xml文件,该文件是版本控制配置文件,需要导入工具或者框架则在该文件编写依赖,在确保网速正常的情况下,会从网上自动下载配置
在按上述步骤创建项目之后,pom.xml文件会自动生成并已经写好依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.csu</groupId>
<artifactId>mypetstorespring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mypetstorespring</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
如果后期想导入框架或者工具,则需要在其中写入依赖<dependency> </dependency>
(2)src文件夹下包含main和test文件夹,现我们关注main文件夹。该文件夹为项目代码存放位置。
main文件夹下包含java包和resources文件夹。下面将main文件夹从上到下分析项目结构,即从后端到前端。
java包下存放的是后端java代码,值得注意的是在项目包下有个名为xxxApplication(MypetstorespringApplication)的启动文件。神奇的是,这个启动文件是含Javamain函数的文件,在使用Spring Boot后,无需部署Tomcat,只需要运行启动函数,就可以在浏览器中打开项目,少了一些繁琐的步骤。
还有一个重要的配置文件application.properties存放在resources文件夹下,该文件里是对该项目的配置语句:
#datasource
spring.datasource.url=jdbc:mysql://localhost:3306/mypetstore?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#tomcat
server.port=8088
server.tomcat.uri-encoding=UTF-8
#MyBatis
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
# LOG4J配置
logging.path=${user.home}/log/myLog
logging.file=myLog.log
这些配置语句有数据库的配置和Tomcat的配置等。
domain包下存放领域对象,几乎没有改动。
(2.1)controller包相当于servlet,并且一个controller里面可以包含多个行为,即一个controller可以代表多个servlet。
下面将介绍controller的组成和写法,例子为CatalogController。
需要特别注意黄色的注解部分。
首先创造一个类,并声明该对象为控制器。即在类前加上注解:@Controller
在控制器内添加servlet行为,该控制器为商品展示控制器,故行为也和商品展示有关。
@Autowired为自动注入,即catalogService接口如果有实现类,则将其实现类实例化。
下面我们来看看某一具体方法viewCategory()// 跳往商品大类
//跳往商品大类
@GetMapping("/catalog/category")
public StringviewCategory(@RequestParam("categoryId") String categoryId, Model model){
if(categoryId != null){
Category category = catalogService.getCategory(categoryId);
List<Product> productList = catalogService.getProductListByCategory(categoryId);
model.addAttribute("category",category);
model.addAttribute("productList",productList);
}
logger.info("跳往商品大类,Id:"+categoryId);
return "catalog/category";
}
在方法前加上注解:@GetMapping(“url”) 或 @PostMapping(“url”) 即指请求该url是以GET或POST的形式请求的,相应地,前端就要以该指定方式请求该url。
在方法的参数列表中也有注释,即@RequestParam(“参数名1”) String 参数名2
该注释的意思为,从request中提取出前端为 参数名1 的参数值,放入到 参数名2 中。即这一写法相当于:
String categoryId = request.getParameter(“categoryId”);
model为Thymeleaf默认取值渲染的容器。
关于Thymeleaf
jpetstore-SpringBoot-Thymeleaf_by_一把健
经过一番处理后,可以注意到该方法返回了一个对应的url地址,即浏览器之后将跳转到该页面。该url地址与前端的文件夹目录结构相对应,即catalog文件夹下有个category.html文件。
(2.2)persistence包下面只存放了各接口,和传统MVC架构的persistence不同,包中只有接口,没有DBUtil文件和impl实现包。
原因为该项目ORM框架不再是传统的JDBC,这里使用了MyBatis。还记得application.properties配置文件中关于数据库的内容,那些内容相当于指明了JDBC连接数据库的DBUtil的内容。
并且MyBatis有面向接口编程的特性。即直接使用接口,对应映射xml文件,实现对数据库数据的增删改查。
jpetstore-SpringBoot-MyBatis_by_一把健
(2.3)service包采用面向接口编程的方法,存放了三个业务模块的service层文件。接口文件也直接定义了该项目的业务功能,即软件架构。
下面看AccountServiceImpl类:
在类上添加注解 @Service指明这个类为service层,service层调用persistence层,故类中有个自动注入的AccountMapper类,可是该声明对象报错,但其实并不用理会。还记得persistence层只有接口没有实现,故在自动注入的过程中编译器发现没有实现类故报错,但是本项目使用了MyBatis框架,会将persistence层的各接口与xml映射文件相对应,实现对数据库的操作。
(3)接下来是resources文件夹,该文件夹下存放了应用配置文件,国际化配置,前端文件,MyBatis映射文件等。
(3.1)mapper文件夹下,存放的是MyBatis映射xml文件
可以注意到它和java/persistence包下的文件是一一对应的关系,这是使用了Mybatis的缘故。有关于Mybatis的介绍:
jpetstore-SpringBoot-MyBatis_by_一把健
(3.2)static文件夹下存放css,js,images等脚本和图片
(3.3)templates文件夹下存放html文件
前端代码由于使用了html,所以很多Jsp指令之类的无法使用,但是我们使用了Thymeleaf进行前端渲染,有关于Thymeleaf的介绍:
jpetstore-SpringBoot-Thymeleaf_by_一把健
以上,是对基于Spring Boot的jpetstore的项目架构的粗略描述和相关注意事项。
接下来将对附加功能加以介绍。