当前位置: 移动技术网 > IT编程>开发语言>Java > Spring Boot Web 开发注解篇

Spring Boot Web 开发注解篇

2019年07月19日  | 移动技术网IT编程  | 我要评论

一、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 协议》

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 开发注解篇,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网