使用SpringBoot编写Restful风格接口

一、简介

    Restful是一种对url进行规范的编码风格,通常一个网址对应一个资源,访问形式类似http://xxx.com/xx/{id}/{id}。

    举个栗子,当我们在某购物网站上买手机时会有很多品牌选择,而每种品牌下又有很多型号,那么https://mall.com/mobile/iphone/6 代表了Iphone6,https://mall.com/mobile/iphone/7和https://mall.com/mobile/iphone/8分别代表了Iphone7和Iphone8。

    SpringBoot内置了SpringMvc中,也提供了@RequestParam, @RequestBody和@PathVariable 三个注解获取客户端参数,其中前两者获取的是客户端post提交的参数,而@PathVariable 则是从访问url中获取参数。
    言归正传,下面我们以用户管理系统为例,在SpringBoot中编写一组Restful风格的接口吧。

二、开发环境

  • IDE:IntelliJ IDEA
  • 官网地址:https://www.jetbrains.com/idea/download/
  • JDK:1.8
  • 数据库:MySQL
  • 构建工具:Maven

三、编写自己的Restful程序

1.创建SpringBoot项目,如下图所示:

点击Next,选择一些基本项目参数,如下图:



点击Next,选择我们需要的组件,这里我们选择MySQL,JPA,WEB组件作为我们开发组件。如下图所示:



点击Finish即完成项目的创建,项目结构如下图:


2.项目依赖Maven配置pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.forMelo</groupId>
	<artifactId>myrestfulproject</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<name>myrestfulproject</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<!--<scope>provided</scope>-->
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>
3.数据源、JPA配置

SpringBoot默认配置文件为application.properties,我们将其修改为application.yml格式,.yml属性文件层次感和可读性更强。application.yml具体配置如下:

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
    driverClassName: com.mysql.jdbc.Driver
    username: root
    password: 1
  jpa:
    database: MySQL
    show-sql: true
    hibernate:
      ddl-auto: update
      naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy

下面我们在mysql中创建test数据库,使用SQLyog创建表t_user_info,如下图所示:


4.编写控制器UserController.java和实体类User.java

UserController.java

package com.formelo.controller;

import com.formelo.entity.User;
import com.formelo.repository.UserJPARepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * Created by songqiuming on 2018/1/7.
 */
@RestController
public class UserController {

    @Autowired
    private UserJPARepository userJPARepository;

    /**
     * 查询用户列表
     * @return
     */
    @GetMapping(value = "/user")
    public List<User> findUserList(){
        return userJPARepository.findAll();
    }

    /**
     * 根据Id查询一个用户
     * @param id
     * @return
     */
    @GetMapping(value = "/user/query/{id}")
    public User findUserOne(@PathVariable("id") Integer id){
        return userJPARepository.findOne(id);
    }

    /**
     * 添加用户
     * @param name
     * @param age
     * @param country
     * @return
     */

    @PostMapping(value = "/user")
    public User addUser(@RequestParam("name") String name, @RequestParam("age") int age,
                        @RequestParam("country") String country){
        User user = new User();
        user.setName(name);
        user.setAge(age);
        user.setCountry(country);
        return userJPARepository.save(user);
    }

    /**
     * 删除用户
     * @param id  用户编号
     * @return
     */
    @DeleteMapping(value = "/user/{id}")
    public  List<User> deleteUser(@PathVariable("id") Integer id){
        userJPARepository.delete(id);
        return userJPARepository.findAll();
    }

    /**
     * 更新用户
     * @param id
     * @param name
     * @param age
     * @param country
     * @return
     */
    @PutMapping(value = "/user/{id}")
    public User updateUser(@PathVariable("id") Integer id, @RequestParam("name") String name,
                           @RequestParam("age") int age, @RequestParam("country") String country){
        User user = userJPARepository.findById(id);
        user.setName(name);
        user.setAge(age);
        user.setCountry(country);
        return userJPARepository.save(user);
    }

