Springboot基础

[学习参考源——纯洁的微笑Spring Boot系列文章](http://www.ityouknow.com/spring-boot.html) [程序员DD](https://blog.didispace.com/spring-boot-learning-2x/)

1 Spring Boot 2.x 入门

使用Spring Boot可以简化操作,通过很少的配置就可以快速搭建一套Web项目或者构建一个微服务。

1.1 IDEA构建Spring Boot项目

(1)File,New Project
(2)选择Spring Initializr,并填写相关数据
(3)选择依赖,完成
注意:因为这样创建完的项目没有任何数据访问和Web模块,所以程序加载完Spring后就会结束运行。

Spring Boot建议的目录结构

root package结构:com.example.myproject

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
com
+- example
+- myproject
+- Application.java
|
+- model
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- controller
| +- CustomerController.java
|

自动创建的结构如下

(1)Application.java 建议放到根目录下面,主要用于做一些框架配置
(2)model 目录主要用于实体与数据访问层(Repository)
(3)service 层主要是业务类代码
(4)controller 负责页面访问控制

1.2 引入Web模块

一、在pom.xml中添加支持Web的模块

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
pom.xml中两个默认模块的说明

(1)spring-boot-starter:核心模块,包括自动配置支持、日志和YAML,如果引入了 spring-boot-starter-web,web模块可以去掉此配置,因为 spring-boot-starter-web自动依赖了 spring-boot-starter
(2)spring-boot-starter-test:测试模块,包括 JUnit、Hamcrest、Mockito

二、编写Controller

按照建议的目录结构创建directory并新建类文件

1
2
3
4
5
6
7
@RestController
public class HelloWorldController {
@RequestMapping("/hello")
public String index() {
return "Hello World";
}
}

说明:@RestController意思就是Controller 里面的方法都以 json 格式输出,不用再写什么 jackjson 配置的了

三、访问http://localhost:8080/hello

1.3 如何做单元测试

修改src/test/下测试入口

编写简单的HTTP请求来测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.example.springboottest;

import com.example.springboottest.controller.HelloWorldController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootTestApplicationTests {

private MockMvc mvc;

@Before
public void setUp() throws Exception {
mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();
}

@Test
public void getHello() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().string(equalTo("Hello World")));
}
}

在实验时,报错有org.junit.runners.model.InvalidTestClassError: Invalid test class 'com.example.springboottest.SpringbootTestApplicationTests':如图

最后发现import org.junit.jupiter.api.Test;应该换成import org.junit.Test;

2 配置文件

src/main/resources/application.properties是默认配置文件。这里可以定义容器端口名、数据库链接信息、日志级别等各种配置信息。

3 Web综合开发

3.1 Web开发

参考

Spring Boot做json接口配置

类添加@RestController即可,类中的方法都会以json格式返回
如果需要使用页面开发只要使用@Controller注解即可

自定义Filter

filter可以用于录调用日志、排除有 XSS 威胁的字符、执行权限验证等等

定义步骤如下:
(1)实现Filter接口,实现Filter方法
(2)添加Configuration注释,将自定义Filter加入过滤链

自定义Property

(1)在src/main/resources/application.properties中添加配置
(2)自定义配置类(通过@Component注解使用)

3.2 Thymeleaf模板

Thymeleaf是一款用于渲染XML/XHTML/HTML5内容的模板引擎。

优点

(1)Thymeleaf能直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用
(2)Thymeleaf的模板语法并不会破坏文档的结构,模板依旧是有效的XML文档
(3)模板还可以用作工作原型,Thymeleaf会在运行期替换掉静态值

缺点

Thymeleaf使用了XML DOM解析器,因此它不适合处理大规模XML文件。

3.3 Gradle构建工具

Spring项目建议使用Maven/Gradle进行构建项目

特点

(1)Gradle更简洁
(2)Gradle更适合大型复杂项目的构建
Gradle吸收了Maven和Ant的特点,不过Maven仍是主流。

3.4 WebJars

可以通过jar包的方式使用使用前端的(JavaScript,Css)各种框架、组件。

4 使用Thymeleaf开发Web页面

4.1 静态资源访问示例

src/main/resources/目录下新建static目录,放入图片,启动程序后,访问http://localhost:8080/1.jpg即可

4.2 thymeleaf实践

(1)在pom.xml中添加依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

但是报红,提示找不到依赖,加上版本号即可,例如

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.3.12.RELEASE</version>
</dependency>

如果加上版本号还是不行,可能是没换源,这个参考Maven换源然后重试以下即可

(2)新建传统Controller用于处理根路径请求,将解决渲染到index页面上

1
2
3
4
5
6
7
8
@Controller
public class HelloController {
@GetMapping("/")
public String index(ModelMap map) {
map.addAttribute("host", "https://www.baidu.com/");
return "index";
}
}

(3)去模板路径src/main/resources/templates下新建模板文件index.html

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1 th:text="${host}">Hello World</h1>
</body>
</html>

结果如下

4.3 参数配置模板

