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

推荐订阅源

P
Privacy International News Feed
I
Intezer
T
Tenable Blog
S
Schneier on Security
Project Zero
Project Zero
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件
Know Your Adversary
Know Your Adversary
博客园 - 司徒正美
The Cloudflare Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
News and Events Feed by Topic
博客园 - 叶小钗
宝玉的分享
宝玉的分享
L
LINUX DO - 热门话题
aimingoo的专栏
aimingoo的专栏
S
Secure Thoughts
Forbes - Security
Forbes - Security
T
The Exploit Database - CXSecurity.com
D
Darknet – Hacking Tools, Hacker News & Cyber Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 【当耐特】
罗磊的独立博客
IT之家
IT之家
H
Hacker News: Front Page
I
InfoQ
云风的 BLOG
云风的 BLOG
S
Security Affairs
M
MIT News - Artificial intelligence
GbyAI
GbyAI
Jina AI
Jina AI
Help Net Security
Help Net Security
Engineering at Meta
Engineering at Meta
大猫的无限游戏
大猫的无限游戏
Webroot Blog
Webroot Blog
L
Lohrmann on Cybersecurity
A
About on SuperTechFans
Attack and Defense Labs
Attack and Defense Labs
The Register - Security
The Register - Security
V
V2EX
G
Google Developers Blog
D
DataBreaches.Net
Apple Machine Learning Research
Apple Machine Learning Research
C
Cybersecurity and Infrastructure Security Agency CISA
J
Java Code Geeks
W
WeLiveSecurity
Cloudbric
Cloudbric
T
Tor Project blog

技术改变视野

为程序员、设计师打造的摸鱼社区:摸鱼派! - 技术改变视野 大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field ) - 技术改变视野 大白话之耦合性:什么是耦合性和内聚性?用编程语言实例讲解! - 技术改变视野 🎨 适用于 Solo / Bolo 的清新高级主题 —— Sakura | 移植自 WordPress 主题 - 技术改变视野 我在 GitHub 上的开源项目 - 技术改变视野 为IDEA/Git配置GPG密钥,点亮GitHub Verified Commit标识 - 技术改变视野 无题 - 技术改变视野 年轻人的第一辆京牌电动车 - 技术改变视野 我们忙碌且漫长的一生,有多久是为自己而活? - 技术改变视野 一个最简单的实例理解Semaphore在Java中的作用 - 技术改变视野 说说《后浪》 - 技术改变视野 离线使用 Google Fonts:让你的网站更精致 | goofoffline 神器,一键下载生成离线字体库! - 技术改变视野 实例带你学会简单的Java Thread多线程 - 技术改变视野 一个实例理解Java的接口(interface)用处与用法 - 技术改变视野 一个实例带你理解JavaBean - 技术改变视野 WebFilter-SpringBoot过滤器注解实例讲解 - 技术改变视野 实例带你搞懂Java多线程&&线程池之(壹):线程池与多线程的关系和区别 - 技术改变视野 实例带你搞懂Java多线程&&线程池之(贰):简单的线程池应用 - 技术改变视野 实例带你获取多线程Thread的返回值之 (壹) - Callable的运行 - 技术改变视野 实例带你获取多线程Thread的返回值之 (贰) - Callable配合线程池返回数据 - 技术改变视野 一个实例理解Java Runnable多线程用处与用法 - 技术改变视野 从零开始OpenSSL之 (壹) - 使用genrsa、rsa、rsautl生成公私钥 - 技术改变视野 从零开始 OpenSSL 之 (贰) - 使用 rsautl 解密文件 - 技术改变视野 大白话之Docker(壹):快速入门&&简单官方实例 - 技术改变视野 大白话之Docker(贰):简单部署一个Tomcat服务并发布内容 - 技术改变视野 大白话之从零讲解DVWA(壹)-SQL注入(SQL Injection) Low Level - 技术改变视野 大白话之从零讲解DVWA(贰)-SQL注入(SQL Injection) Medium/High Level - 技术改变视野 Java日志插件-Slog4J下载 - 技术改变视野 大白话之必会Java Atomic | 线程一点也不安全(一):比自增和synchronized更快速、靠谱的原子操作(调用C语言) - 技术改变视野 Log-MySQL root用户登录后无法查看数据库全部表/正常访问数据库 Access denied for user 'root'@'localhost' to database - 技术改变视野 大白话之Docker(叁):制作一个运行Tomcat服务端的Docker镜像 - 技术改变视野 Github仅保留指定文件/文件夹当前Commit,删除所有历史记录,清除「敏感信息」 - 技术改变视野 将Tomcat、MySQL从Linux迁移到Windows的心路历程(干货):令人恐惧的字符编码 - 技术改变视野 Spring: java.lang.NoSuchMethodError: clearCache | ClassNotFoundException | Error during artifact deployment 思路及解决办法 - 技术改变视野 大白话之Java反射-初学最迷的概念:能干啥?咋用? - 技术改变视野 大白话之Java面向接口编程:最“正经”的中文实例讲解,看不懂来打我! - 技术改变视野 大白话 | 课堂实践:使用Iterator对数组进行遍历 - 技术改变视野 大白话之fail-fast | fail-safe:为什么会有这个机制?它有什么作用? - 技术改变视野 刨根问底 | 大白话:在使用注解后,框架是怎么知道你哪个方法使用了注解的?用@RequestMapping注解举例详解! - 技术改变视野 大白话之必会Java Atomic | 线程一点也不安全(二):Atomic的ABA问题会导致什么情况?如何解决? - 技术改变视野 随笔 | 奇淫技巧 | Java:记return和短路运算符的妙用 - 技术改变视野 随笔 | Tomcat:续-从Linux迁移到Windows编码问题彻底解决 - 技术改变视野 大白话之AutoClosable接口 | try-with-resources:JDK1.7的新特性,提高重复回收效率 - 技术改变视野 大白话之Java多线程join方法:开局一张图,试学一分钟,你就费和我一样,理解介个方法 - 技术改变视野 大白话之Java Stream流:将类数组流化,便捷批量修改,通俗讲解! - 技术改变视野 Java 困扰三周の问题:使用byte[]或skip()方法读取字节流Stream文件尾部多/少/缺字节解决方法 - 技术改变视野 大白话之Java级联调用:一个类,一条语句,同时调用好几个方法,串成一串 - 技术改变视野
从 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学习的第一大步!现在你可以开始构建属于你自己的站点了!

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