使用Spring Boot和MongoDB创建REST API

Spring Boot是一个自以为是的框架,可简化Spring应用程序的开发。 它使我们摆脱了复杂配置文件的束缚,并帮助我们创建了不需要外部servlet容器的独立Spring应用程序。

这听起来实在令人难以置信,但Spring Boot确实可以完成所有这一切

这篇博客文章演示了实现REST API多么容易,该API为保存到MongoDB数据库中的待办事项提供CRUD操作。

让我们开始创建我们的Maven项目。

注意:这篇博客文章假定您已经安装了MongoDB数据库。 如果尚未执行此操作,则可以按照博客文章中的说明进行操作: 使用MongoDB访问数据 。

创建我们的Maven项目

我们可以按照以下步骤创建Maven项目:

  1. 使用spring-boot-starter-parent POM作为我们的Maven项目的父POM。 这可以确保我们的项目从Spring Boot继承合理的默认设置。
  2. 将Spring Boot Maven插件添加到我们的项目中。 这个插件使我们可以将应用程序打包到可执行的jar文件中,将其打包到war存档中,然后运行该应用程序。
  3. 配置我们项目的依赖项。 我们需要配置以下依赖项:
    • spring-boot-starter-web依赖关系提供了Web应用程序的依赖关系。
    • spring-data-mongodb依赖项提供了与MongoDB文档数据库的集成。
  4. 启用S​​pring Boot的Java 8支持。
  5. 配置我们的应用程序的主类。 此类负责配置和启动我们的应用程序。

pom.xml文件的相关部分如下所示:

<properties><!-- Enable Java 8 --><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- Configure the main class of our Spring Boot application --><start-class>com.javaadvent.bootrest.TodoAppConfig</start-class>
</properties><!-- Inherit defaults from Spring Boot -->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.1.9.RELEASE</version>
</parent><dependencies><!-- Get the dependencies of a web application --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Data MongoDB--><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-mongodb</artifactId></dependency>
</dependencies><build><plugins><!-- Spring Boot Maven Support --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

补充阅读:

  • Spring Boot参考手册:9.1.1 Maven安装
  • Spring Boot参考手册:12.1 Maven
  • Spring Boot Maven插件–用法

让我们继续前进,了解如何配置应用程序。

配置我们的应用

我们可以按照以下步骤配置Spring Boot应用程序:

  1. 创建一个com.javaadvent.bootrest包TodoAppConfig类。
  2. 启用S​​pring Boot自动配置。
  3. 配置Spring容器以扫描从com.javaadvent.bootrest包的子包中找到的组件。
  4. main()方法添加到TodoAppConfig类,并通过运行我们的应用程序来实现。

TodoAppConfig类的源代码如下所示:

package com.javaadvent.bootrest;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableAutoConfiguration
@ComponentScan
public class TodoAppConfig {public static void main(String[] args) {SpringApplication.run(TodoAppConfig.class, args);}
}

现在,我们已经创建了配置类,用于配置和运行我们的Spring Boot应用程序。 由于从类路径中找到了MongoDB jar,因此Spring Boot使用其默认设置来配置MongoDB连接。

补充阅读:

  • Spring Boot参考手册:13.2定位主应用程序类
  • Spring Boot参考手册:14.配置类
  • @EnableAutoConfiguration批注的Javadoc
  • Spring Boot参考手册:15.自动配置
  • SpringApplication类的Javadoc
  • Spring Boot参考手册:27.2.1连接到MongoDB数据库

让我们继续并实现我们的REST API。

实施我们的REST API

我们需要实现一个REST API,为待办事项提供CRUD操作。 我们的REST API的要求是:

  • 发送到URL'/ api / todo'的POST请求必须使用从请求正文中找到的信息来创建新的todo条目,并返回创建的todo条目的信息。
  • 发送到网址“ / api / todo / {id}”的DELETE请求必须删除从网址中找到ID的待办事项,并返回已删除的待办事项的信息。
  • 发送到URL'/ api / todo'的GET请求必须返回从数据库中找到的所有todo条目。
  • 发送到URL'/ api / todo / {id}'的GET请求必须返回其id从URL中找到的todo条目的信息。
  • 发送到url'/ api / todo / {id}'的PUT请求必须使用从请求正文中找到的信息来更新现有待办事项的信息,并返回更新后的待办事项的信息。

