1. 程式人生 > >Spring系列——RESTful的web專案

Spring系列——RESTful的web專案

1.目標是什麼

構建一個web應用,我們可以請求:

http://localhost:8080/greeting

返回一個JSON

{"id":1,"content":"Hello, World!"}

還可以發起一個帶引數的請求:

http://localhost:8080/greeting?name=User

返回一個JSON

{"id":1,"content":"Hello, User!"}

2.你需要有什麼

  • 大約15分鐘的時間
  • 一個喜歡的文字編輯器或者IDE
  • JDK 8(或者更高)
  • Maven 3.0+

3.開始我們的教程

3.1 maven依賴

建立一個maven專案,專案結構如下:

└── src
    └── main
        └── java
            └── hello

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>org.springframework</groupId> <artifactId>gs-rest-service</artifactId> <version>0.1.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId
>
spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <scope>test</scope> </dependency> </dependencies> <properties> <java.version>1.8</java.version> </properties> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </pluginRepository> </pluginRepositories> </project>

其中,spring-boot-maven-plugin給我們提供了這麼幾個功能:
+ 他會把classpath下的jar統一打包成一個可直接執行的”über-jar”,方便我們執行。
+ 他會自動搜尋public static void main()作為程式執行的入口。
+ 他內建一個依賴版本決定者。也就是他會指定依賴的版本。當然你也可以指定版本,如果你不指定,預設由他來決定版本。

3.2 實體類

根據

{
    "id": 1,
    "content": "Hello, World!"
}

來寫出一個表達這個json的beansrc/main/java/hello/Greeting.java

package hello;

public class Greeting {

    private final long id;
    private final String content;

    public Greeting(long id, String content) {
        this.id = id;
        this.content = content;
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }
}

Spring會使用Jackson JSON自動把Greeting的例項序列化成JSON

3.3 controller

在Spring構建的restful應用中,HTTP請求是由controller接收並處理的。想要建立一個controller可以使用@RestController修飾一個類,那麼這個類就變成了一個controller。一個controller裡的每個方法都可以接收一個特定的URI,需要使用@RequestMapping來修飾每個方法,來制定URI的路徑,引數,方法等。

src/main/java/hello/GreetingController.java

package hello;

import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping("/greeting")
    public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
        return new Greeting(counter.incrementAndGet(),
                            String.format(template, name));
    }
}

這個controller很簡潔明瞭,但是在背後隱藏了很多事先細節,我們一點點來分解。

@RequestMapping這個註解確保/greeting這個HTTP請求會被路由到greeting()這個方法上來處理。

上面的例子沒有指明GETPUST或者是PUT等HTTP方法,因為@RequestMapping預設是對映所有的方法。如果你只希望某個方法被對映到這個方法,可以使用@RequestMapping(method=GET)來縮小對映範圍。

@RequestParam把請求引數中的name的值繫結到greeting()的引數name上。這個引數被標記為可選的,也就是可傳可不傳的,(預設情況下,required=true是必須要傳的),在這裡,如果沒有傳name,就會使用defaultValue的值。

greeting()方法裡建立了一個Greeting物件,然後返回,用一個自增的int作為id,用name的值拼接成content

傳統的MVC的controller和RESTful的controller的最大的區別就是返回的HTTP的response。傳統的controller返回的是一個由後端渲染的HTML,而RESTful返回的是一個物件,然後被序列化成JSON字串。

@RestController是Spring4新加的一個註解,用它修飾的controller返回的是一個物件(也就是JSON),而不是一個檢視(也就是HTML)。這個註解等同於同時使用@Controller@ResponseBody

上面提到Spring會自動把物件轉化成JSON,我們還不需要手動來轉換,那麼是誰幫我們做的呢?真相是,只要Jackson 2在classpath下,Spring就會使用MappingJackson2HttpMessageConverter來自動轉換。

3.4 可執行Jar

雖然也可以打包成傳統的war包然後交給servlet容器來執行,但是更多的時候是打包成一個可以直接執行的Jar。

src/main/java/hello/Application.java

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@SpringBootApplication註解等同於同時使用一下註解:
+ @Configuration修飾的類會被作為定義context上下文的bean。
+ @EnableAutoConfiguration允許Spring從配置檔案,其他bean,等各種方式來載入bean。
+ 一般來說,對於Spirng MVC專案,你需要使用@EnableWebMvc,不過對於Spring Boot來說,只要你的classpath裡包含spring-webmvc,他就會自動幫你加上這個,比如,設定DispatcherServlet
+ @ComponentScan告訴Spirng去掃描hello包下的其他元件,包含controller,service等。