    /**
     * 根据国家查询用户
     * @param country
     * @return
     */
    @GetMapping(value = "/user/{country}")
    public List<User> findByCountry(@PathVariable("country") String country){
        return userJPARepository.findByCountry(country);
    }

}


User.java

package com.formelo.entity;

import javax.persistence.*;

/**
 * Created by songqiuming on 2018/1/7.
 */
@Entity
@Table(name = "t_user_info")
public class User {

    private static final long serialVersionUID = -3039703447657705408L;

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name="age")
    private int age;
    @Column(name="country")
    private String country;

    public User() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", country='" + country + '\'' +
                '}';
    }
}
5.创建JPA 

创建UserJPARepository.java,它继承SpringDataJPA内的JpaRepository接口,实现与数据库的交互。

UserJPARepository.java

package com.formelo.repository;

import com.formelo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

/**
 * Created by songqiuming on 2018/1/7.
 */
public interface UserJPARepository extends JpaRepository<User,Long> {
    User findById(Long id);
    List<User> findByCountry(String country);
}
6.启动项目

到处为止,我们已经完成一组restful风格接口的编码,运行MyrestfulprojectApplication的main方法,启动项目,控制台输出:

"C:\Program Files\Java\jdk1.8.0_102\bin\java" ...
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.9.RELEASE)

2018-01-09 21:57:41.533  INFO 6884 --- [           main] com.formelo.MyrestfulprojectApplication  : Starting MyrestfulprojectApplication on DESKTOP-6SJA93T with PID 6884 (D:\myproject\myrestfulproject\target\classes started by songqiuming in D:\myproject\myrestfulproject)
2018-01-09 21:57:41.560  INFO 6884 --- [           main] com.formelo.MyrestfulprojectApplication  : No active profile set, falling back to default profiles: default
2018-01-09 21:57:41.763  INFO 6884 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@65466a6a: startup date [Tue Jan 09 21:57:41 CST 2018]; root of context hierarchy
2018-01-09 21:57:47.897  INFO 6884 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2018-01-09 21:57:47.969  INFO 6884 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2018-01-09 21:57:47.972  INFO 6884 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.23
2018-01-09 21:57:48.358  INFO 6884 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2018-01-09 21:57:48.359  INFO 6884 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 6609 ms
2018-01-09 21:57:48.663  INFO 6884 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2018-01-09 21:57:48.669  INFO 6884 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2018-01-09 21:57:48.670  INFO 6884 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-01-09 21:57:48.670  INFO 6884 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2018-01-09 21:57:48.670  INFO 6884 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2018-01-09 21:57:49.598  INFO 6884 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
2018-01-09 21:57:49.656  INFO 6884 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
	name: default
	...]
2018-01-09 21:57:49.817  INFO 6884 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.0.12.Final}
2018-01-09 21:57:49.819  INFO 6884 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2018-01-09 21:57:49.820  INFO 6884 --- [           main] org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist
2018-01-09 21:57:49.976  INFO 6884 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
Tue Jan 09 21:57:50 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:50 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:50 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:50 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:50 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:51 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:51 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:51 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:51 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
Tue Jan 09 21:57:51 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
2018-01-09 21:57:51.225  INFO 6884 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
2018-01-09 21:57:52.092  INFO 6884 --- [           main] org.hibernate.tool.hbm2ddl.SchemaUpdate  : HHH000228: Running hbm2ddl schema update
2018-01-09 21:57:52.229  INFO 6884 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2018-01-09 21:57:53.483  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@65466a6a: startup date [Tue Jan 09 21:57:41 CST 2018]; root of context hierarchy
2018-01-09 21:57:53.666  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user],methods=[POST]}" onto public com.formelo.entity.User com.formelo.controller.UserController.addUser(java.lang.String,int,java.lang.String)
2018-01-09 21:57:53.667  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user/{country}],methods=[GET]}" onto public java.util.List<com.formelo.entity.User> com.formelo.controller.UserController.findByCountry(java.lang.String)
2018-01-09 21:57:53.669  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user/{id}],methods=[DELETE]}" onto public java.util.List<com.formelo.entity.User> com.formelo.controller.UserController.deleteUser(java.lang.Long)
2018-01-09 21:57:53.669  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user/{id}],methods=[GET]}" onto public com.formelo.entity.User com.formelo.controller.UserController.findUserOne(java.lang.Long)
2018-01-09 21:57:53.670  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user/{id}],methods=[PUT]}" onto public com.formelo.entity.User com.formelo.controller.UserController.updateUser(java.lang.Long,java.lang.String,int,java.lang.String)
2018-01-09 21:57:53.670  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/user],methods=[GET]}" onto public java.util.List<com.formelo.entity.User> com.formelo.controller.UserController.findUserList()
2018-01-09 21:57:53.673  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2018-01-09 21:57:53.674  INFO 6884 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2018-01-09 21:57:53.761  INFO 6884 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-01-09 21:57:53.762  INFO 6884 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-01-09 21:57:53.945  INFO 6884 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-01-09 21:57:54.419  INFO 6884 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-01-09 21:57:54.520  INFO 6884 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2018-01-09 21:57:54.525  INFO 6884 --- [           main] com.formelo.MyrestfulprojectApplication  : Started MyrestfulprojectApplication in 14.573 seconds (JVM running for 16.939)
7.接口测试

