SpringBoot初体验
Java
语言从诞生之日起,就被广泛的应用在了服务器端,它接收来自浏览器的请求(request
),在经过一系列的逻辑处理之后,向浏览器返回响应(response
),这是典型的浏览器(B
)/服务器(S
)工作模式,Java
在服务器端扮演主要角色。
伴随着Spring
和Struts
的诞生,一种新的组合式框架SSH
得到了广泛的使用,其中的H
指的Hibernate
。 Servlet
有一个很大的问题,就是不够模块化,所有的代码杂合在一起。比如业务处理和数据库操作放在一起,这样的代码维护性差。 SSH
中的三个框架分别承担了一定的角色,互相之间耦合性较低。其中Struts
负责流程控制,Spring
负责业务控制,Hibernate
负责和数据库交接。
SSH
及其衍生框架也有一个问题,它们需要配置很多东西,比如数据源、数据库事务、日志、服务器等等。SpringBoot
的出现解决了这个问题,基于“约定大于配置”的思想,SpringBoot
提供了很多默认的配置,通常情况下,如果你没有特殊的要求,就不需要再考虑配置的事情。
第1关:第一个Spring Boot程序
- 如何创建一个
Spring Boot
程序; - 如何创建一个
web
程序。
具体创建过程此处不再赘述
课程视频 - 搭建一个SpringBoot 程序
相关知识
项目启动类DemoApplication
1 2 3 4 5 6 7 8 9 10 11 12
| package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication public class NetApplication { public static void main(String[] args) { SpringApplication.run(NetApplication.class, args); } }
|
创建一个Web程序
首先,我们在导入的项目的pom.xml
文件里加入如下依赖:
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
|
注:该依赖引入了web
模块开发需要的相关jar
包,版本信息都由spring-boot-starter-parent
控制。
接着创建一个controller
包,并在下面创建一个HelloController
类:
1 2 3 4 5 6 7 8 9 10
| package com.example.demo.controller; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; @RestController public class HelloController { @RequestMapping("/") public String index() { return "Hello Spring Boot!"; } }
|
该类被标记为@RestController,这意味着Spring MVC
可以使用它来处理Web
请求。 @RequestMapping 注释提供“路由”信息。它告诉Spring
,任何带有/
路径的HTTP
请求都应该映射到index()
方法。 从浏览器调用或在命令行上使用curl
时,该方法返回纯文本。 这是因为@RestController结合了@Controller和@ResponseBody,两个注释导致Web
请求返回数据而不是视图。
这样一个简单的Web
程序就搭建起来了,然后就可以运行该程序了,运行成功后,打开浏览器,输入http://localhost:8080
,得到的页面如下:

任务代码
编程要求
- 补全代码,当在浏览器输入
http://localhost:8080/hello
时,页面返回Say Hello!
.
HelloController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package com.example.demo.controller;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping;
@RestController public class HelloController { @RequestMapping("/hello") public String index(){ return "Say Hello!"; } }
|
DemoApplication.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| package com.example.demo;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class,args); } }
|
第2关:实现登录、注册、下线功能
Spring Boot
非常适合Web
应用程序开发,你可以使用其自带的Tomcat
,Jetty
,Undertow
或Netty
创建HTTP
服务器。
相关知识
Web 请求
Spring Boot
既然是Web
后台框架,那么它就需要处理Web
请求,我们来看一个典型的Web
请求(按下F12
键,选择网络,然后点击本网站的登录按钮,你看到的第一个请求如下):

请求网址和地址栏的网址没有本质的区别,地址栏网址请求的是整个页面,而上面的这种网址请求的一般是页面中的一个具体的元素:一张图片,一段音乐等,它的粒度更小。
用Spring Boot
处理这种请求的时候,关键是把不同的请求映射到不同的Java
方法上,比如我们可能会用LoginAction()
方法来处理/login
请求,而用RegisterAction()
来处理/register
请求。
用 Spring Boot 处理 Web 请求,添加 Java 类
在上一关的代码的基础上做如下修改,我们的项目就能实现登录处理功能。
第一步,我们在controller
包下新建一个类BlogController
,代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package com.example.demo.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
@RestController public class BlogController { @RequestMapping("/login") public String Login(){ return "Welcome Login!"; } @RequestMapping("/register") public String Register(){ return "Welcome Register!"; } }
|
还是按照上一关介绍的方法运行这个项目,运行成功后,打开浏览器,输入http://localhost:8080/login
,得到的页面如下:

我们再输入http://localhost:8080/register
,得到的页面如下:

不同的请求被不同的方法做了处理,最终返回相应的结果。
任务代码
编程要求
本关的编程任务是在右侧的Begin
和End
中间添加一个具有下线功能的Java
方法,要求该方法能处理以/logout
结尾的Web
请求,然后返回字符串GoodBye!
。(方法的名字不做限制)
MyController.java
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
| package com.educoder.net; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;
@Controller public class MyController { @RequestMapping("/login") @ResponseBody public String Login(){ return "Welcome Login!"; } @RequestMapping("/register") @ResponseBody public String Register(){ return "Welcome Register!"; } @RequestMapping("/logout") @ResponseBody public String Logout(){ return "GoodBye!"; } }
|
第3关:Spring Boot练习题
- 如何获取
Web
请求对象; - 如何获取
Web
请求返回的内容。
相关知识
Sprig Boot整合AOP
在pom.xml
中添加相关依赖:
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
|
如何获取 Web 请求对象
在Spring Boot
中我们可以通过RequestContextHolder
很方便的获取请求对象。
1 2
| ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest();
|
获取HttpServletRequest
对象后,我们可以获取其中的许多信息,比如:
request.getRequestURL()
可以获取URL
;
request.getMethod()
可以获取请求方式。
#####如何获取 Web 请求返回的内容
使用@AfterReturning
通知在切入点返回内容之后切入内容(用来对处理返回值做一些加工处理)
1 2 3 4 5
| @AfterReturning(returning = "ret", pointcut = "webLog()") public void doAfterReturning(Object ret) throws Throwable { logger.info("RESPONSE : " + ret); }
|
任务代码
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End
区域内进行代码补充(有个pom.xml
需要填充相关依赖),使用AOP
记录Web
登录请求日志,获取请求URL
,请求方式以及请求后的返回内容。
并在请求内容前后输出---------------请求内容----------------
在返回内容前后输出---------------返回内容----------------
。
后台会自动启动该Spring Boot
工程并请求以/Login
结尾的Web
请求。
BlogAspect.java
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 44 45 46 47 48 49 50 51 52 53 54
| package com.yy.hello; import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @Aspect @Component public class BlogAspect { private Logger logger = LoggerFactory.getLogger(getClass()); @Pointcut("execution(public * com.yy.hello.controller.Blog.Login())") public void webLog() {
} @Before("webLog()") public void doBefore(JoinPoint joinPoint) throws Throwable { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); logger.info("---------------请求内容----------------"); logger.info("URL : "+request.getRequestURL()); logger.info("HTTP_METHOD : "+request.getMethod()); logger.info("---------------请求内容----------------"); } @AfterReturning(returning = "ret", pointcut = "webLog()") public void doAfterReturning(Object ret) throws Throwable { logger.info("---------------返回内容----------------"); logger.info("RESPONSE : " + ret); logger.info("---------------返回内容----------------"); } }
|
Blog.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package com.yy.hello.controller;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
@RestController public class Blog {
@RequestMapping("/Login") public String Login(){ return "Welcome Login!"; } }
|
END
头歌编程:SpringBoot初体验