我们可以通过执行以下步骤来满足这些要求:

  1. 创建包含单个待办事项条目信息的实体。
  2. 创建用于将待办事项保存到MongoDB数据库并从中查找待办事项的存储库。
  3. 创建负责将DTO映射到域对象,反之亦然的服务层。 服务层的目的是将域模型与Web层隔离。
  4. 创建用于处理HTTP请求并将正确的响应返回给客户端的控制器类。

注意:此示例非常简单,我们可以将存储库注入到控制器中。 但是,由于在实现实际应用程序时这不是可行的策略,因此我们将在Web层和存储库层之间添加一个服务层。

让我们开始吧。

创建实体

我们需要创建包含单个待办事项条目信息的实体类。 我们可以按照以下步骤进行操作:

  1. iddescriptiontitle字段添加到创建的实体类中。 通过使用@Id注释对id字段进行注释来配置实体的id字段。
  2. 指定常量( MAX_LENGTH_DESCRIPTIONMAX_LENGTH_TITLE ),这些常量指定描述标题字段的最大长度。
  3. 将静态生成器类添加到实体类。 此类用于创建新的Todo对象。
  4. 向实体类添加一个update()方法。 如果给定有效值作为方法参数,则此方法仅更新实体的标题说明

Todo类的源代码如下所示:

import org.springframework.data.annotation.Id;import static com.javaadvent.bootrest.util.PreCondition.isTrue;
import static com.javaadvent.bootrest.util.PreCondition.notEmpty;
import static com.javaadvent.bootrest.util.PreCondition.notNull;final class Todo {static final int MAX_LENGTH_DESCRIPTION = 500;static final int MAX_LENGTH_TITLE = 100;@Idprivate String id;private String description;private String title;public Todo() {}private Todo(Builder builder) {this.description = builder.description;this.title = builder.title;}static Builder getBuilder() {return new Builder();}//Other getters are omittedpublic void update(String title, String description) {checkTitleAndDescription(title, description);this.title = title;this.description = description;}/*** We don't have to use the builder pattern here because the constructed * class has only two String fields. However, I use the builder pattern * in this example because it makes the code a bit easier to read.*/static class Builder {private String description;private String title;private Builder() {}Builder description(String description) {this.description = description;return this;}Builder title(String title) {this.title = title;return this;}Todo build() {Todo build = new Todo(this);build.checkTitleAndDescription(build.getTitle(), build.getDescription());return build;}}private void checkTitleAndDescription(String title, String description) {notNull(title, "Title cannot be null");notEmpty(title, "Title cannot be empty");isTrue(title.length() <= MAX_LENGTH_TITLE,"Title cannot be longer than %d characters",MAX_LENGTH_TITLE);if (description != null) {isTrue(description.length() <= MAX_LENGTH_DESCRIPTION,"Description cannot be longer than %d characters",MAX_LENGTH_DESCRIPTION);}}
}

补充阅读:

  • 第2项:面对许多构造函数参数时,请考虑构造器

让我们继续并创建与MongoDB数据库通信的存储库。

创建存储库

我们必须创建存储库接口,该接口用于将Todo对象保存到MondoDB数据库并从中检索Todo对象。

如果我们不想使用Java 8对Spring Data的支持,则可以通过创建扩展CrudRepository <T,ID>接口的接口来创建存储库。 但是,由于我们要使用Java 8支持,因此必须遵循以下步骤:

  1. 创建一个扩展Repository <T,ID>接口的接口。
  2. 将以下存储库方法添加到创建的接口:
    1. void delete(删除Todo的方法)删除作为方法参数给出的todo条目。
    2. List <Todo> findAll()方法返回从数据库中找到的所有待办事项条目。
    3. Optional <Todo> findOne(String id)方法返回单个待办事项的信息。 如果未找到待办事项,则此方法返回一个空的Optional
    4. Todo save(保存Todo的方法)将新的todo项保存到数据库中,并返回保存的todo项。

