前言
本笔记是个人学习Spring boot2的笔记,粗略介绍Spring boot2 的项目搭建及简要开发过程。根据本笔记练习项目搭建,需要读者有一定的JAVA基础,了解MVC模式,熟悉Servlet/JSP或者相关开发经验会更好,Spring boot2集成了Spring MVC本文将使用Spring MVC模式来进行搭建演示,数据层将分别使用JPA和Mybatis进行演示。构建工具使用Maven,数据库使用postgresql
入门基础知识
1.MVC模式
MVC模式是Model、View、Controller 的简称,是JAVA设计模式之一的三层架构模式,按照访问逻辑来排列理解就是用户(USER)通过网页(View层)点击或操作发起访问请求,请求通过POST或GET方式提交被控制转发器(Controller层)拦截到,并根据配置匹配到具体的Controller中的具体方法中,Controller的方法调用数据业务层(Model层)的方法来访问数据库获取到数据然后返回给页面展示给用户。流程如下图
具体MVC模式扩展阅读https://blog.csdn.net/liitdar/article/details/86685880
Spring MVC扩展阅读https://www.cnblogs.com/baiduligang/p/4247164.html
2.MAVEN简介
Maven是用来简化项目构建的工具,Maven的核心是pom.xml,用XML方式描述了项目模型,是项目的主要配置文件,pom文件内通常有以下元素。
- groupId:表示项目所属的组,通常是公司或者组织的名称,如:org.springframework。
- artifactId:项目的唯一标识,比如,spring-boot-starter-web
- packaging:项目的类型,常用的有jar和war两种,jar表示项目会打包成一个jar包,这是Spring Boot的默认使用方式。
- version:项目的版本号,比如0.0.1-SNAPSHOT
- modelVersion:代表pom文件的Maven的版本,比如本文使用的是4.0.0
- dependency:包含在dependencies中,用来声明项目的依赖,比如项目用的SQL驱动,JPA等等,其下有参数scope:scope代表此类库与项目的关系,默认值是compile,也就是编译和打包都需要此类库。值为test表示仅仅在单元测试的时候需要;值为provided表示在编译阶段需要此类库,但打包阶段不需要,这是因为项目的目标幻境已经提供了;值为runtime表示在编译和打包的时候都不需要,但在运行时需要。
MAVEN扩展阅读https://www.cnblogs.com/whgk/p/7112560.html
Eclipse配置maven环境扩展阅读https://www.cnblogs.com/guohu/p/10699637.html
项目搭建
- 先搭建好开发环境,参考https://blog.csdn.net/huangtao116/article/details/90546594
- 开始搭建项目,打开Eclipse 新建MAVEN项目流程如下图右键New=>>Other=>> 选中Maven Project,点击Next,再点击Next,然后默认选择是quickstart 1.1,点击Next然后按图输入Group Id为com.main.apartment、Artifact Id为amms,然后点击Finish,maven项目就建好了。
完成后的项目结构如下:
src/main/java 所有的JAVA代码都在此包下
src/test/java 所有的测试代码都在此包下
Maven dependencies MAVEN管理的JAR,都从仓库自动下载
下面我们先在com.apartment.amms包下新建如下几个包:
conf---包含了配置类
entity---包含业务实体类
respository---包含JPA仓库实现接口,可以理解为以前的DAO包只是名字不同,里面包含数据库操作方法接口,比如select,update等
service---包含业务逻辑代码
controller---包含MVC的Controller
quickstart 是Maven的快速构建模板,使用这种方式创建的Maven项目没有resource文件夹,所以我们需要在src/main/下创建resource文件夹(此文件夹为源文件夹创建方式参考https://blog.csdn.net/baichi1616/article/details/90574490),然后在resource包下在创建config、static 2个文件夹(普通文件夹)
完成后的项目结构如下图
下一步添加spring boot支持,在pom.xml下假如如下代码
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<dependencies>
<!-- 配置spring boot支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
在com.apartment.amms包下新建一个类Application(类名可以自取),代码如下:
package com.apartment.amms;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
//启用Spring Boot应用
SpringApplication.run(Application.class, args);
}
}
在com.apartment.amms.controller包下新建一个controller类,类名TestController,代码如下:
package com.apartment.amms.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {
/**
* 拦截浏览器请求处理后跳转到指定页面
* @return
*/
@RequestMapping("/")
public String index() {
return "index.html";
}
}
下一步在/src/main/resources/static 文件夹下新建一个index.html,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1 align="center" id=app>这是演示页面</h1>
</body>
</html>
刷新项目
然后我们刷新项目,选择项目右键Maven=>> Update Project,选中项目右键 Run As=>>Maven clean, 再执行 Maven install ,Maven就会自动从仓库把Spring boot依赖的jar包下载下来,以后在pom文件添加其他依赖需执行同样的操作,如添加数据库支持。
在/src/main/resources/config 文件夹下新建application.properties,指定服务器端口为8433,文件内容如下:
server.port=8443
下面我们选中新建的Application类右键Run As=>>Aava Application 运行项目
启动完成我们访问http://localhost:8443/ ,就可以看到如下界面了,就说明Spring boot 我们已经配置成功。
做到这里,我们从controller层到View层就联通了,接下来我们来配置完成Model层
配置数据库
修改config包下application.properties文件
内容如下:
server.port=8443
# jdbc_config datasource
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/amsdb?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull
spring.datasource.username=ams_admin
spring.datasource.password=123456
# Hikari will use the above plus the following to setup connection pooling
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
# max for pool number
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1
spring.jpa.show-sql = true
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false
port是spring boot的访问端口 8443
datasource是数据库驱动及hikari连接池配置,本例子使用的hikari连接池
最下面3行代码为JPA配置
// 这是指定数据库驱动,如果你使用其他数据库换成相应的驱动就行
spring.datasource.driver-class-name=org.postgresql.Driver
//url 是指定本机的数据库名字和连接属性,这里5432后面的amsdb就是你自己的数据库名字,username是连接数据库的用户名,password是密码
spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/amsdb?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull
spring.datasource.username=ams_admin
spring.datasource.password=123456
接下来我们修改pom文件,修改后的内容如下:
<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>com.apartment</groupId>
<artifactId>amms</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>amms</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<dependencies>
<!-- 配置spring boot支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- 配置postgresql支持 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<!-- 序列化与反序列化 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<!-- 配置jpa支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 配置HikariCP连接池 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
刷新项目,下载jar包
下面先贴出数据库的建表SQL,去postgresql创建好自己的数据库和表,数据库名字需要配置到application.properties里面的spring.datasource.url里
CREATE TABLE "public"."user" (
"id" int2 NOT NULL,
"name" VARCHAR ( 20 ) COLLATE "pg_catalog"."default" NOT NULL,
"describe" VARCHAR ( 255 ) COLLATE "pg_catalog"."default",
"password" VARCHAR ( 12 ) COLLATE "pg_catalog"."default" NOT NULL,
CONSTRAINT "user_pkey" PRIMARY KEY ( "id" )
);
ALTER TABLE "public"."user" OWNER TO "ams_admin";
COMMENT ON COLUMN "public"."user"."name" IS '用户名';
COMMENT ON COLUMN "public"."user"."describe" IS '描述';
COMMENT ON COLUMN "public"."user"."password" IS '密码';
COMMENT ON TABLE "public"."user" IS '用户表';
CREATE SEQUENCE "public"."user_id_seq" INCREMENT 1 MAXVALUE 9223372036854775807 CACHE 1;
ALTER SEQUENCE "public"."user_id_seq" OWNER TO "postgres";
编写Model层代码
1.编写实体类,在entity包下新建entity类,User.java,代码如下:
package com.apartment.amms.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Table(name = "user", schema = "public")
public class User {
@Id
@GeneratedValue(generator = "id", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "id", sequenceName = "user_id_seq", allocationSize = 1)
private Integer id;
@Column(nullable = false)
private String name;
@Column(nullable = true)
private String describe;
@Column(nullable = false)
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescribe() {
return describe;
}
public void setDescribe(String describe) {
this.describe = describe;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
注解@Entity 表示这是一个和数据表对应的实体类,相当于XML配置中添加<bean></bean>属性,是Spring自动映射完成的。
注解@Table(name = "user", schema = "public") 表示这个类对应的数据数据库表是哪个,参数name是表的名称
注解@Id 表示这是实体类主键
注解@GeneratedValue(generator = "id", strategy = GenerationType.SEQUENCE) 指定主键的值是引用的数据库序列
注解@SequenceGenerator(name = "id", sequenceName = "user_id_seq", allocationSize = 1) 指定数据库序列的名字(sequenceName )和每次增长值(allocationSize )
注解@Column(nullable = false) 表示对应数据库的字段名,如果数据库字段名不同可以通过参数 name="XXX"来指定对应的字段名,比如实体类属性name对应的数据库字段名是n_name,那么可以在注解里加上 name=“n_name”就行了
2.编写Repository接口,在repository包下新建接口UserRep,继承接口JpaRepository,JPA 默认预先生成了一些基本的CURD的方法,例如:增、删、改等等,代码如下:
package com.apartment.amms.respository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.apartment.amms.entity.User;
public interface UserRep extends JpaRepository<User, Integer> {
void deleteById(Integer id);
void delete(User user);
User findByName(String name);
}
JPA参考资料:https://blog.csdn.net/fly910905/article/details/78557110
3.编写service,在service包下新建接口IUserService及其实现类UserServiceImpl
IUserService代码如下:
package com.apartment.amms.service;
import java.util.List;
import com.apartment.amms.entity.User;
public interface IUserService {
void add(User user);
void edit(User user);
void delete(User user);
User findbyId(Integer id);
User findByName(String name);
List<User> findAll();
}
UserServiceImpl代码如下:
package com.apartment.amms.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.apartment.amms.entity.User;
import com.apartment.amms.respository.UserRep;
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private UserRep userRep;
@Override
public void add(User user) {
userRep.save(user);
}
@Override
public void edit(User user) {
userRep.save(user);
}
@Override
public void delete(User user) {
userRep.delete(user);
}
@Override
public User findbyId(Integer id) {
// TODO Auto-generated method stub
return userRep.getOne(id);
}
@Override
public User findByName(String name) {
// TODO Auto-generated method stub
return userRep.findByName(name);
}
@Override
public List<User> findAll() {
// TODO Auto-generated method stub
return userRep.findAll();
}
}
注解@Service 表示这个类是业务层组件
注解@Autowired 表示UserRep接口会自动注入,不需要在生成get和set方法了
4.在Controller包下新建UserController类,代码如下:
package com.apartment.amms.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import com.apartment.amms.service.IUserService;
@RestController
public class UserController {
@Autowired
private IUserService iUserService;
@RequestMapping("/")
public ModelAndView logintest() {
return new ModelAndView("index.html");
}
}
这个Controller使用的注解是@RestController,这个注解相当于@ResponseBody + @Controller合在一起的作用,返回json数据,所以这里要需要使用到ModelAndView来跳转页面,这里我们需要把之前新建的TestController里面的index方法注解修改为@RequestMapping("/index"),不然会出现2个Controller映射同一地址会报错。
关于这里使用@RestController,是指使用RESTFul架构风格,用于并非一个单一的Web应用,我们这里后面VUE整合需要用到Rest调用,所以是用了这个注解,对于单一的Web应用使用@Controller也可以。
到这里数据库配置以及Model层代码就完成了,但是由于HTML是静态文件无法传值,所以我们要把获取到的数据与页面交互就需要用到视图模板了
视图模板技术
1.我们首先使用Spring boot推荐的视图模板thymeleaf
1.资源文件的约定目录结构
Maven的资源文件目录:/src/main/resources
spring-boot项目配置文件目录:/src/main/resources/config
spring-boot项目静态文件目录:/src/main/resources/static
spring-boot项目模板文件目录:/src/main/resources/templates
由于我们项目没有templates文件夹,所以在/src/main/resources/文件夹下新建一个templates文件夹,里面新建index.html,代码如下:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" >
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3 align="center" th:text="${userModel.user.name}">Welcome to springboot</h3>
</body>
</html>
代码说明
<html xmlns:th="http://www.thymeleaf.org" > 里xmlns:th是引入thymeleaf模板支持
<h3 align="center" th:text="${userModel.user.name}">Welcome to springboot</h3> 里th:text是thymeleaf模板标签用法,这里如果${userModel.user.name}获取的值为null,那么页面会显示标签内容Welcome to springboot,如果name值为“李优秀”,那么页面会显示李优秀
在application.properties添加配置,代码如下:
#thymelea模板配置
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
#可不选择
spring.thymeleaf.encoding=UTF-8
#热部署文件,页面不产生缓存,及时更新
spring.thymeleaf.cache=false
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
配置说明
spring-boot静态首页的支持,即index.html放在以下目录结构会直接映射到应用的根目录下:
classpath:/META-INF/resources/index.html
classpath:/resources/index.html
classpath:/static/index.html
calsspath:/public/index.html
但是由于我们要访问的动态页面index.html在templates目录,所以做如下配置
spring.thymeleaf.prefix=classpath:/templates/ 中的classpath: ,Spring boot默认匹配到/src/main/resources文件夹,这个配置是指定thymeleaf使用的动态HTML文件位置为/src/main/resources/templates/
spring.thymeleaf.suffix=.html ,suffix是指thymeleaf模板匹配的文件夹后缀名,这里是html
在pom.xml文件添加thymeleaf支持,需要放在<dependencies>标签内,添加完会自动下载依赖的jar包,如果没下载,就按上面刷新项目的步骤操作一次即可,代码如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
修改UserController的logintest方法,修改后代码如下
@RequestMapping("/")
public ModelAndView logintest(Model model) {
// User user = iUserService.findbyId(1);
User user = new User();
user.setName("李优秀");
model.addAttribute("user",user);
return new ModelAndView("index","userModel",model);
}
代码说明
我们新建一个user对象,给name赋值为“李优秀”,model通过addAttribute添加名称为user的属性,第一个参数为属性名,第二个为值, 值可以为对象也可以是字符串或数字,列表等
返回的ModelAndView 第一个参数index是将要访问的模板页面,spring boot 会根据application.properties里配置的suffix值来加上后缀名寻找文件,我们配置的是.html,所以这里实际跳转的是index.html页面
第二个参数userModel是页面需要调用的名称,第三个参数是要传到页面的userModel对应的值
以上代码也可以这样写,注意如果这样写,上面的index.html里${userModel.user.name}需要改成${userModel.name}否则会报错!
@RequestMapping("/")
public ModelAndView logintest(ModelAndView mv) {
// User user = iUserService.findbyId(1);
User user = new User();
user.setName("李优秀");
mv.setViewName("index");
mv.addObject("userModel",user);
return mv;
}
至此代码完成,启动项目
我们访问http://localhost:8443/ 会默认根据@RequestMapping("/") 访问UserController的logintest方法,这样显示的就是templates文件夹下的index.html文件,页面显示李优秀说明thymeleaf模板配置成功
thymeleaf 模板用法资料参考https://blog.csdn.net/qq_40741855/article/details/85142088
https://www.cnblogs.com/jiangchao226/p/5937458.html
ModelAndView资料参考https://blog.csdn.net/qq30211478/article/details/78016155
Model、View、ModelAndView资料参考https://www.cnblogs.com/guangshan/p/4438130.html
接下来,请看Spring boot2 快速入门开发笔记(二)