Spring Boot Web 开发注解篇

一、spring-boot-starter-web 依赖概述

在 Spring Boot 快速入门中,只要在 pom.xml 加入了 spring-boot-starter-web 依赖,即可快速开发 web 应用。可见,Spring Boot 极大地简化了 Spring 应用从搭建到开发的过程,做到了「开箱即用」的方式。Spring Boot 已经提供很多「开箱即用」的依赖,如上面开发 web 应用使用的 spring-boot-starter-web ,都是以 spring-boot-starter-xx 进行命名的。

Spring Boot 「开箱即用」 的设计,对开发者非常便利。简单来说,只要往 Spring Boot 项目加入相应的 spring-boot-starter-xx 依赖,就可以使用对应依赖的功能,比如加入 spring-boot-starter-data-jpa 依赖,就可以使用数据持久层框架 Spring Data JPA 操作数据源。相比 Spring 以前需要大量的XML配置以及复杂的依赖管理,极大的减少了开发工作量和学习成本。

当开发一个特定类型的应用程序时,特定的 Starter 提供所需的依赖关系,并且将对应的 Bean 注册到 Spring 容器中。spring-boot-starter-web 依赖就是提供开发 Web 应用的。

1.1 spring-boot-starter-web 职责

spring-boot-starter-web 是一个用于构建 Web 的 Starter ,包括构建 RESTful 服务应用、Spring MVC 应用等。并且不需要额外配置容器,默认使用 Tomcat 作为嵌入式容器。

1.2 spring-boot-starter-web 依赖关系

spring-boot-starter-web 这么强大,它的组成如下表:

spring-boot-starter  核心包,包括了自动化配置支持、日志、YAML 文件解析的支持等。

spring-boot-starter-json 读写 JSON 包

spring-boot-starter-tomcat Tomcat 嵌入式 Servlet 容器包

hibernate-validator Hibernate 框架提供的验证包

spring-web Spring 框架的 Web 包

spring-webmvc Spring 框架的 Web MVC 包

spring-boot-starter-web 包含了 Tomcat 和 Spring MVC ,那启动流程是这样的。 标识 @SpringBootApplication 的应用,初始化经过 spring-boot-starter  核心包中的自动化配置,构建了 Spring 容器,并通过 Tomcat 启动 Web 应用。很多 Starters 只支持 Spring MVC,一般会将 spring-boot-starter-web 依赖加入到应用的 Classpath。

另外,spring-boot-starter-web 默认使用 Tomcat 作为嵌入式 Servlet 容器,在 pom.xml 配置 spring-boot-starter-jetty 和 spring-boot-starter-undertow 就可以替换默认容器。

二、Spring MVC on Spring Boot

Spring MVC 是 Spring Web 重要的模块。内容包括 MVC 模式的实现和 RESTful 服务的支持。

2.1 Spring MVC 体系温故知新

spring-webmvc 模块里面包:

– org.springframework.web.servlet 提供与应用程序上下文基础结构集成的 Servlet,以及 Spring web MVC 框架的核心接口和类。
– org.springframework.web.servlet.mvc Spring 附带的 Servlet MVC 框架的标准控制器实现。
– org.springframework.web.servlet.mvc.annotation 用于基于注解的 Servlet MVC 控制器的支持包。
– org.springframework.web.servlet.mvc.condition 用于根据条件匹配传入请求的公共 MVC 逻辑。
– org.springframework.web.servlet.mvc.method 用于处理程序方法处理的基于 Servlet 的基础结构,基于在 org.springframework.web.method 包上。
– org.springframework.web.servlet.view 提供标准的 View 和 ViewResolver 实现,包括自定义实现的抽象基类。
– org.springframework.web.servlet.view.freemarker 支持将 FreeMarker 集成为 Spring Web 视图技术的类。
– org.springframework.web.servlet.view.json 支持提供基于 JSON 序列化的 View 实现的类。

上面列出来核心的包。org.springframework.web.servlet.view 包中, View 视图实现有常见的:JSON 、FreeMarker 等。org.springframework.web.servlet.mvc 包中,Controller 控制层实现包括了注解、程序方法处理等封装。自然,看源码先从 org.springframework.web.servlet 包看其核心的接口和类。