TodoRepository接口的源代码如下所示:

import org.springframework.data.repository.Repository;import java.util.List;
import java.util.Optional;interface TodoRepository extends Repository<Todo, String> {void delete(Todo deleted);List<Todo> findAll();Optional<Todo> findOne(String id);Todo save(Todo saved);
}

补充阅读:

  • CrudRepository <T,ID>接口的Javadoc
  • Repository <T,ID>接口的Javadoc
  • Spring Data MongoDB参考手册:5.使用Spring Data存储库
  • Spring Data MongoDB参考手册:5.3.1对存储库定义进行微调

让我们继续并创建示例应用程序的服务层。

创建服务层

首先 ,我们必须创建一个服务接口,为待办事项提供CRUD操作。 TodoService接口的源代码如下所示:

import java.util.List;interface TodoService {TodoDTO create(TodoDTO todo);TodoDTO delete(String id);List<TodoDTO> findAll();TodoDTO findById(String id);TodoDTO update(TodoDTO todo);
}

TodoDTO类是DTO,其中包含单个todo条目的信息。 在创建示例应用程序的Web层时,我们将详细讨论它。

其次 ,我们必须实现TodoService接口。 我们可以按照以下步骤进行操作:

  1. 通过使用构造函数注入将我们的​​存储库注入服务类。
  2. 私有Todo findTodoById(String id)方法添加到服务类,并通过返回找到的Todo对象或抛出TodoNotFoundException来实现它。
  3. 在服务类中添加一个私有TodoDTO convertToDTO(Todo model)方法,并通过将Todo对象转换为TodoDTO对象并返回创建的对象来实现该方法。
  4. 添加一个私有List <TodoDTO> convertToDTOs(List <Todo>模型)并通过将Todo对象的列表转换成TodoDTO对象的列表并返回创建的列表来实现它。
  5. 实现TodoDTO create(TodoDTO todo)方法。 此方法创建一个新的Todo对象,将创建的对象保存到MongoDB数据库,并返回创建的todo条目的信息。
  6. 实现TodoDTO delete(String id)方法。 此方法找到删除的Todo对象,将其删除,然后返回删除的Todo条目的信息。 如果未找到具有给定id的Todo对象,则此方法将抛出TodoNotFoundException
  7. 实现List <TodoDTO> findAll()方法。 此方法从数据库检索所有Todo对象,将它们转换为TodoDTO对象列表,然后返回创建的列表。
  8. 实现TodoDTO findById(String id)方法。 此方法从数据库中查找Todo对象,将其转换为TodoDTO对象,然后返回创建的TodoDTO对象。 如果未找到待办事项条目,则此方法将抛出TodoNotFoundException
  9. 实现TodoDTO update(TodoDTO todo)方法。 此方法从数据库中查找更新的Todo对象,更新其标题说明 ,保存并返回更新的信息。 如果未找到更新的Todo对象,则此方法将抛出TodoNotFoundException

MongoDBTodoService的源代码如下所示:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.Optional;import static java.util.stream.Collectors.toList;@Service
final class MongoDBTodoService implements TodoService {private final TodoRepository repository;@AutowiredMongoDBTodoService(TodoRepository repository) {this.repository = repository;}@Overridepublic TodoDTO create(TodoDTO todo) {Todo persisted = Todo.getBuilder().title(todo.getTitle()).description(todo.getDescription()).build();persisted = repository.save(persisted);return convertToDTO(persisted);}@Overridepublic TodoDTO delete(String id) {Todo deleted = findTodoById(id);repository.delete(deleted);return convertToDTO(deleted);}@Overridepublic List findAll() {List todoEntries = repository.findAll();return convertToDTOs(todoEntries);}private List convertToDTOs(List models) {return models.stream().map(this::convertToDTO).collect(toList());}@Overridepublic TodoDTO findById(String id) {Todo found = findTodoById(id);return convertToDTO(found);}@Overridepublic TodoDTO update(TodoDTO todo) {Todo updated = findTodoById(todo.getId());updated.update(todo.getTitle(), todo.getDescription());updated = repository.save(updated);return convertToDTO(updated);}private Todo findTodoById(String id) {Optional result = repository.findOne(id);return result.orElseThrow(() -> new TodoNotFoundException(id));}private TodoDTO convertToDTO(Todo model) {TodoDTO dto = new TodoDTO();dto.setId(model.getId());dto.setTitle(model.getTitle());dto.setDescription(model.getDescription());return dto;}
}

