SSM框架-SpringBoot初体验

SpringBoot初体验

Java语言从诞生之日起,就被广泛的应用在了服务器端,它接收来自浏览器的请求(request),在经过一系列的逻辑处理之后,向浏览器返回响应(response),这是典型的浏览器(B)/服务器(S)工作模式,Java在服务器端扮演主要角色。

伴随着SpringStruts的诞生,一种新的组合式框架SSH 得到了广泛的使用,其中的H 指的HibernateServlet有一个很大的问题,就是不够模块化,所有的代码杂合在一起。比如业务处理和数据库操作放在一起,这样的代码维护性差。 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表明项目基于SpringBoot,同时下面的类是整个项目的启动类。
@SpringBootApplication
public class NetApplication {
//启动类有一个main函数是SpringBoot的特点之一,和普通的Java工程一样是使用main函数启动的。
public static void main(String[] args) {
//SpringApplication是SpringBoot框架的一个核心类,run是它的一个静态方法,方法的参数为当前类的Class对象和用户输入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 {
//添加路由并编写相应方法
/********** Begin **********/
@RequestMapping("/hello")
public String index(){
return "Say Hello!";
}
/********** End **********/
}

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) {
//启动Spring Boot
/********** Begin **********/
SpringApplication.run(DemoApplication.class,args);
/********** End **********/
}
}

第2关:实现登录、注册、下线功能

Spring Boot非常适合Web应用程序开发,你可以使用其自带的TomcatJettyUndertowNetty创建HTTP服务器。

相关知识

Web 请求

Spring Boot既然是Web后台框架,那么它就需要处理Web请求,我们来看一个典型的Web请求(按下F12键,选择网络,然后点击本网站的登录按钮,你看到的第一个请求如下):

图 1 Web请求图

请求网址和地址栏的网址没有本质的区别,地址栏网址请求的是整个页面,而上面的这种网址请求的一般是页面中的一个具体的元素:一张图片,一段音乐等,它的粒度更小。

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;
//这里也可以有一个@RequestMapping("/test"),如果有,那么下面的第一个方法拦截的就是/test/login结尾的请求,也就是说,这里的注解配置的是上一层的拦截地址。
@RestController
public class BlogController {
//表示下面的方法处理的是以/login结尾的请求。
@RequestMapping("/login")
public String Login(){
return "Welcome Login!";
}
//表示下面的方法处理的是以/register结尾的请求。
@RequestMapping("/register")
public String Register(){
return "Welcome Register!";
}
}

还是按照上一关介绍的方法运行这个项目,运行成功后,打开浏览器,输入http://localhost:8080/login,得到的页面如下:

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

图 3 页面二

不同的请求被不同的方法做了处理,最终返回相应的结果。

任务代码

编程要求

本关的编程任务是在右侧的BeginEnd中间添加一个具有下线功能的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!";
}
/********* Begin *********/
@RequestMapping("/logout")
@ResponseBody
public String Logout(){
return "GoodBye!";
}
/********* End *********/
}

第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 {
/********** Begin **********/
// 获取HttpServletRequest对象
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
// 打印所给要求中的固定格式
logger.info("---------------请求内容----------------");
//打印URL
logger.info("URL : "+request.getRequestURL());
//打印请求方式
logger.info("HTTP_METHOD : "+request.getMethod());
// 打印所给要求中的固定格式
logger.info("---------------请求内容----------------");
/********** End **********/
}
//在方法执行完结后打印返回内容
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
/********** Begin **********/
// 打印所给要求中的固定格式
logger.info("---------------返回内容----------------");
// 处理完请求,打印返回内容
logger.info("RESPONSE : " + ret);
// 打印所给要求中的固定格式
logger.info("---------------返回内容----------------");
/********** End **********/
}
}

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 {

//添加路由映射到/Login并编写相应方法返回Welcome Login!
/********** Begin **********/
@RequestMapping("/Login")
public String Login(){
return "Welcome Login!";
}
/********** End **********/
}
END

头歌编程:SpringBoot初体验


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!