2.2 重要的类

DispatcherServlet 类:调度 HTTP 请求控制器(或者处理器 Handler)。
View 视图层 ModelAndView 类:模型和视图的持有者。
View 接口:MVC WEB 交互。该接口的实现负责呈现视图或者暴露模型。
Controller 控制层 HandlerMapping 接口: 请求从 DispacherServlet 过来,该接口定义请求和处理程序对象之间的映射。
HandlerInterceptor 接口:处理程序的执行链接口。

Spring MVC 框架模型

2.3 Spring Boo

2.3 Spring Boot MVC

以前 Spring MVC 开发模式是这样的:

1. 在 web.xml 配置 DispatcherServlet,用于截获并处理所有请求

2. 在 Spring MVC 配置文件中,声明预定义的控制器和视图解析器等

3. 编写预定义的处理请求控制器

4. 编写预定义的视图对象,比如 JSP、Freemarker 等

在 Spring Boot MVC 中,Web 自动化配置会帮你减少上面的两个步骤。默认使用的视图是 ThymeLeaf,在下面小节会具体讲

1. 编写预定义的处理请求控制器

2. 编写默认 ThymeLeaf 视图对象

例如下面会展示用户列表案例:

第一步:处理用户请求控制器

UserController.java

/**
 * 用户控制层
 *
 * Created by bysocket on 24/07/2017.
 */
@Controller
@RequestMapping(value = "/users")  // 通过这里配置使下面的映射都在 /users
public class UserController {
 @Autowired
 UserService userService;   // 用户服务层
 /**
  * 获取用户列表
  * 处理 "/users" 的GET请求,用来获取用户列表
  * 通过 @RequestParam 传递参数,进一步实现条件查询或者分页查询
  */
 @RequestMapping(method = RequestMethod.GET)
 public String getUserList(ModelMap map) {
  map.addAttribute("userList", userService.findAll());
  return "userList";
 }
}
 @Controller 注解在 UserController 类上,标识其为一个可接收 HTTP 请求的控制器
@RequestMapping(value = “/users”) 注解 ,标识 UserController 类下所有接收的请求路由都是 /users 开头的。注意:类上的 @RequestMapping 注解是不必需的
@RequestMapping(method = RequestMethod.GET) 注解,标识该 getUserList(ModelMap map) 方法会接收并处理 /users 请求,且请求方法是 GET
getUserList(ModelMap map) 方法返回的字符串 userList ,代表着是视图,会有视图解析器解析成为一个具体的视图对象,然后经过视图渲染展示到浏览器

第二步:用户列表 ThymeLeaf 视图对象

<!DOCTYPE html>
<html lang="zh-CN">
 <head>
  <script type="text/javascript" th:src="@{https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js}"></script>
  <link th:href="@{https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css}" rel="external nofollow" rel="stylesheet"/>
  <link th:href="@{/css/default.css}" rel="external nofollow" rel="stylesheet"/>
  <link rel="icon" th:href="@{/images/favicon.ico}" rel="external nofollow" type="image/x-icon"/>
  <meta charset="UTF-8"/>
  <title>用户列表</title>
 </head>
 <body>
  <div class="contentDiv">
   <h5> 《 Spring Boot 2.x 核心技术实战》第二章快速入门案例</h5>
   <table class="table table-hover table-condensed">
    <legend>
     <strong>用户列表</strong>
    </legend>
    <thead>
     <tr>
      <th>用户编号</th>
      <th>名称</th>
      <th>年龄</th>
      <th>出生时间</th>
      <th>管理</th>
     </tr>
    </thead>
    <tbody>
     <tr th:each="user : ${userList}">
      <th scope="row" th:text="${user.id}"></th>
      <td><a th:href="@{/users/update/{userId}(userId=${user.id})}" rel="external nofollow" th:text="${user.name}"></a></td>
      <td th:text="${user.age}"></td>
      <td th:text="${user.birthday}"></td>
      <td><a class="btn btn-danger" th:href="@{/users/delete/{userId}(userId=${user.id})}" rel="external nofollow" >删除</a></td>
     </tr>
    </tbody>
   </table>
   <div><a class="btn btn-primary" href="/users/create" rel="external nofollow" role="button">创建用户</a></div>
  </div>
 </body>