现在,我们已经创建了示例应用程序的服务层。 让我们继续创建控制器类。

创建控制器类

首先 ,我们需要创建DTO类,其中包含单个待办事项的信息,并指定用于确保仅将有效信息保存到数据库的验证规则。 TodoDTO类的源代码如下所示:

import org.hibernate.validator.constraints.NotEmpty;import javax.validation.constraints.Size;public final class TodoDTO {private String id;@Size(max = Todo.MAX_LENGTH_DESCRIPTION)private String description;@NotEmpty@Size(max = Todo.MAX_LENGTH_TITLE)private String title;//Constructor, getters, and setters are omitted
}

补充阅读:

  • Hibernate Validator 5.0.3参考手册

其次 ,我们必须创建控制器类来处理发送到我们的REST API的HTTP请求,并将正确的响应发送回客户端。 我们可以按照以下步骤进行操作:

  1. 使用构造函数注入将服务注入控制器。
  2. create()方法添加到我们的控制器并通过以下步骤实现它:
    1. 从请求正文中读取创建的待办事项条目的信息。
    2. 验证创建的待办事项条目的信息。
    3. 创建一个新的待办事项条目并返回创建的待办事项条目。 将响应状态设置为201。
  3. 通过将已删除的待办事项条目的ID委托给我们的服务来实现delete()方法,并返回已删除的待办事项条目。
  4. 通过从数据库中找到待办事项并返回找到的待办事项来实现findAll()方法。
  5. 通过从数据库中找到待办事项并返回找到的待办事项来实现findById()方法。
  6. 通过执行以下步骤来实现update()方法:
    1. 从请求正文中读取更新的待办事项条目的信息。
    2. 验证更新的待办事项条目的信息。
    3. 更新待办事项的信息,并返回更新后的待办事项。
  7. 创建一个@ExceptionHandler方法,如果未找到todo条目(抛出TodoNotFoundException ),则将响应状态设置为404。

TodoController类的源代码如下所示:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid;
import java.util.List;@RestController
@RequestMapping("/api/todo")
final class TodoController {private final TodoService service;@AutowiredTodoController(TodoService service) {this.service = service;}@RequestMapping(method = RequestMethod.POST)@ResponseStatus(HttpStatus.CREATED)TodoDTO create(@RequestBody @Valid TodoDTO todoEntry) {return service.create(todoEntry);}@RequestMapping(value = "{id}", method = RequestMethod.DELETE)TodoDTO delete(@PathVariable("id") String id) {return service.delete(id);}@RequestMapping(method = RequestMethod.GET)List<TodoDTO> findAll() {return service.findAll();}@RequestMapping(value = "{id}", method = RequestMethod.GET)TodoDTO findById(@PathVariable("id") String id) {return service.findById(id);}@RequestMapping(value = "{id}", method = RequestMethod.PUT)TodoDTO update(@RequestBody @Valid TodoDTO todoEntry) {return service.update(todoEntry);}@ExceptionHandler@ResponseStatus(HttpStatus.NOT_FOUND)public void handleTodoNotFound(TodoNotFoundException ex) {}
}

注意:如果验证失败,我们的REST API将验证错误作为JSON返回,并将响应状态设置为400。如果您想了解更多有关此信息,请阅读标题为: Spring从Trenches:将验证添加到REST API的博客文章。 。

