RestFul风格是一种非常流行的架构风格,相关实战可以参考我的这篇博客:SSM框架之RestFul示例

论文可参考:https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

关于论文,我想说的是,程序员不要对英文产生恐惧感,现在的翻译工具多的多,当然了,多也代表一些杂碎的也不少,所以就需要我们学会如何甄别。

我英语也不好,不过我目前也在学会如何看英文文档,其实英文并没有那么可怕,相反,它还是很有趣的,毕竟我们天天对诸如Eclipse或IDEA这样的英文软件,而且还写着一大堆的英文代码,日子久了,自然都知道是什么意思了。

记得唐代有句古诗:熟读唐诗三百首,不会做诗也会吟。

对于天天敲着英文代码的我们而言,也是如此。每个人都有一个过程,过程周期有长有短。

在这里再闲扯一句,外国人的技术创新能力不容小觑,我们现在用的很多技术,都已经是人家用了好多年甚至已经过时了的,随着经济全球化越来越广越来越深,而且目前国内的培训机构和大学生研究生硕士博士等,如果不想被淘汰,必须要掌握强大学习能力。其中有一项就是英文要会。先不说会不会说,发音标不标准,至少要看的懂是什么意思吧。

总而言之,送我自己和大家一句话,循序渐进。

构建环境为:JDK8+MAVNE3以上+Eclipse

本示例参考Spring官方文档:https://spring.io/guides/gs/rest-service/

一、构建maven依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5.  
  6. <groupId>org.springframework</groupId>
  7. <artifactId>gs-rest-service</artifactId>
  8. <version>0.1.0</version>
  9.  
  10. <parent>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-parent</artifactId>
  13. <version>1.5.8.RELEASE</version>
  14. </parent>
  15.  
  16. <dependencies>
  17.  
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-web</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-test</artifactId>
  25. <scope>test</scope>
  26. </dependency>
  27. <dependency>
  28. <groupId>com.jayway.jsonpath</groupId>
  29. <artifactId>json-path</artifactId>
  30. <scope>test</scope>
  31. </dependency>
  32. </dependencies>
  33.  
  34. <properties>
  35. <java.version>1.8</java.version>
  36. </properties>
  37.  
  38. <build>
  39. <plugins>
  40. <plugin>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-maven-plugin</artifactId>
  43. </plugin>
  44. </plugins>
  45. </build>
  46.  
  47. <repositories>
  48. <repository>
  49. <id>spring-releases</id>
  50. <url>https://repo.spring.io/libs-release</url>
  51. </repository>
  52. </repositories>
  53. <pluginRepositories>
  54. <pluginRepository>
  55. <id>spring-releases</id>
  56. <url>https://repo.spring.io/libs-release</url>
  57. </pluginRepository>
  58. </pluginRepositories>
  59. </project>

二、构建实体

  1. package hello;
  2.  
  3. public class Greeting {
  4. private final long id;
  5. private final String content;
  6.  
  7. public Greeting(long id, String content) {
  8. this.id = id;
  9. this.content = content;
  10. }
  11.  
  12. public long getId() {
  13. return id;
  14. }
  15.  
  16. public String getContent() {
  17. return content;
  18. }
  19. }

三、构建Controller

  1. package hello;
  2.  
  3. import java.util.concurrent.atomic.AtomicLong;
  4.  
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestParam;
  7. import org.springframework.web.bind.annotation.RestController;
  8.  
  9. @RestController
  10. public class GreetingController {
  11. private static final String template = "Hello, %s!";
  12. private final AtomicLong counter = new AtomicLong();
  13.  
  14. @RequestMapping("/greeting")
  15. public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
  16. return new Greeting(counter.incrementAndGet(),
  17. String.format(template, name));
  18. }
  19. }

关于RestController和Controller存在什么不同,主要是RestController中存在一个全局的ResponseBody,从而保证返回的异步数据为JSON数据。

可参考我的博客:前后端交互之封装Ajax+SpringMVC源码分析

另外这里也说说@RequestParam,其实加这个不加这个都可以获取参数,唯一的区别是,如果不加@RequestParm,你必须要确保前台的ajax或者同步请求的参数名必须与后台Controller中对应方法上参数列表中的参数名保持一致,否则会导致参数传输不过来,从而导致某些异常错误信息。

而加了@RequestParam,你可以让前台的值不与后台一致,你只需如下即可:

例如我前台的参数名叫test,我后台加了@RequestParam(value="test") String test001,这样就可以获取对应的参数了。同时的话,我还有可以增加一个叫required的参数,required无论是在input的属性还是后台,都有一个共性叫是否必填。后台中默认是false,不必填,当为true时,为必填。

而前台html中input,加了required,如果不在对应的表单中输入信息,就会提示此表单为必填项诸如此类的信息。

提到@RequestParam时,还不得不提一个叫@PathVariable的注解,这个注解对于经常写博客的友友们非常不陌生,为什么这么说了,比如大家有没有观察到博客园的导航栏

