惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园_首页
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
ThreatConnect
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 聂微东
H
Help Net Security
T
Threat Research - Cisco Blogs
Blog — PlanetScale
Blog — PlanetScale
A
Arctic Wolf
G
Google Developers Blog
量子位
U
Unit 42
I
InfoQ
V
V2EX
F
Fox-IT International blog
P
Privacy & Cybersecurity Law Blog
V
Visual Studio Blog
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
C
CERT Recently Published Vulnerability Notes
博客园 - 三生石上(FineUI控件)
T
The Exploit Database - CXSecurity.com
T
Tailwind CSS Blog
SecWiki News
SecWiki News
Know Your Adversary
Know Your Adversary
MyScale Blog
MyScale Blog
宝玉的分享
宝玉的分享
The Hacker News
The Hacker News
Project Zero
Project Zero
Application and Cybersecurity Blog
Application and Cybersecurity Blog
月光博客
月光博客
Recent Commits to openclaw:main
Recent Commits to openclaw:main
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
GRAHAM CLULEY
C
Cisco Blogs
I
Intezer
Simon Willison's Weblog
Simon Willison's Weblog
O
OpenAI News
Recorded Future
Recorded Future
T
Tenable Blog
W
WeLiveSecurity
腾讯CDC
Stack Overflow Blog
Stack Overflow Blog
T
The Blog of Author Tim Ferriss
www.infosecurity-magazine.com
www.infosecurity-magazine.com
D
Docker
C
Cybersecurity and Infrastructure Security Agency CISA
PCI Perspectives
PCI Perspectives

技术改变视野

为程序员、设计师打造的摸鱼社区:摸鱼派! - 技术改变视野 我在 GitHub 上的开源项目 - 技术改变视野 为IDEA/Git配置GPG密钥,点亮GitHub Verified Commit标识 - 技术改变视野 无题 - 技术改变视野 年轻人的第一辆京牌电动车 - 技术改变视野 我们忙碌且漫长的一生,有多久是为自己而活? 说说《后浪》 离线使用 Google Fonts:让你的网站更精致 | goofoffline 神器,一键下载生成离线字体库! :art: 适用于 Solo / Bolo 的清新高级主题 —— Sakura | 移植自 WordPress 主题 大白话之Java级联调用:一个类,一条语句,同时调用好几个方法,串成一串 大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field ) 一个实例理解Java的接口(interface)用处与用法 一个实例带你理解JavaBean WebFilter-SpringBoot过滤器注解实例讲解 实例带你搞懂Java多线程&&线程池之(壹):线程池与多线程的关系和区别 实例带你搞懂Java多线程&&线程池之(贰):简单的线程池应用 实例带你获取多线程Thread的返回值之 (壹) - Callable的运行 实例带你学会简单的Java Thread多线程 实例带你获取多线程Thread的返回值之 (贰) - Callable配合线程池返回数据 一个实例理解Java Runnable多线程用处与用法 一个最简单的实例理解Semaphore在Java中的作用 从零开始OpenSSL之 (壹) - 使用genrsa、rsa、rsautl生成公私钥 从零开始 OpenSSL 之 (贰) - 使用 rsautl 解密文件 大白话之Docker(壹):快速入门&&简单官方实例 大白话之耦合性:什么是耦合性和内聚性?用编程语言实例讲解!
从 SpringMVC 转为使用 SpringBoot —— 手把手带你使用 Intellij IDEA 最快速地搭建 SpringBoot+MyBatis(无 XML)+Thymeleaf - 技术改变视野
adlered · 2020-12-24 · via 技术改变视野

最近打算从SpringMVC的学习过渡到SpringBoot的学习,一直听说SpringBoot十分方便,便想探个究竟。

提示

篇幅可能较长,但这可能是最全最简单的一篇教程了,请抱着不厌其烦的态度去学习。无论你有没有SpringMVC的搭建基础,你都可以跟着本教程将SpringBoot正常驱动起来。

逐步重启测试能保证某段配置过程不出问题,请不要忽略掉文中多次要求重启的要求。

  1. 新建项目

20190221195713287.png

File -> New - >Project...

  1. 选择Spring Initlalizr

20190221200032765.png

Spring Initializr -> 在右侧Project SDK选择你配置的SDK(推荐JDK1.8) -> Next

如果你的IDEA中没有"Spring Initializr",说明你的IDEA是社区版(Community Editon)的,请更换版本为ULTIMATE。

  1. 配置项目属性

20190221200529999.png

修改:

Group:团队名,通常填写为com.xxx

Artifact:包名,通常填写该项目的名称

Name:项目名称

Description:项目描述

其它选项会自动配置,默认即可。

  1. 选择依赖库

20190221201048700.png

点击“Next”后,在“Dependencies”页面中,我们勾选以下几个库:

Web -> Web

Template Engines -> Thymeleaf

SQL -> MySQL

SQL -> JDBC

SQL -> MyBatis

  1. 项目配置

20190221201342529.png

在勾选完毕后,点击“Next”并设置“**项目名称”**和“项目所在的目录”可默认)。

  1. 等待自动配置