main()就是這個應用的入口。發現了嗎,整個應用沒有一個XML檔案,全部都是Java程式碼,沒有任何配置,這就是Spring Boot想帶給你的禮物。

3.5 生成可執行Jar

java -jar restful-web-1.0-SNAPSHOT.jar

結果:


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.8.RELEASE)

2017-10-19 19:38:00.944  INFO 3923 --- [           main] hello.Application                        : Starting Application v1.0-SNAPSHOT on teedeMacBook-Pro.local with PID 3923 (/Users/teeyoung/Desktop/code4me/spring-demo/restful-web/target/restful-web-1.0-SNAPSHOT.jar started by teeyoung in /Users/teeyoung/Desktop/code4me/spring-demo/restful-web/target)
2017-10-19 19:38:00.949  INFO 3923 --- [           main] hello.Application                        : No active profile set, falling back to default profiles: default
2017-10-19 19:38:01.019  INFO 3923 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot[email protected]4f6ee6e4: startup date [Thu Oct 19 19:38:01 CST 2017]; root of context hierarchy
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.springframework.cglib.core.ReflectUtils$1 (jar:file:/Users/teeyoung/Desktop/code4me/spring-demo/restful-web/target/restful-web-1.0-SNAPSHOT.jar!/BOOT-INF/lib/spring-core-4.3.12.RELEASE.jar!/) to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of org.springframework.cglib.core.ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2017-10-19 19:38:02.374  INFO 3923 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
……
2017-10-19 19:38:03.219  INFO 3923 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-10-19 19:38:03.219  INFO 3923 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-10-19 19:38:03.263  INFO 3923 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-10-19 19:38:03.396  INFO 3923 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2017-10-19 19:38:03.465  INFO 3923 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-10-19 19:38:03.474  INFO 3923 --- [           main] hello.Application                        : Started Application in 2.924 seconds (JVM running for 3.436)

相關推薦

Spring系列——RESTful的web專案

1.目標是什麼 構建一個web應用,我們可以請求: http://localhost:8080/greeting 返回一個JSON: {"id":1,"content":"Hello, World!"} 還可以發起一個帶引數的請求: ht

Spring系列之AOP

-a cte implement 結合 動態擴展 分離 可操作性 技術 其中 一、什麽是AOPAOP(Aspect-OrientedProgramming,面向方面編程),可以說是OOP(Object-Oriented Programing,面向對象編程)的補充和完善。OO

Spring系列之bean的使用

ack 工廠 使用實例 自動裝配 繼承 放心 sys xmla 客戶端 一、Bean的定義 <bean id="userDao" class="com.dev.spring.simple.MemoryUserDao"/> 這是一個最簡單的 Bean 定義。它

Spring系列之AOP實現的兩種方式

部分 靜態常量 cep value conf tar import enc ble AOP常用的實現方式有兩種,一種是采用聲明的方式來實現(基於XML),一種是采用註解的方式來實現(基於AspectJ)。 首先復習下AOP中一些比較重要的概念: Joinpoint(連接點)

Spring系列之beanFactory與ApplicationContext

初始化 緩存 arc 等待 管理bean 核心 畫的 ssi alias 一、BeanFactoryBeanFactory 是 Spring 的“心臟”。它就是 Spring IoC 容器的真面目。Spring 使用 BeanFactory 來實例化、配置和管理 Bean。

Spring 系列: Spring 框架簡介

可用 iso 基於 抽象 通過 企業 oci 聲明 基本功 Spring 是一個開源框架,是為了解決企業應用程序開發復雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許您選擇使用哪一個組件,同時為 J2EE 應用程序開發提供集成的框架。 在這篇由三部分組成的Spr

【SSH框架】之Spring系列(一)

oca getc per 名稱 寫入 xmla java開發 無需 不能 微信公眾號:compassblog 歡迎關註、轉發,互相學習,共同進步! 有任何問題,請後臺留言聯系! 1、前言 前面更新過幾篇關於 Struts2 框架和 Hibernate 框架的文章,但鑒於

1.spring系列之簡要概述