例如:

以我为例

https://home.cnblogs.com/u/youcong/

/u,我想应该是关于用户对应的名称或参数名,而/youcong就是对应的参数值。

这和https://i.cnblogs.com/posts?page=2本质上是一样的,只是参数呈现的表现方式不一样。

从而也凸显@RequestParam和@PathVariable的区别之一。

四、构建启动类

  1. package hello;
  2.  
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5.  
  6. @SpringBootApplication
  7. public class Application {
  8.  
  9. public static void main(String[] args) {
  10. SpringApplication.run(Application.class, args);
  11. }
  12. }

五、执行Application中的main方法即可运行一个SpringBoot的restful风格

最终结果如下图所示:

另外不得不提下SpringBootApplication的源码:

源码如下:

  1. * Copyright 2012-2017 the original author or authors.
  2.  
  3. package org.springframework.boot.autoconfigure;
  4.  
  5. import java.lang.annotation.Documented;
  6. import java.lang.annotation.ElementType;
  7. import java.lang.annotation.Inherited;
  8. import java.lang.annotation.Retention;
  9. import java.lang.annotation.RetentionPolicy;
  10. import java.lang.annotation.Target;
  11.  
  12. import org.springframework.boot.SpringBootConfiguration;
  13. import org.springframework.boot.context.TypeExcludeFilter;
  14. import org.springframework.context.annotation.Bean;
  15. import org.springframework.context.annotation.ComponentScan;
  16. import org.springframework.context.annotation.ComponentScan.Filter;
  17. import org.springframework.context.annotation.Configuration;
  18. import org.springframework.context.annotation.FilterType;
  19. import org.springframework.core.annotation.AliasFor;
  20.  
  21. /**
  22. * Indicates a {@link Configuration configuration} class that declares one or more
  23. * {@link Bean @Bean} methods and also triggers {@link EnableAutoConfiguration
  24. * auto-configuration} and {@link ComponentScan component scanning}. This is a convenience
  25. * annotation that is equivalent to declaring {@code @Configuration},
  26. * {@code @EnableAutoConfiguration} and {@code @ComponentScan}.
  27. *
  28. * @author Phillip Webb
  29. * @author Stephane Nicoll
  30. * @since 1.2.0
  31. */
  32. @Target(ElementType.TYPE)
  33. @Retention(RetentionPolicy.RUNTIME)
  34. @Documented
  35. @Inherited
  36. @SpringBootConfiguration
  37. @EnableAutoConfiguration
  38. @ComponentScan(excludeFilters = {
  39. @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
  40. @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
  41. public @interface SpringBootApplication {
  42.  
  43. /**
  44. * Exclude specific auto-configuration classes such that they will never be applied.
  45. * @return the classes to exclude
  46. */
  47. @AliasFor(annotation = EnableAutoConfiguration.class, attribute = "exclude")
  48. Class<?>[] exclude() default {};
  49.  
  50. /**
  51. * Exclude specific auto-configuration class names such that they will never be
  52. * applied.
  53. * @return the class names to exclude
  54. * @since 1.3.0
  55. */
  56. @AliasFor(annotation = EnableAutoConfiguration.class, attribute = "excludeName")
  57. String[] excludeName() default {};
  58.  
  59. /**
  60. * Base packages to scan for annotated components. Use {@link #scanBasePackageClasses}
  61. * for a type-safe alternative to String-based package names.
  62. * @return base packages to scan
  63. * @since 1.3.0
  64. */
  65. @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
  66. String[] scanBasePackages() default {};
  67.  
  68. /**
  69. * Type-safe alternative to {@link #scanBasePackages} for specifying the packages to
  70. * scan for annotated components. The package of each class specified will be scanned.
  71. * <p>
  72. * Consider creating a special no-op marker class or interface in each package that
  73. * serves no purpose other than being referenced by this attribute.
  74. * @return base packages to scan
  75. * @since 1.3.0
  76. */
  77. @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
  78. Class<?>[] scanBasePackageClasses() default {};
  79.  
  80. }

另外也提提@SpringBootApplication的注解包含的意思:

  • @Configuration 标记该类作为应用程序上下文的bean定义的源。

  • @EnableAutoConfiguration 告诉Spring Boot开始根据类路径设置,其他bean和各种属性设置添加bean。

  • 通常你会添加@EnableWebMvc一个Spring MVC应用程序,但Spring Boot会在类路径上看到spring-webmvc时自动添加它。这会将应用程序标记为Web应用程序并激活关键行为,例如设置a DispatcherServlet

  • @ComponentScan告诉Spring在包中寻找其他组件,配置和服务hello,允许它找到控制器。

SpringBoot实战(一)之构建RestFul风格的更多相关文章

  1. SpringBoot实战(二)Restful风格API接口

    在上一篇SpringBoot实战(一)HelloWorld的基础上,编写一个Restful风格的API接口: 1.根据MVC原则,创建一个简单的目录结构,包括controller和entity,分别创 ...

  2. Spring Boot构建 RESTful 风格应用

    Spring Boot构建 RESTful 风格应用 1.Spring Boot构建 RESTful 风格应用 1.1 实战 1.1.1 创建工程 1.1.2 构建实体类 1.1.4 查询定制 1.1 ...

  3. 构建RESTful风格的WCF服务

    构建RESTful风格的WCF服务 RESTful Wcf是一种基于Http协议的服务架构风格. 相较 WCF.WebService 使用 SOAP.WSDL.WS-* 而言,几乎所有的语言和网络平台 ...

  4. SpringMVC 构建Restful风格 及问题处理

    基本的请求URL: /person/{id}  GET  得到id的person /person POST      新增person /person/{id}  PUT  更新id的person / ...

  5. lucene构建restful风格的简单搜索引擎服务

    来自于本人博客: lucene构建restful风格的简单搜索引擎服务 本人的博客如今也要改成使用lucene进行全文检索的功能,因此在这里把代码贴出来与大家分享 一,文件夹结构: 二,配置文件: 总 ...

  6. Spring Boot 中 10 行代码构建 RESTful 风格应用

    RESTful ,到现在相信已经没人不知道这个东西了吧!关于 RESTful 的概念,我这里就不做过多介绍了,传统的 Struts 对 RESTful 支持不够友好 ,但是 SpringMVC 对于 ...

  7. Spring Boot2 系列教程(三十一)Spring Boot 构建 RESTful 风格应用

    RESTful ,到现在相信已经没人不知道这个东西了吧!关于 RESTful 的概念,我这里就不做过多介绍了,传统的 Struts 对 RESTful 支持不够友好 ,但是 SpringMVC 对于 ...

  8. springmvc+swagger构建Restful风格文档

    本次和大家分享的是java方面的springmvc来构建的webapi接口+swagger文档:上篇文章分享.net的webapi用swagger来构建文档,因为有朋友问了为啥.net有docpage ...

  9. springMVC+json构建restful风格的服务

    首先.要知道什么是rest服务,什么是rest服务呢? REST(英文:Representational State Transfer,简称REST)描写叙述了一个架构样式的网络系统.比方 web 应 ...

随机推荐

  1. 一键安装lamp环境出现的问题

    前言:之前安装lamp是独立安装的,安装扩展很方便,现在用这个一键安装包,不知道怎么样,尝试一把. Part1:安装过程中出现的问题 error: utf8_mime2text() has new s ...

  2. 撩课-Python-每天5道面试题-第7天

    一. 函数的返回值的概念,语法以及注意事项? 场景 当我们通过某个函数, 处理好数据之后, 想要拿到处理的结果 语法 def 函数(): 函数体 return 数据 注意事项 3.1 return 后 ...

  3. Java面试题之数据库三范式是什么?

    什么是范式? 简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系.所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式.在关系型数据库中这些规范就可以称 ...

  4. java中程序上线报错: tomcat中java.lang.OutOfMemoryError: PermGen space

    在程序测试没问题之后,上线试运行,在运行的过程中某个功能一点击就报如下错,然后重启服务器就好了,一会又是如此,解决方法如下(亲测) PermGen space的全称是Permanent Generat ...

  5. jenkins 参数化构建过程

    构建项目时我们可能需要切换到另一个分支编译,或者说每次编译版本都要加1,这时候我们可以改配置或者改脚本文件,这显然不是一个好的方式,那么如何能在编译前让用户输入参数呢?jenkins早就为我们考虑好 ...

  6. java 通用对象排序

    一个排序类,一个排序util? no.no.no…… 使用反射机制,写了一个通用的对象排序util,欢迎指正. 实体类: package entity; public class BaseTypeEn ...

  7. IEEE VIS 2018专题

    PoPo数据可视化 聚焦于Web数据可视化与可视化交互领域,发现可视化领域有意思的内容.不想错过可视化领域的精彩内容, 就快快关注我们吧 :) 本文带有视频,浏览视频请关注公众号浏览. IEEE VI ...

  8. sublime3下载安装及常用插件、浏览器预览设置

    之前与学习前端有关的软件都安装在了实验室电脑上,最近由于要放寒假(也许我寒假回去会学习呢),于是得在笔记本电脑上重新安装一遍.几个软件各种出错,花了一下午才安装好,必须记录下来啊! 这篇文章主要介绍s ...

  9. 使用ifstream和getline读取文件内容[c++] ZZ

      假设有一个叫 data.txt 的文件, 它包含以下内容: Fry: One Jillion dollars.[Everyone gasps.]Auctioneer: Sir, that's no ...

  10. package.json作用

    这个文档的内容是你必须要知道的,它必须是JSON文本格式.每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元 ...