</html>

一个 table 展示用户列表,引入了 jquery.min.js 和 bootstrap.min.css ,更好的展示页面效果。具体 ThymeLeaf 语法下面会讲到。

代码共享在:https://github.com/JeffLi1993/spring-boot-core-book-demo

2.3.1 控制器

什么是控制器?控制器就是控制请求接收和负责响应到视图的角色。

@Controller 注解标识一个类作为控制器。DispatcherServlet 会扫描所有控制器类,并检测 @RequestMapping 注解配置的方法。Web 自动化配置已经处理完这一步骤。

@RequestMapping 注解标识请求 URL 信息,可以映射到整个类或某个特定的方法上。该注解可以表明请求需要的。

使用 value 指定特定的 URL ,比如 @RequestMapping(value = “/users”) 和 @RequestMapping(value = “/users/create”) 等

使用 method 指定 HTTP 请求方法,比如 RequestMethod.GET 等

还有使用其他特定的参数条件,可以设置 consumes 指定请求时的请求头需要包含的 Content-Type 值、设置 produces 可确保响应的内容类型

MVC on REST ful 场景

在 HTTP over JSON (自然 JSON、XML或其他自定义的媒体类型内容等均可)场景,配合上前后端分离的开发模式,我们经常会用 @ResponseBody 或 @RestController 两种方式实现 RESTful HTTP API 。

老方式:

@ResponseBody 注解标识该方法的返回值。这样被标注的方法返回值,会直接写入 HTTP 响应体(而不会被视图解析器认为是一个视图对象)。

新方式:

@RestController 注解,和 @Controller 用法一致,整合了 @Controller 和 @ResponseBody 功能。这样不需要每个 @RequestMapping 方法上都加上 @ResponseBody 注解,这样代码更简明。

使代码更简明,还有常用便捷注解 @GetMapping、@PostMapping 和 @PutMapping 等

HTTP 协议相关知识回顾,可以看看我以前的博文《图解 HTTP 协议》http://www.bysocket.com/?p=282

2.3.2 数据绑定

数据绑定,简单的说就是 Spring MVC 从请求中获取请求入参,赋予给处理方法相应的入参。主要流程如下:

1. DataBinder 接受带有请求入参的 ServletRequest 对象

2. 调用 ConversionService 组件,进行数据类型转换、数据格式化等工作

3. 然后调用 Validator 组件,进行数据校验等工作

4. 绑定结果到 BindingResult 对象

5. 最后赋予给处理方法相应的入参

@ModelAttribute 注解添加一个或多个属性(类对象)到 model 上。例如

 @RequestMapping(value = "/create", method = RequestMethod.POST)
 public String postUser(@ModelAttribute User user)

@PathVariable 注解通过变量名匹配到 URI 模板中相对应的变量。例如

 @RequestMapping(value = "/update/{id}", method = RequestMethod.GET)
 public String getUser(@PathVariable("id") Long id, ModelMap map)

@RequestParam 注解将请求参数绑定到方法参数。

@RequestHeader 注解将请求头属性绑定到方法参数。

2.3.3 视图和视图解析

视图的职责就是渲染模型数据,将模型里面的数据展示给用户。

请求到经过处理方法处理后,最终返回的是 ModeAndView 。可以从 Spring MVC 框架模型 看出,最终经过 ViewResolver 视频解析器得到视图对象 View。可能是我们常见的 JSP ,也可能是基于 ThymLeaf 、FreeMarker 或 Velocity 模板引擎视图,当然还有可能是 JSON 、XML 或者 PDF 等各种形式。

业界流行的模板引擎有如下的 Starters 支持:

spring-boot-starter-thymeleaf Thymeleaf 模板视图依赖,官方推荐

spring-boot-starter-freemarker Freemarker 模板视图依赖

spring-boot-starter-groovy-templates Groovy 模板视图依赖

spring-boot-starter-mustache Mustache 模板视图依赖

具体,spring-boot-starter-thymeleaf 使用案例在 GitHub :https://github.com/JeffLi1993/spring-boot-core-book-demo 的 chapter-2-spring-boot-quick-start 工程。

三、小结