这就对了。 现在,我们已经创建了一个REST API,它为待办事项提供CRUD操作并将其保存到MongoDB数据库中。 让我们总结一下我们从此博客文章中学到的知识。

摘要

这篇博客文章教会了我们三件事:

  • 我们可以通过仅声明两个依赖项来获得Maven所需的依赖项: spring-boot-starter-webspring-data-mongodb
  • 如果我们对Spring Boot的默认配置感到满意,则可以使用其自动配置支持并将新的jar“丢弃”到类路径中来配置Web应用程序。
  • 我们学习了如何创建一个简单的REST API,该API将信息保存到MongoDB数据库并从中查找信息。

您可以从Github获得此博客文章的示例应用程序 。

翻译自: https://www.javacodegeeks.com/2014/12/creating-a-rest-api-with-spring-boot-and-mongodb-2.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle用 odp.net 时出现 Oracle.DataAccess.Client.OracleConnection的类型初始值设定项引发异常 问题的解决...

在初次使用 Oracle 时&#xff0c;用ado.net连接数据&#xff0c;出现 “Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常 的提示&#xff1a; 解决方法&#xff1a;将对应版本的 OraOps11W.dll 拷到应用程序目录。 转载于:https://www.cnblogs.com/pp…

如何将Jersey集成到Spring MVC应用程序中

我最近开始使用Java为Podcastpedia.org和JAX-RS实现构建公共的REST API&#xff0c;我选择了Jersey &#xff0c;因为我发现它“自然”且功能强大-您可以通过遵循教程了解更多信息-带有Jersey和Spring的Java中的REST API设计和实现。 由于Podcastpedia.org是由Spring MVC支持的…

点击显示底框颜色,默认显示第一个。

页面初始化显示第一个底框颜色&#xff0c;点击另一个第一个底框颜色消失&#xff0c;被点击的底框颜色显示&#xff0c;以此循环。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional…

简单用于测试的listview的视图

http://www.iteye.com/topic/540423转载于:https://www.cnblogs.com/ct732003684/archive/2013/01/21/2869376.html

依赖注入–字段vs构造函数vs方法

嗨&#xff0c;今天&#xff0c;我想简单地讨论将依赖项注入您的类的不同方式。 通常&#xff0c;您有以下三种注射方法 直接进入字段/属性 通过显式的setter方法 通过显式的构造函数参数 现场注入 这种类型的注入为将所需的依赖项注入到类中提供了某种反射机制。 尽管这…

Java 8 Streams API作为友好的ForkJoinPool外观

我最喜欢Java 8的功能之一是流API。 最终&#xff0c;它消除了代码中的几乎所有循环&#xff0c;并使您可以编写更具表现力和重点的代码。 今天&#xff0c;我意识到它可以用于其他用途&#xff1a;作为ForkJoinPool一个不错的前端。 问题&#xff1a;执行器样板 假设我们要并…

(转)ZwQuerySystemInformation枚举内核模块及简单应用

http://hi.baidu.com/_achillis/item/8b33ead8ccac28ea3cc2cb17 简单说&#xff0c;即调用第11号功能&#xff0c;枚举一下内核中已加载的模块。部分代码如下&#xff1a;//功能号为11&#xff0c;先获取所需的缓冲区大小ZwQuerySystemInformation(SystemModuleInformation,NUL…

在三个Java IDE中生成的三种常见方法

在本文中&#xff0c;我研究了NetBeans 8.0.2 &#xff0c; IntelliJ IDEA 14.0.2和Eclipse Luna 4.4.1生成的三种“通用”方法[ equals&#xff08;Object&#xff09; &#xff0c; hashCode&#xff08;&#xff09;和toString&#xff08;&#xff09; ]的区别 。 。 目的不…

Angularjs总结(五)指令运用及常用控件的赋值操作

1、常用指令 1 <div ng-controller"jsyd-controller">2 <div style"float:left;width:100%; " ng-show"clickValue1登记">3 4 <div ng-include src"/partials/11.html"></div>5 6 </div&g…