参考https://blog.didispace.com/spring-boot-learning-21-4-1/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Enable template caching. 如果不想每次修改页面都重启,则设为false
spring.thymeleaf.cache=true
# Check that the templates location exists.
spring.thymeleaf.check-template-location=true
# Content-Type value.
spring.thymeleaf.content-type=text/html
# Enable MVC Thymeleaf view resolution.
spring.thymeleaf.enabled=true
# Template encoding.
spring.thymeleaf.encoding=UTF-8
# Comma-separated list of view names that should be excluded from resolution.
spring.thymeleaf.excluded-view-names=
# Template mode to be applied to templates. See also StandardTemplateModeHandlers.
spring.thymeleaf.mode=HTML5
# Prefix that gets prepended to view names when building a URL. 不想使用template目录存放模板文件,则设为想放模板文件的目录
spring.thymeleaf.prefix=classpath:/templates/
# Suffix that gets appended to view names when building a URL. 不想使用index作为模板文件的扩展名
spring.thymeleaf.suffix=.html spring.thymeleaf.template-resolver-order= # Order of the template resolver in the chain. spring.thymeleaf.view-names= # Comma-separated list of view names that can be resolved.

5 ECharts绘制图表

ECharts是百度开源的一个使用 JavaScript 实现的开源可视化库。

(1)首先要有一个Spring Boot项目
(2)在pom.xml中引入Web模块和thymeleaf模块
(3)编写Controller,将/路径的请求映射到index.html页面

1
2
3
4
5
6
7
@Controller
public class HelloController {
@GetMapping("/")
public String index(ModelMap map) {
return "index";
}
}

(4)在resources/templates下创建index.html页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title>Spring Boot中使用ECharts</title>
<script src="https://cdn.bootcss.com/echarts/4.6.0/echarts.min.js"></script>
</head>
<body>
<div id="main" style="width: 1000px;height:400px;"></div>
</body>

<script type="text/javascript">
// 初始化ECharts组件到id为main的元素上
let myChart = echarts.init(document.getElementById('main'));
// 定义图标的配置项
let option = {
title: {
text: 'Spring Boot中使用ECharts'
},
tooltip: {},
// x轴配置
xAxis: {
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
// y轴配置
yAxis: {},
series: [{
// 数据集(也可以从后端的Controller中传入)
data: [820, 932, 901, 934, 1290, 1330, 1320],
// 图表类型,这里使用line,为折线图
type: 'line'
}]
};
myChart.setOption(option);
</script>
</html>

(5)启动应用,即可访问

ECharts在线调试工具

6 MyBatis-Plus

MyBatis的增强工具。官方站点

快速开始

首先要准备数据(对应的数据库文件)
(1)添加依赖
(2)在配置文件application中添加H2数据库相关配置
(3)在Spring Boot启动类中添加@MapperScan注解,扫描Mapper文件夹
(4)编写实体类User.java和Mapper类UserMapper.java
(5)开始使用

7 Spring Security

提供身份验证和访问控制,示例如下

7.1 创建Web应用

(1)创建Spring Boot项目并添加Web和Thymeleaf依赖
(2)在src/main/resources/templates下创建home.html

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org" xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Spring Security Example</title>
</head>
<body>
<h1>Welcome!</h1>

<p>Click <a th:href="@{/hello}">here</a> to see a greeting.</p>
</body>
</html>

(3)同理创建hello.html

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Hello World!</title>
</head>
<body>
<h1>Hello world!</h1>
</body>
</html>

(4)在主类同目录创建MvcConfig.java用于设置视图

7.2 设置Spring Security

参考
Spring Security会自动使用基本身份验证保护所有HTTP端点

(1)使用Maven的话,需要在pom.xml中添加Spring Security依赖

1
2
3
4
5
6
7
8
9
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>

(2)在主类同目录创建安全配置类WebSecurityConfig.java

@EnableWebSecurity注解为启用 Spring Security 的 Web 安全支持并提供 Spring MVC 集成。
这里的配置configure方法定义了哪些路径需要被保护,比如这里根路径和home路径不需要身份验证,其他都需要。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.example.springboottest;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}

@Bean
@Override
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();

return new InMemoryUserDetailsManager(user);
}
}

(3)创建login.html视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Spring Security Example </title>
</head>
<body>
<div th:if="${param.error}">
Invalid username and password.
</div>
<div th:if="${param.logout}">
You have been logged out.
</div>
<form th:action="@{/login}" method="post">
<div><label> User Name : <input type="text" name="username"/> </label></div>
<div><label> Password: <input type="password" name="password"/> </label></div>
<div><input type="submit" value="Sign In"/></div>
</form>
</body>
</html>

(4)为访问者提供显示当前用户名和注销的方式,需要更新hello.html以向当前用户问好并包含一个登出表单

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Hello World!</title>
</head>
<body>
<h1 th:inline="text">Hello [[${#httpServletRequest.remoteUser}]]!</h1>
<form th:action="@{/logout}" method="post">
<input type="submit" value="Sign Out"/>
</form>
</body>
</html>

(5)运行

效果如下


8 Spring Session

https://docs.spring.io/spring-session/reference/guides/boot-redis.html
http://www.bjpowernode.com/tutorial_spring_session/

用于管理用户的Session信息。

9 Sigar

参考https://www.cnblogs.com/shoose/p/10443546.html

10 oshi

https://www.cnblogs.com/gaomanito/p/13386591.html
https://blogs.qianlongyun.cn/archives/1300.html/

Layui主页

https://gitee.com/sentsin/layui?_from=gitee_search



----------- 本文结束 -----------




0%