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()
這個方法上來處理。
上面的例子沒有指明
GET
,PUST
或者是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.