linux截图软件

在Linux下很多软件使用命令就可以很好的操作&#xff0c;截图软件也不例外。刚好要截图使用一下&#xff0c;就找到了这款小巧的却很使用的Linux下的截图工具&#xff0c;就是scrot。 如何安装及使用? 1.安装篇很简单&#xff0c;想安装其他软件一样&#xff0c;Fedora下 yum …

Web开发的那点事--软件复用

CSDN博客不再经常更新&#xff0c;更多优质文章请来 粉丝联盟网 FansUnion.cn! (FansUnion) 复用的战场 1.前台 CSS,JavaScript/jquery/AJAX HTML/JSP 2.后台 增删改查 几乎一样。复用的级别 代码&#xff1a;一行代码或几行代码 函数&#xff1a;一个函数 类&#xff1a…

NodeJS学习笔记—1.CommonJS规范

由于现在web开发&#xff0c;越来越重视代码的复用和抽象的封装&#xff0c;为了解决代码的组织结构、管理、复用和部署等问题&#xff0c;现在普遍采用的机制是模块机制&#xff08;module&#xff09;。CommonJS约定桌面应用程序和服务器应用程序需要的API&#xff0c;如操作…

鼠标事件和键盘事件总结 及判断是不是数字方法

事件 Delegate 命名空间 数据的类 实现 鼠 标 事 件 "MouseHover" "MouseLeave" "MouseEnter" EventHandler System EventArgs 1、定义&#xff1a;"组件名"."事件名称" new System.EventHandl…

angularjs 利用filter进行表单查询及分页查询

页面&#xff1a; <div><input style"width:90%;margin-left:5px;margin-right:5px;" class"form-control sys_input" ng-model"imagePaths.filter.imageName" placeholder"查询..."/></div><div><!--<…

为什么现在是升级到Java 8的最佳时机

有兴趣了解如何通过AppDynamics充分利用Java 8的新功能吗&#xff1f; 立即开始免费试用 &#xff01; 今年3月&#xff0c;Oracle发布了近十年来最受期待的版本Java8。自发布以来&#xff0c;最新版本引起了越来越多的关注&#xff0c;各种规模的公司都渴望升级。 我们的合作…

requirejs与anjularjs框架

1.目录 2.首页login.html如下&#xff1a; <!DOCTYPE html><html> <head> <title>登录界面</title> <link relstylesheet href/stylesheets/style.css /> <link rel"stylesheet" href"/css/bootstrap.min.css">…

Qt基于TCP网络程序发包封包抽象

之前没经验, 发送数据包的时候, 包头包尾等信息都是通过重新定义一个结构体实现, 不同的协议包就有不同的结构体, 结果导致这样的现象: 有多少上层业务协议包, 我就分别重新定义一个对应的加上包头包尾的新的结构体, 很费劲.......额.... 现在, 重新想了下, 一个改进的方式, 把…

SQL学习笔记

可以把 SQL 分为两个部分&#xff1a;数据操作语言 (DML) 和 数据定义语言 (DDL)。 查询和更新指令构成了 SQL 的 DML 部分&#xff1a; SELECT - 从数据库表中获取数据UPDATE - 更新数据库表中的数据DELETE - 从数据库表中删除数据INSERT INTO - 向数据库表中插入数据SQL 的数…

Spring MVC 4快速入门Maven原型已改进

Spring Boot使Spring入门非常容易。 但是仍然有人对不使用Spring Boot并以更经典的方式引导应用程序感兴趣。 几年前&#xff0c;我创建了一个原型&#xff08;早于Spring Boot&#xff09;&#xff0c;简化了引导Spring Web应用程序的过程。 尽管Spring Boot已经上市了一段时间…

图片循环播放

使用 pageSwitch插件 多种效果 引入 jquery.js 和 pageSwitch.min.js <script src"js/jquery-1.11.0.min.js"></script> <script src"dist/pageSwitch.min.js"></script>在页面定义标签 <div id"container">…