在上一节STEP3.2 服务器对于HTTP请求的处理流程中,我们学会了后端服务相关的理论知识。
接下来,我们就要落实到代码层面。
没有需求何来的代码开发?正所谓需求(DDL)是第一生产力,为了让我们在学习过程中不要冒出“学这个有什么用?”的奇怪想法,我们先来拟订一个需求,然后根据这个需求开展我们相关的学习,以及最后的代码开发。
我们假设我们的老板有如下三个需求:
- 用户可以通过账号密码登录
- 已经登录的用户可以查看全用户名列表(没登录就不能看)
- 用户可以注销
为了这三个需求,我们需要以怎样的顺序,开展哪些内容的学习呢?
- 学会如何搭建、配置、启动、访问服务(本节内容)
- 为了正常使用我们需要的第三方包,我们需要理解SpringBoot是如何管理依赖的(STEP4.2 认识pom.xml)
- 理解会话的概念,学会如何保持登录状态,并进行相应代码实践()
- 写代码搭建项目login-demo,逐步完成需求()
最后,我们还会利用Spring的特性(SpringBoot内置Spring)来优化一下我们的项目:
- 理解Spring IOC特性()
- 使用我们的IOC特性来为login-demo做代码优化()
那么接下来,就开始我们的第一步吧!
在这一节中,我们要用代码来实践最简单的后台处理。
![103d67c414bef1a7ee401a451c3423e8.png](https://i-blog.csdnimg.cn/blog_migrate/f2aac5ca4188ea17586871980881a325.png)
其实也就是我们学任何语言or框架都首先会有的 Hello World!
一、新建SpringBoot项目
1.新建项目,选择Spring Initializr
![507bae5735ee5f4a3739948d60f58562.png](https://i-blog.csdnimg.cn/blog_migrate/5088c660b31704d3b09a039c98f233c9.jpeg)
2.设置项目基本信息
![7bc9d7745f516ca69dd3259dfc0a8158.png](https://i-blog.csdnimg.cn/blog_migrate/7b33dbf1accd201e71a9a4e4ab039678.jpeg)
3.勾选依赖界面。我们勾选Web→Spring Web。(依赖是什么?我们到4.2节再说)
![741bd8f26e94d8f80e4408232766ea81.png](https://i-blog.csdnimg.cn/blog_migrate/dc0daded685d0fb07aa3ac3494b53b86.jpeg)
4.指定我们的项目名和项目路径
![1b46c817644c276ebd9ed1f47471e161.png](https://i-blog.csdnimg.cn/blog_migrate/586f7f5417f4dc04a4b3a1836b18a6e3.jpeg)
5.此时可以看到idea为我们创建的项目结构
![2839ddc52e141876d554bdcdee79a9e0.png](https://i-blog.csdnimg.cn/blog_migrate/6562b98da76a8d7aa97f349063e37bde.jpeg)
简单说一说我们SpringBoot的项目结构,如图:
![35cb511fb8f68758d44379e12562b0b3.png](https://i-blog.csdnimg.cn/blog_migrate/7eea7630b5b0ca0217f59561f29c1fa2.png)
红色框:java文件夹
在这个文件夹中,主要写我们的业务代码。包括controller、service、dao,还有各种工具类等等,以及我们的程序主入口:xxxApplication。
蓝色框:resources文件夹
在这个文件夹中,有我们的全局配置文件application.properties,一般我们也会放一些其他的配置文件,比如mapper.xml(暂时不用着急在意它是什么)等等。如果是前后端不分离项目,在resources文件夹中还会放一些静态页面资源(.html等)。
绿色框:test文件夹
在这个文件夹中,主要写我们的软件测试代码。这个文件夹基本上不在我们专栏研究的范围内。
橙色框:pom.xml
这是我们管理项目依赖的文件夹,具体解释请看4.2节。在这一节中我们并不会用到它。
二、修改application.properties配置文件
首先,application.properties配置文件是什么?
这是我们SpringBoot项目的默认配置文件,在这个文件里可以设置我们的服务启动端口、数据库连接信息(连到哪个数据库)、资源文件路径(比如mybatis的xml路径)、编码、时区等等等等,很多适用于整个项目的配置都会在这里写。
不要想得太复杂,我们从本质的角度来思考一下:
.properties其实也就是一种文件格式,完全可以用我们的txt文本文档或者.xlsx表格文档等等来替代。然后我们的程序读取这个文档,比如读取这个文档里的数据库配置信息,那么我们的程序也就知道应该去访问哪个数据库。
当然,我们也完全可以丢弃配置文件,把数据库配置等等信息直接写到代码里。但这就产生了一个硬编码的问题,当我们要修改配置的时候就要回到代码去修改,非常不便。
不仅是SpringBoot,各种流行的框架都会考虑这一点,把全局配置信息分离出来,放到一个或几个单独文件里。
application.properties就是这样的文件。
但是一般应用场景中,我们会用.yml来替代.properties文件。简单举个例子讲一下.properties和.yml的区别:
对于同样的数据库配置:
.properties的配置方式:
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
.yml的配置方式:
# 数据源配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
.yml文件采用缩进的方式,解决了.properties需要反复写前缀的麻烦之处。
具体用.yml还是.properties来配置全凭个人喜好,笔者在这里会使用.yml来讲解~
然后,现在先来改一下配置文件后缀:
在application.properties上右键,Refactor→Rename
![f17d410edc462915f9d430bffed2f2ee.png](https://i-blog.csdnimg.cn/blog_migrate/6be6059acd8be388c75d8875c7ead870.jpeg)
![66b80dc0fc5078b1a1e9dd29e3387891.png](https://i-blog.csdnimg.cn/blog_migrate/b9c27c1b752f13665060cd3ec46543d8.png)
在application.yml中输入以下内容,为我们的Hello World项目设置一下服务启动端口(如果不设置的话,默认也是8080):
server:
port: 8080
注意:port后面的冒号后面要有空格。不然配置会失效。
正确的写法:
![3746bf3c4604d4f0b8de7fd4af36d2ee.png](https://i-blog.csdnimg.cn/blog_migrate/a8ba11c41efd6941e414602f70285dc5.png)
错误的写法:
![34f941ae153650defd8fc62ae278ac16.png](https://i-blog.csdnimg.cn/blog_migrate/4d11528a8ddc4115a68e6170a930dd84.png)
我们可以看到,如果冒号后面没有空格,port会变黑色。
三、构建项目结构
按照上篇的内容(STEP3.2 服务器对于HTTP请求的处理流程)我们应该有Controller、Service、Dao的分层,为项目添加结构如下:
![2e1fccf132e62a1482713e8dd83c1b48.png](https://i-blog.csdnimg.cn/blog_migrate/124554fd85432a66207a3ffa9ca8193c.jpeg)
注:保持良好习惯,包名小写
第一个SpringBoot程序只是写helloworld,所以service和dao层暂时用不到。但是保持良好习惯,文件夹可以先建在那里。
四、写一个HelloWorld服务
在controller包中新建一个类MyController.java,写入以下代码:
import
涉及到的两个关键注解,释义如下:
(1)@RestController
我们查看一下RestController的定义(Ctrl+鼠标左键点进@RestController可以看到)
@Target
@RestController是@ResponseBody和@Controller的集合(一个注解包含了两个注解,同时具有两个注解的功能)。
@Controller
@Controller方法可以修饰类,指定该类是一个控制器类。这意味着该类下的方法在返回时,会自动通过视图解析器解析(如果有解析器的话),返回页面资源。(参考我们的springboot-helloworld项目的myController2:springboot-helloworld项目)
@Controller是前后端不分离的解决方案(页面通过后台来返回),不属于我们的重点内容。
@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。本质上就是把返回页面资源的控制器转变成返回数据(字符串、浮点数、json对象等等)的控制器。
(2)@GetMapping
我们查看一下@GetMapping的定义:
@Target
也就是说,如下这两种写法是等价的:
@GetMapping
@RequestMapping
那么看到下面这个@RequestMappling的写法也就很好理解了。
@GetMapping也就是指定请求方式为GET方式,里面传的参数也就是value值,代表请求的URL。
换言之,用户通过"/hello"这个url发送一个GET请求,可以进入@GetMapping("/hello")修饰的方法public String hello()里,执行里面的业务逻辑并返回。
最后运行我们的服务(在入口类SpringbootHelloworldApplication上右键运行),控制台会显示如下字样:
![1d11ce89f7788e7337ea5cff978442fc.png](https://i-blog.csdnimg.cn/blog_migrate/e8043c7f65c087b39ee15384513dbe59.jpeg)
会首先显示一个Spring的大图标,在倒数第二行会显示服务运行在8080端口上(支持http协议访问)
打开浏览器输入localhost:8080/hello可以看到如下界面:
![12d1fa0b22b281b0a4a2ae3d1064cf0b.png](https://i-blog.csdnimg.cn/blog_migrate/e0b0c7a7f844aa9f8184cc21e8217308.png)
至此,最简易的服务就算是搭建完成了~完结撒花~
我们的helloworld项目的地址:
springboot-helloworld