基于Spring Boot的jpetstore项目分析_by_一把健

将原本MVC架构的jpetstore用Spring Boot重构。

《基于Spring Boot的jpetstore项目分析_by_一把健》

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 初始化工具

《基于Spring Boot的jpetstore项目分析_by_一把健》

注意其中的一行灰色注释:Make sure your net workconnection is active before continuing.

因为Spring Boot使用了版本控制工具maven,故你接下来勾选的工具或者框架在确定生成项目之后会从网上download到本地和项目对接,IntelliJ的Spring初始化工具十分智能化。

2.输入项目名称,组织信息和项目描述等

《基于Spring Boot的jpetstore项目分析_by_一把健》

 

3.选择集成的工具或者框架

《基于Spring Boot的jpetstore项目分析_by_一把健》

注意此处选择:

web : web 表明这是一个web项目

TemplateEngines: Thymeleaf 模板引擎使用Thymeleaf,即前端使用Thymeleaf渲染

SQL: MySQL , JDBC, MyBatis 数据库使用MySQL,连接方式为JDBC,ORM框架为MyBatis

《基于Spring Boot的jpetstore项目分析_by_一把健》

 

二、项目构建和分析

与传统MVC架构不同,下面是SpringBoot架构的jpetstore目录结构,其中有些重要的属性配置文件。

《基于Spring Boot的jpetstore项目分析_by_一把健》

 

(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文件夹从上到下分析项目结构,即从后端到前端。

《基于Spring Boot的jpetstore项目分析_by_一把健》

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。

《基于Spring Boot的jpetstore项目分析_by_一把健》

 

下面将介绍controller的组成和写法,例子为CatalogController。

《基于Spring Boot的jpetstore项目分析_by_一把健》

需要特别注意黄色的注解部分。

首先创造一个类,并声明该对象为控制器。即在类前加上注解:@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实现包。

《基于Spring Boot的jpetstore项目分析_by_一把健》

原因为该项目ORM框架不再是传统的JDBC,这里使用了MyBatis。还记得application.properties配置文件中关于数据库的内容,那些内容相当于指明了JDBC连接数据库的DBUtil的内容。

并且MyBatis有面向接口编程的特性。即直接使用接口,对应映射xml文件,实现对数据库数据的增删改查。

 

jpetstore-SpringBoot-MyBatis_by_一把健

 

(2.3)service包采用面向接口编程的方法,存放了三个业务模块的service层文件。接口文件也直接定义了该项目的业务功能,即软件架构。

《基于Spring Boot的jpetstore项目分析_by_一把健》

 

下面看AccountServiceImpl类:

《基于Spring Boot的jpetstore项目分析_by_一把健》

在类上添加注解 @Service指明这个类为service层,service层调用persistence层,故类中有个自动注入的AccountMapper类,可是该声明对象报错,但其实并不用理会。还记得persistence层只有接口没有实现,故在自动注入的过程中编译器发现没有实现类故报错,但是本项目使用了MyBatis框架,会将persistence层的各接口与xml映射文件相对应,实现对数据库的操作。

 

(3)接下来是resources文件夹,该文件夹下存放了应用配置文件,国际化配置,前端文件,MyBatis映射文件等。

    《基于Spring Boot的jpetstore项目分析_by_一把健》

 

(3.1)mapper文件夹下,存放的是MyBatis映射xml文件

《基于Spring Boot的jpetstore项目分析_by_一把健》

可以注意到它和java/persistence包下的文件是一一对应的关系,这是使用了Mybatis的缘故。有关于Mybatis的介绍:

 

jpetstore-SpringBoot-MyBatis_by_一把健

 

(3.2)static文件夹下存放css,js,images等脚本和图片

《基于Spring Boot的jpetstore项目分析_by_一把健》

 

(3.3)templates文件夹下存放html文件

《基于Spring Boot的jpetstore项目分析_by_一把健》

前端代码由于使用了html,所以很多Jsp指令之类的无法使用,但是我们使用了Thymeleaf进行前端渲染,有关于Thymeleaf的介绍:

 

jpetstore-SpringBoot-Thymeleaf_by_一把健

 

以上,是对基于Spring Boot的jpetstore的项目架构的粗略描述和相关注意事项。

接下来将对附加功能加以介绍。

 

 

 

    原文作者:Spring Boot
    原文地址: https://blog.csdn.net/qq_39446719/article/details/80877063
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