Spring boot2 快速入门开发笔记(一)Spring boot2+thymeleaf整合

4 篇文章 0 订阅
2 篇文章 0 订阅

前言

        本笔记是个人学习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

项目搭建

  1. 先搭建好开发环境,参考https://blog.csdn.net/huangtao116/article/details/90546594
  2. 开始搭建项目,打开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 快速入门开发笔记(二)

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值