20190221201803372.png

点击“Finish”后,你会看到IDEA主界面的右下方有进度条在进行。如果你是第一次配置SpringBoot项目,这可能需要十分钟。耐心等候进度条消失后再继续进行下一步。

如果右下方出现了一个“Enable Auto-Import”选项,记得点击一下。

  1. 配置文件

20190221202423236.png

展开左侧的src -> main -> resources -> 编辑 application.properties:

 1#SpringBoot配置文件
 2//让SpringBoot支持热部署
 3spring.devtools.restart.enabled=true
 4#SpringBoot配置文件结束
 5
 6#MyBatis配置文件
 7//设置数据库的连接地址和使用的Database
 8spring.datasource.url=jdbc:mysql://127.0.0.1:3306/Users?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true
 9//设置数据库的用户名
10spring.datasource.username=root
11//设置数据库的密码
12spring.datasource.password=root
13//设置数据库的驱动
14spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
15#Mybatis配置文件结束
16
17#Thymeleaf配置文件
18//关闭Thymeleaf的缓存
19spring.thymeleaf.cache=false
20//设置Thymeleaf的类型
21spring.thymeleaf.servlet.content-type=text/html
22//启用Thymeleaf
23spring.thymeleaf.enabled=true
24//设置Thymeleaf的编码
25spring.thymeleaf.encoding=UTF-8
26//设置Thymeleaf的模式
27spring.thymeleaf.mode=HTML5
28//设置Thymeleaf的目录前缀
29spring.thymeleaf.prefix=classpath:/templates/
30//设置Thymeleaf的目录后缀
31spring.thymeleaf.suffix=.html
32#Thymeleaf配置文件结束

20190221202423236.png

其中的数据库配置请根据实际情况更改。

  1. 运行测试

20190221202856639.png

至此,我们完成了大部分的配置。由于SpringBoot已经内置了Tomcat,我们不需要再自行设置,点击IDEA右上方的“运行”按钮即可开启服务。

如果你在开启以后SpringBoot没有“自动关闭”,那么说明你的配置是正确的。让我们继续。

  1. Hello World!

现在我们可以创建一个“HelloWorld”程序了。

首先右键src -> main -> java -> com.xxx.xxx(你自己设定的)-> New -> Package -> 填写"controller" -> OK

然后右键你刚刚新建的“controller”包,选择New -> Java Class -> 填写“MainController” -> OK

(以上两步要求填写的内容可由你自己来定义)

新建完成后,如图所示。

20190221203341195.png

如下图所示将向该类中新建一个“HelloWorld”入口:

20190221203724240.png

@Controller:告知SpringBoot该类是控制器,控制器才能使@RequestMapping或@ResponseBody等生效;

@RequestMapping:告知控制器该注解下面的方法需要通过该注解指定的目录进行访问;

@ResponseBody:如果使用return返回String字符串,直接将字符串显示到页面上而不是将其理解为URL并跳转。

填写完毕后,重启SpringBoot!我们在浏览器中打开“localhost:8080/hello”,即可看到:

20190221203632150.png

  1. 测试Thymeleaf

现在我们的Controller(控制器)已经可以和用户进行正常的交互了。那么如果我们需要将该方法的内容传递到一个页面中,就需要用到Thymeleaf。如果不理解没关系,请继续往下看:

20190221204227941.png

现在我们将注意力转移到“resources”这个文件夹下,“static”中用于存放我们网页中的静态内容(CSS、JS等),“templates”用于存放我们可以与后台进行交互的HTML文件。

在“templates”文件夹中新建一个“index.html”:

 1<!DOCTYPE html>
 2<html xmlns:th="http://www.thymeleaf.org">
 3<html lang="en">
 4<head>
 5    <meta charset="UTF-8">
 6    <title>Demo测试</title>
 7</head>
 8<body>
 9这是一个Thymeleaf测试页面!
10</body>
11</html>

20190221204834422.png

请注意这行:

<html xmlns:th="http://www.thymeleaf.org">

如果不加入这行,你无法在IDEA中获取语法提示,所以这是必需的。

重启SpringBoot(稍后我们会将其配置为无需重启),然后在浏览器中访问“localhost:8080”测试(因为页面是index.html,这是默认的默认页,所以不需要加入文件名):

  1. 从Controller返回到index.html

现在,我们需要从后台返回数据到index.html

首先,在MainController.java中添加一个方法:

1@RequestMapping("/hi")
2    public ModelAndView hi() {
3        ModelAndView modelAndView = new ModelAndView("index");
4        modelAndView.addObject("result", "已连接到后台!");
5        return modelAndView;
6    }

20190221210038866.png

  1. 为什么没有使用@ResponseBody注解?
    首先我们不想要字符串直接返回给用户,并且我们规定返回了“ModelAndView”这个类。
  2. “new ModelAndView("index")”中的“index”为什么不是“index.html”?
    倒回去翻一下你的配置文件“application.properties”,看看最后一行的“prefix”和“suffix”配置项,SpringBoot会自动为你的返回值添加上前缀和后缀,所以“index”会自动被转换为“classpath:/templates/index.html”。
  3. “addObject”的用法?
    该方法需要传递两个值,用于返回给前端。第一个值是“Key(键)”,它是独一无二的,不得有重复,前端可以按照键名来获取第二个值(“Value(值)”)。