esc 不依賴 切面 可能 tro 接受 校驗和 javabean 異常處理 一、什麽是Spring? 1.spring是一個開源框架,它是為簡化企業級應用開發而生,它是一個IOC或者稱之為DI和AOP容器框架。 2.Spring解決的是業務邏輯層和其他各層的松耦合問題,

3.Spring系列之IOC&DI

java程序 xmlns 配置文件 string main 設計 instance 什麽是 資源獲取 一、什麽是IOC? 1.概念 IOC—Inversion of Control,即“控制反轉”,不是新的技術,而是一種設計思想。Java開發中,IOC意味著將你設計好的對

5.Spring系列之Bean的配置2

不能 rda 根據 div post body OS gpo nbsp 一、配置Bean的兩種方式之使用XML配置Bean 1.Bean的自動裝配 ①.Spring IOC 容器可以自動裝配 Bean. 需要做的僅僅是在 <bean> 的 autowire 屬

6.Spring系列之Bean的配置3

enc 1.7 ole lex mysq get style 後置 分配 一、配置Bean的兩種方式之使用XML配置Bean 1.在IOC容器中引入外部屬性文件 在IOC容器中,當配置 Bean 時, 有時需要在 Bean 的配置裏引入系統部署的相關信息(例如:文件路徑、

Spring系列(二) Bean裝配

fig 攔截 首字母 文種 屬性 應用 管理 兩個 兩種 創建應用對象之間協作關系的行為稱為裝配(wiring), 這也是DI的本質. Spring中裝配Bean的方式 Spring提供了三種裝配Bean的方式. 隱式的Bean發現機制和自動裝配 Java Config

Spring系列框架系統復習(二)spring原理-面試常遇到的問題

適配器 solver ring 兩種 頁面 筆記 分享圖片 tar 表現 1、什麽是DI機制? 依賴註入(Dependecy Injection)和控制反轉(Inversion of Control)是同一個概念,具體的講:當某個角色需要另外一個角色協助的時候,在傳統的程

朱曄和你聊Spring系列S1E4:靈活但不算好用的Spring MVC

iat ndt css host 4.0 ttr found zip壓縮 return 本文會以一些例子來展現Spring MVC的常見功能和一些擴展點,然後我們來討論一下Spring MVC好用不好用。 使用SpringBoot快速開始 基於之前的parent模塊,我

深入 Spring 系列之靜態資源處理

extend ada tst mar 找到 方法 rman 依賴 1-43 1. 背景 前一段時間,WebIDE 開源的過程中,無意間接觸到 webjars,覺得比較有趣,於是研究並整理了一下。 webjars 是將前端的庫(比如 jQuery)打包成 Jar 文件,然

Spring系列(七) Spring MVC 異常處理

nco 部分 給定 uri too ebo intended 路徑 onf Servlet傳統異常處理 Servlet規範規定了當web應用發生異常時必須能夠指明, 並確定了該如何處理, 規定了錯誤信息應該包含的內容和展示頁面的方式.(詳細可以參考servlet規範文檔)

朱曄和你聊Spring系列S1E10:強大且複雜的Spring Security(含OAuth2三角色+三模式完整例子)

Spring Security功能多,元件抽象程度高,配置方式多樣,導致了Spring Security強大且複雜的特性。Spring Security的學習成本幾乎是Spring家族中最高的,Spring Security的精良設計值得我們學習,但是結合實際複雜的業務場景,我們不但需要理解Spring Se

Vue.js系列專案結構說明

轉:https://www.jb51.net/article/111658.htm 前言 在上一篇專案搭建文章中,我們已經下載安裝了node環境以及vue-cli,並且已經成功構建了一個vue-cli專案,那麼接下來,我們來梳理一下vue-cli專案的結構。 總體框架 一個

基於spring和mybatis專案的JUnit測試用例的實現

主要目的:實現JUnit的Crud 專案目前情況:spring+mybatis 想在前後端分離的情況下, 後端實現各個模組CRUD的junit 遇到的最大問題先是注入之後提示nullPointException 接著很快反應過來 是junit執行單個檔案的時候並沒有在啟動容器

Vue2.0學習系列專案上線的方法步驟(圖文)

當你好不容易的做好了一個Vue專案,準備去上線的時候卻發現不知道該怎麼辦時,或者遇到了一些問題,那麼來看我這篇文章吧,你會有所收穫的。 1:打包 專案上線必須要打包。 前端精品教程:百度網盤下載 命令: npm run build 打包後會生成 一個 dist 資料夾,裡邊有 index.