本文主要介绍了 Spring Boot 在 Web 开发中涉及到的 HTTP 协议,还有一些 Spring MVC 相关的知识。

推荐:

开源项目 springboot-learning-example https://github.com/JeffLi1993/springboot-learning-example

开源项目 spring-boot-core-book-demo https://github.com/JeffLi1993/spring-boot-core-book-demo

总结

以上所述是小编给大家介绍的Spring Boot Web 开发注解篇,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 详解Spring Boot Web项目之参数绑定

    一.@RequestParam 这个注解用来绑定单个请求数据,既可以是url中的参数,也可以是表单提交的参数和上传的文件 它有三个属性,value用于设置参数名,defaultValue用于对参数设置默认值,required为true时,如果参数为空,会报错 好,下面展示具体例子: 首先是vm: <h1>param1:${param1}</h1> <h1>param2:${param2}</h1> 好吧,就为了展示两个参数 第一种情况: @RequestMa

  • Spring Boot 整合 Mybatis Annotation 注解的完整 Web 案例

    前言 距离第一篇 Spring Boot 系列的博文 3 个月了.虽然 XML 形式是我比较推荐的,但是注解形式也是方便的.尤其一些小系统,快速的 CRUD 轻量级的系统. 这里感谢晓春 http://xchunzhao.tk/ 的 Pull Request,提供了 springboot-mybatis-annotation 的实现. 一.运行 springboot-mybatis-annotation 工程 然后Application 应用启动类的 main 函数,然后在浏览器访问: http

  • SpringBoot webSocket实现发送广播、点对点消息和Android接收

    1.SpringBoot webSocket SpringBoot 使用的websocket 协议,不是标准的websocket协议,使用的是名称叫做STOMP的协议. 1.1 STOMP协议说明 STOMP,Streaming Text Orientated Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议. 它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消

  • 详解在Spring Boot框架下使用WebSocket实现消息推送

    spring Boot的学习持续进行中.前面两篇博客我们介绍了如何使用Spring Boot容器搭建Web项目以及怎样为我们的Project添加HTTPS的支持,在这两篇文章的基础上,我们今天来看看如何在Spring Boot中使用WebSocket. 什么是WebSocket WebSocket为浏览器和服务器之间提供了双工异步通信功能,也就是说我们可以利用浏览器给服务器发送消息,服务器也可以给浏览器发送消息,目前主流浏览器的主流版本对WebSocket的支持都算是比较好的,但是在实际开发中使

  • 基于SpringBoot与Mybatis实现SpringMVC Web项目

    一.热身 一个现实的场景是:当我们开发一个Web工程时,架构师和开发工程师可能更关心项目技术结构上的设计.而几乎所有结构良好的软件(项目)都使用了分层设计.分层设计是将项目按技术职能分为几个内聚的部分,从而将技术或接口的实现细节隐藏起来. 从另一个角度上来看,结构上的分层往往也能促进了技术人员的分工,可以使开发人员更专注于某一层业务与功能的实现,比如前端工程师只关心页面的展示与交互效果(例如专注于HTML,JS等),而后端工程师只关心数据和业务逻辑的处理(专注于Java,Mysql等).两者之间

  • Spring Boot Web 开发注解篇

    一.spring-boot-starter-web 依赖概述 在 Spring Boot 快速入门中,只要在 pom.xml 加入了 spring-boot-starter-web 依赖,即可快速开发 web 应用.可见,Spring Boot 极大地简化了 Spring 应用从搭建到开发的过程,做到了「开箱即用」的方式.Spring Boot 已经提供很多「开箱即用」的依赖,如上面开发 web 应用使用的 spring-boot-starter-web ,都是以 spring-boot-sta

  • Spring Boot 表单验证篇

    一. spring-boot-starter-validation 依赖概述 上一篇 <Spring Boot Web 开发注解篇>,就可以快速地进行 Web 开发.那么在表单提交的时候,我们需要进行验证.前端验证可以挡住 99% 的小白用户,这里要实现服务端验证. Starters 机制告诉我们,只要加入 spring-boot-starter-validation 这个 Starter ,就可以使用其实现验证.那什么是 spring-boot-starter-validation? spr

  • spring boot(一)之入门篇

    本文给大家介绍构建微服务:Spring boot 入门篇,具体内容详情如下所示: 什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.用我的话来理解,就是spring boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架(不知道这样比喻是否合

  • 详解Spring boot+CXF开发WebService Demo

    最近工作中需要用到webservice,而且结合spring boot进行开发,参照了一些网上的资料,配置过程中出现的了一些问题,于是写了这篇博客,记录一下我这次spring boot+cxf开发的webservice的配置过程,仅供参考. 一.本次开发除了用到spring boot基础jar包外,还用到了cxf相关jar包: <!-- cxf支持 --> <dependency> <groupId>org.apache.cxf</groupId> <

  • spring boot 的常用注解使用小结

    @RestController和@RequestMapping注解 4.0重要的一个新的改进是@RestController注解,它继承自@Controller注解.4.0之前的版本,Spring MVC的组件都使用@Controller来标识当前类是一个控制器servlet.使用这个特性,我们可以开发REST服务的时候不需要使用@Controller而专门的@RestController. 当你实现一个RESTful web services的时候,response将一直通过response

  • Spring Boot Web 静态文件缓存处理的方法

    采用Spring Boot + Freemarker开发Web项目时,由于一些静态文件比较大,如果是在PC上访问影响不大,当在手机上访问时,特别是用流量访问时速度会慢很多,而且很耗流量. 通过对请求进行抓包,可以发现每次进入一个页面都需要加载静态文件,如果不差钱的公司可以将静态文件放在CDN上来加快访问速度,或者用Nginx来做静态文件的缓存. 今天给大家介绍一种其他的缓存优化方式,通过Spring的缓存机制来缓存静态文件,在Spring Boot中配置静态文件缓存只需要在配置文件中加入下面的配

  • Spring Boot应用开发初探与实例讲解

    Spring Boot是由Pivotal团队提供的全新Spring开发框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. 从它的名字可以看出,Spring Boot 的作用在于创建和启动新的基于 Spring 框架的项目. 它的目的是帮助开发人员很容易的创建出独立运行和产品级别的基于 Spring 框架的应用. 它包含的特性如下: 应用独立运行,对于Web应用直接嵌入应用服务器(Tomcat or Jetty) 根据项目的依赖(Maven or Gradle中定义的依赖)自动配

  • Spring Boot web项目的TDD流程

    目录 概述 1 技术工具 2 构建Spring Boot工程 3 开始编写测试和代码 1 Controller 2 Service 3 Repository 4 总结 概述 测试驱动开发可以分为三个周期,周而复始,红灯-绿灯-重构.由以下几个步骤构成: 编写测试 运行所有测试 编写代码 运行所有测试 重构 运行所有测试 一开始编写测试,肯定通不过,红灯状态,进行代码编写,然后运行测试,测试通不过,测试通过,即变成绿灯. 测试不通过,或者需要重构代码,再次运行所有测试代码... 接下来通过一个简单

  • spring boot使用@Async注解解决异步多线程入库的问题

    目录 前言 项目实况介绍 第一种方式 第二种方式 这里有个坑! 这里有两个坑! 总结 前言 在开发过程中,我们会遇到很多使用线程池的业务场景,例如定时任务使用的就是ScheduledThreadPoolExecutor.而有些时候使用线程池的场景就是会将一些可以进行异步操作的业务放在线程池中去完成,例如在生成订单的时候给用户发送短信,生成订单的结果不应该被发送短信的成功与否所左右,也就是说生成订单这个主操作是不依赖于发送短信这个操作,所以我们就可以把发送短信这个操作置为异步操作.而要想完成异步操

  • Spring Boot中自定义注解结合AOP实现主备库切换问题

    摘要:本篇文章的场景是做调度中心和监控中心时的需求,后端使用TDDL实现分表分库,需求:实现关键业务的查询监控,当用Mybatis查询数据时需要从主库切换到备库或者直接连到备库上查询,从而减小主库的压力,在本篇文章中主要记录在Spring Boot中通过自定义注解结合AOP实现直接连接备库查询. 一.通过AOP 自定义注解实现主库到备库的切换 1.1 自定义注解 自定义注解如下代码所示 import java.lang.annotation.ElementType; import java.la

随机推荐