下面我们打开postman测试接口。首先,往数据库里插入几条数据,对应的请求如下:

  • 查询用户列表:



  • 根据ID查询一个用户:



  • 添加用户:




  • 更新用户:



  • 删除用户:



从上图可以看到,删除id=6的记录后,会自动读取用户列表。


  • 根据国家查询用户:

















  • 15
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
好的,下面是使用Spring Boot编写留言本的步骤: 1. 创建Spring Boot项目 首先,我们需要在IDE创建一个新的Spring Boot项目。可以使用Spring Initializr来创建项目,也可以手动创建项目。 2. 添加依赖 在项目的pom.xml文件添加以下依赖: ``` <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> </dependencies> ``` 这些依赖将启用Spring Boot的Web支持、JPA支持和H2数据库。 3. 创建实体类 我们需要创建一个实体类来表示留言。在本例,我们将创建一个名为Message的实体类: ``` @Entity public class Message { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String content; private LocalDateTime createdTime; // getters and setters } ``` 这个实体类使用了JPA注解,表明它是一个实体,并且有一个自动生成的id属性、一个留言内容属性和一个创建时间属性。 4. 创建Repository 我们需要创建一个Repository来处理对留言的数据库操作。在本例,我们将创建一个名为MessageRepository的接口: ``` public interface MessageRepository extends JpaRepository<Message, Long> { } ``` 这个接口继承自JpaRepository,提供了许多默认的CRUD操作。 5. 创建Controller 我们需要创建一个Controller来处理来自客户端的请求。在本例,我们将创建一个名为MessageController的类: ``` @RestController @RequestMapping("/messages") public class MessageController { @Autowired private MessageRepository messageRepository; @GetMapping public List<Message> getAllMessages() { return messageRepository.findAll(); } @PostMapping public Message addMessage(@RequestBody String content) { Message message = new Message(); message.setContent(content); message.setCreatedTime(LocalDateTime.now()); return messageRepository.save(message); } } ``` 这个Controller使用了@RestController注解,表明它是一个Restful风格的Controller,并且处理来自客户端的请求。 getAllMessages()方法处理GET请求,返回所有留言。 addMessage()方法处理POST请求,创建一个新的留言并将其保存到数据库。 6. 启动应用程序 最后,我们可以启动应用程序并测试它。我们可以使用Postman或其他HTTP客户端来测试getAllMessages()和addMessage()方法。 在浏览器访问http://localhost:8080/messages,将会返回所有留言的JSON格式。 在HTTP客户端向http://localhost:8080/messages发送POST请求,并在请求体添加留言内容,将会创建一个新的留言并将其保存到数据库。 这就是使用Spring Boot编写留言本的全部步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值