在index.html的body中随便找个地方添加一行:

<p th:text="${result}"></p>

更多的用法不是本教程的重点,请自行学习“Thymeleaf文档”。

运行!

继续不耐烦地重启你的SpringBoot,然后访问“localhost:8080/hi”:

20190221210038866.png

Awesome!你的Thymeleaf与ModelAndView已经正常运行了!

  1. 从数据库读取数据

如何在MySQL中建表我就不多讲了,如果不懂请翻阅入门教程。

在刚刚填写完的“application.properties”中,我们的数据库地址为:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/Users?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true

可以知道我们的数据库地址是127.0.0.1,连接的端口是默认的3306,使用的数据库是“Users”。

1. 建表

在“Users”数据库下,建立一个**表(Table)**名为“admin”:

该表中有两列数据:“id”和“name”,然后随便添加几行数据。

2. 新建Mapper

右键“com.xxx.xxx” -> New -> Package -> 填写“mapper” -> OK

然后右键你刚刚新建的“mapper”包 -> New -> Java Class -> 在“Kind”中选择“Interface” -> “Name”填写为“UserMapper” -> OK

201902212113368.png

3. 修改“UserMapper”中的内容

1import org.apache.ibatis.annotations.Mapper;
2import org.apache.ibatis.annotations.Select;
3
4@Mapper
5public interface UserMapper {
6    @Select("SELECT * FROM admin")
7    List<User> getUsers();
8}

@Mapper:向SpringBoot声明该接口是一个MyBatis接口

@Select:选择语句

4. 编写一个JavaBean

我们刚刚有一句语句List是报错的,因为我们还需要新建一个名为“User”的类作为返回数据的Bean。(如不懂JavaBean,请先使用百度了解)

右键“com.xxx.xxx” -> New -> Package -> 填写“dao” -> OK

右键刚刚新建的“DAO” -> New -> Java Class -> 填写“User” -> OK

此时回到“UserMapper”,将“User”类自行使用import语句导入。

import com.hotpot.demo.dao.User;

5. 编辑User类的内容

将“User”类中内容修改为:

 1public class User {
 2    private int id;
 3    private String name;
 4
 5    public void setId(int id) {
 6        this.id = id;
 7    }
 8
 9    public int getId() {
10        return id;
11    }
12
13    public void setName(String name) {
14        this.name = name;
15    }
16
17    public String getName() {
18        return name;
19    }
20}

很好,现在万事俱备了。

13) 调用UserMapper运行查询语句并返回结果

回到“MainController”,我们添加两个语句在“public class xxx{”的下一行

1@Autowired
2    UserMapper userMapper;

如果现在IDEA提示你错误,不要理会。

如果想去掉IDEA对该行的提示,点击右下角戴帽子的小老头,选择“Syntax”即可。

更新:在UserMapper接口的@Mapper一行下添加一行@Service,如下:

1@Mapper  
2@Service  
3public interface UserMapper {

@Service注解告诉SpringBoot,这是一个业务层Bean。

然后再添加一个方法

1@RequestMapping("/test")
2    public void test() {
3        List<User> list = userMapper.getUsers();
4        for (User i:list) {
5            System.out.print("id为:" + i.getId());
6            System.out.print("name为:" + i.getName() + "\n");
7        }
8    }

此方法涉及到了“foreach”和“List”的知识,如果不太懂请百度。

最后,在浏览器中访问“localhost:8080/test”:

虽然浏览器报错了但是在控制台中我们可以看到语句正常执行了。

报错是因为我填写的返回值是“void”为空,所以后端也不知道怎么返回,于是便抛出错误。

20190221213047760.png

以上是基础搭建的全部过程。如果想将List传回前端并遍历显示出来,请自行研究。不过我更喜欢使用JavaScript的JQuery使用JSON与后台进行交互。

  1. 让项目支持不重启即可生效

打开“pom.xml”,找到“</dependencies>”并在它的之前加入:

1<!-- hot swapping, disable cache for template, enable live reload -->
2        <dependency>
3            <groupId>org.springframework.boot</groupId>
4            <artifactId>spring-boot-devtools</artifactId>
5            <optional>true</optional>
6        </dependency>

然后继续等候右下角进度条消失。

再再再再重启一次......

享受快捷

现在,当你修改了Java或是html文件后,你都可以点击右上角的绿色小锤子Build”按钮,然后刷新下页面 —— 奇迹出现了!

最后

恭喜你踏出了SpringBoot学习的第一大步!现在你可以开始构建属于你自己的站点了!

如果这篇文章对你有所帮助,请帮助我点击右上方的“赞” || “评论” || “关注”!
如果你对内容有异议 || 问题,请在下方评论留言!