SpringBoot如何使用slf4j日志及其項(xiàng)目配置、MVC支持
一、Slf4j日志的使用
我一直以來(lái)用的都是最傳統(tǒng)的System.out.println()來(lái)打印一些錯(cuò)誤信息時(shí),其實(shí)我也面臨過(guò)一些問(wèn)題。
這樣做的話,錯(cuò)誤信息和別的輸出結(jié)果混在一起,我一直都很難從結(jié)果里面找到我調(diào)試出來(lái)的問(wèn)題。而且我用這種傳統(tǒng)的沒(méi)有明確的標(biāo)識(shí)和格式,也總是花太多時(shí)間。
控制臺(tái)打印日志的話,就比如像下面這樣:

而且我也知道,實(shí)際開(kāi)發(fā)肯定會(huì)有很多的輸出信息,所以接下來(lái)最近的學(xué)習(xí)我就專(zhuān)門(mén)從一些優(yōu)秀博客中了解到了slf4j日志,發(fā)現(xiàn)別人這樣用效率真的很高,我也得知,SpringBoot提供了一套日志系統(tǒng),最好的就是那個(gè),logback。
1.1 外觀模式
作為一種設(shè)計(jì)模式,當(dāng)然是我應(yīng)該了解的一個(gè)重點(diǎn),我還是接著看了許多博客,看完大概十來(lái)篇吧,也是基本都已經(jīng)了解了。
它的核心思想就是將子系統(tǒng)的復(fù)雜性進(jìn)行抽象和封裝,客戶端就能通過(guò)一個(gè)簡(jiǎn)單的接口,來(lái)訪問(wèn)子系統(tǒng),不需要了解子系統(tǒng)的具體實(shí)現(xiàn)細(xì)節(jié)。
我理解就是:
外觀模式可以想象成一個(gè)房子的門(mén)面,門(mén)面是整個(gè)房子的外觀,我光通過(guò)門(mén)面來(lái)訪問(wèn)房子,而不需要了解房子內(nèi)部的具體實(shí)現(xiàn)和結(jié)構(gòu)。門(mén)面向外提供了一個(gè)簡(jiǎn)單的接口,我只用知道如何使用這個(gè)接口訪問(wèn)房子內(nèi)部。
它的編碼實(shí)現(xiàn)如下:
- 先是產(chǎn)品接口
interface Shape {
public void draw();
}- 實(shí)現(xiàn)代碼是下面這個(gè)
class Circle implements Shape{
@Override
public void draw() {
System.out.println("繪制一個(gè)圓形");
}
}
class Square implements Shape{
@Override
public void draw() {
System.out.println("繪制一個(gè)正方形");
}
}- 下面就是定義了子系統(tǒng)的門(mén)面(外觀),這個(gè)子系統(tǒng)有多個(gè)產(chǎn)品組件
class ShapeFacade{
private Circle circle;
private Square square;
public ShapeFacade(){
circle = new Circle();
square = new Square();
}
public void drawCircle(){
circle.draw();
}
public void drawSquare(){
square.hashCode();
}
public void drawCircleAndSquare(){
circle.draw();
square.draw();
}
}再比如說(shuō), 電腦的例子其實(shí)更能理解一點(diǎn),
電腦整機(jī)是CPU、內(nèi)存、硬盤(pán)的外觀。有了外觀以后,啟動(dòng)電腦和關(guān)閉電腦都簡(jiǎn)化了。直接new一個(gè)電腦。在new電腦的同時(shí)把cpu、內(nèi)存、硬盤(pán)都初始化好并且接好線。對(duì)外暴露方法(啟動(dòng)電腦,關(guān)閉電腦)。
- 啟動(dòng)電腦(按一下電源鍵):?jiǎn)?dòng)CPU、啟動(dòng)內(nèi)存、啟動(dòng)硬盤(pán)
- 關(guān)閉電腦(按一下電源鍵):關(guān)閉硬盤(pán)、關(guān)閉內(nèi)存、關(guān)閉CPU
1.2 slf4j簡(jiǎn)介
SLF4J查了一下單詞,他是Simple Logging Facade for Java)其實(shí)我覺(jué)得每次有專(zhuān)有名詞,就查一下完整的英文,更能幫助我理解并且記住這個(gè)新知識(shí)。
它是一個(gè)簡(jiǎn)單的Java日志門(mén)面框架,提供通用的接口,用于訪問(wèn)不同的日志實(shí)現(xiàn),有Log4j、Logback、JCL等。SLF4J的目標(biāo)是為不同的日志實(shí)現(xiàn)提供一個(gè)統(tǒng)一的接口,這樣我以后就可以在不同的日志實(shí)現(xiàn)之間進(jìn)行無(wú)縫切換了。
還有個(gè)Log4j,博客我看了一些,還是選擇再多看看視頻,雖然知道這個(gè)是在干啥,但是我習(xí)慣了傳統(tǒng)的輸出方式,對(duì)于這個(gè)點(diǎn)再多學(xué)一下就可以懂的,他說(shuō)是Log4j可以將日志信息輸出到控制臺(tái)、而且它還支持很多不同的日志格式,像什么HTML、XML、JSON這些。
下面這句話是我看到的大佬總結(jié):在項(xiàng)目中使用了slf4j記錄日志,并且綁定了log4j,即導(dǎo)入相應(yīng)的依賴(lài),則日志會(huì)以log4j的風(fēng)格輸出;后期需要改為以logback的風(fēng)格輸出日志,只需要將log4j替換成logback即可,不用修改項(xiàng)目中的代碼。
但是不止查到了它的知識(shí),我還發(fā)現(xiàn)網(wǎng)上有人說(shuō)之前l(fā)og4j2在大概2021年出現(xiàn)過(guò)一件大事,特別大的漏洞,也有很多大佬對(duì)這個(gè)漏洞做了分析。因?yàn)檫@個(gè)漏洞太嚴(yán)重,很多廠商都發(fā)布了安全公告,提醒用戶立刻去升級(jí)別的版本。
1.3 通過(guò)slf調(diào)用log4j
1.3.1 添加依賴(lài)
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>2.0.7</version>
</dependency>1.3.2 創(chuàng)建log4j.properties
在我那個(gè)resources目錄里面創(chuàng)建log4j的配置文件log4j.properties。
然后我來(lái)分析一下這個(gè)配置信息吧
//根日志記錄器,參數(shù)1為需要輸出的日志等級(jí),參數(shù)2為日志輸出的目標(biāo)地名稱(chēng)stuout log4j.rootLogger=DEBUG,stdout,logFile //設(shè)置stdout是控制臺(tái)輸出 log4j.appender.stdout=org.apache.log4j.ConsoleAppender //配置日志輸出的格式 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n log4j.appender.logFile=org.apache.log4j.FileAppender log4j.appender.logFile.ImmediateFlush=true log4j.appender.logFile.Append=true log4j.appender.logFile.File=D:/logs/log.log4j log4j.appender.logFile.layout=org.apache.log4j.PatternLayout log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
Log4j輸出的目的地
- org.apache.log4j.ConsoleAppender(控制臺(tái))
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天產(chǎn)生一個(gè)日志文件)
- org.apache.log4j.RollingFileAppender(文件大小到達(dá)指定尺寸的時(shí)候產(chǎn)生一個(gè)新的文件)
- org.apache.log4j.WriterAppender(將日志信息以流格式發(fā)送到任意指定的地方)
1.3.3 輸出日志信息
下面這兩行一定要注意,很容易導(dǎo)錯(cuò)包,因?yàn)槲易约悍高@個(gè)錯(cuò)誤了,所以還是必須記下來(lái),當(dāng)時(shí)也是不夠細(xì)心了。
import org.slf4j.Logger; import org.slf4j.LoggerFactory;
package com.xu.action;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/tests")
public class TestController {
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
@RequestMapping("/logs")
public String log(){
logger.debug("=====測(cè)試日志debug級(jí)別打印======");
logger.info("=====測(cè)試日志info級(jí)別打印======");
logger.error("=====測(cè)試日志error級(jí)別打印======");
logger.warn("=====測(cè)試日志warn級(jí)別打印======");
System.out.println("logs...");
String str1 = "blog.xu.com";
String str2 = "blog.csdn.net/xxxx";
logger.info("=====徐苗苗的個(gè)人博客:{}; 徐苗苗的CSDN博客:{}",str1,str2);
return "success";
}
}1.4 SpringBoot輸出日志
debug:
true 在 SpringBoot 框架啟動(dòng)時(shí)自動(dòng)輸出日志信息,同時(shí)顯示相互之間的依賴(lài)關(guān)系。僅僅用于開(kāi)發(fā)階段,產(chǎn)品階段一定關(guān)閉,或者刪除該配置。
切記,在實(shí)際項(xiàng)目中,使用 slf4j 作為自己的日志框架。使用 slf4j 記錄日志非常簡(jiǎn)單,直接使用 LoggerFactory 創(chuàng)建即可。
1.4.1 logback SpringBoot 針對(duì)日志系統(tǒng)默認(rèn)采用 logback
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test {
private static final Logger logger = LoggerFactory.getLogger(Test.class);
// ……
}1.4.2 application.yml中的日志配置
在Spring Boot應(yīng)用程序中,我們可以使用application.yml配置文件來(lái)配置日志信息。在這個(gè)文件中,我們可以設(shè)置日志級(jí)別、輸出目的地、輸出格式等。
比如,下面是一個(gè)簡(jiǎn)單的應(yīng)用程序.yml配置
<span style="color:#050e17"><span style="background-color:#f1f2f2"><span style="background-color:#2b2b2b"><span style="color:#f8f8f2"><code><span style="color:#abe338">logging:</span> <span style="color:#abe338"> level:</span> <span style="color:#abe338"> root:</span> INFO </code></span></span></span></span>
其中,logging表示日志配置的主要屬性,level表示日志級(jí)別,root表示根日志級(jí)別。在這個(gè)示例中,根日志級(jí)別為INFO,表示只輸出INFO及以上級(jí)別的日志。
如果我們想要將日志輸出到文件,可以在配置文件中添加如下配置:
<span style="color:#050e17"><span style="background-color:#f1f2f2"><span style="background-color:#2b2b2b"><span style="color:#f8f8f2"><code><span style="color:#abe338">logging:</span> <span style="color:#abe338"> level:</span> <span style="color:#abe338"> root:</span> INFO <span style="color:#abe338"> file:</span> <span style="color:#abe338"> name:</span> myapp.log </code></span></span></span></span>
這樣,日志就會(huì)被輸出到名為myapp.log的文件中。
1.4.3 logback.xml配置文件解析
logback.xml是一個(gè)用于配置logback日志框架的XML文件。在logback.xml中,我們可以指定日志的輸出格式、輸出目的地、日志級(jí)別等等,以滿足不同應(yīng)用程序的日志需求。
總之,logback.xml是一種非常靈活和強(qiáng)大的日志配置文件格式,通過(guò)合理配置可以幫助我們更好地了解應(yīng)用程序的運(yùn)行情況,以及快速定位和解決問(wèn)題。
- a. 定義日志輸出格式和存儲(chǔ)路徑
使用<編碼器>節(jié)點(diǎn)來(lái)定義日志的輸出格式,例如:
<span style="color:#050e17"><span style="background-color:#f1f2f2"><span style="background-color:#2b2b2b"><span style="color:#f8f8f2"><code><span style="color:#ffa07a"><</span><span style="color:#ffa07a">encoder</span><span style="color:#ffa07a">></span>
<span style="color:#ffa07a"><</span><span style="color:#ffa07a">pattern</span><span style="color:#ffa07a">></span>%d<span style="color:#ffa07a">{yyyy-MM-dd HH:mm:ss.SSS}</span> [%thread] %-5level %logger<span style="color:#ffa07a">{36}</span> - %msg%n<span style="color:#ffa07a"></</span><span style="color:#ffa07a">pattern</span><span style="color:#ffa07a">></span>
<span style="color:#ffa07a"></</span><span style="color:#ffa07a">encoder</span><span style="color:#ffa07a">></span></code></span></span></span></span>使用<追加器>節(jié)點(diǎn)來(lái)定義日志的存儲(chǔ)路徑,例如:
<span style="color:#050e17"><span style="background-color:#f1f2f2"><span style="background-color:#2b2b2b"><span style="color:#f8f8f2"><code><appender name=<span style="color:#abe338">"FILE"</span> <span style="color:#dcc6e0">class</span>="<span style="color:#abe338">ch</span>.<span style="color:#abe338">qos</span>.<span style="color:#abe338">logback</span>.<span style="color:#abe338">core</span>.<span style="color:#abe338">rolling</span>.<span style="color:#abe338">RollingFileAppender</span>">
<<span style="color:#abe338">file</span>>/<span style="color:#abe338">path</span>/<span style="color:#abe338">to</span>/<span style="color:#abe338">logs</span>/<span style="color:#abe338">myapp</span>.<span style="color:#abe338">log</span></<span style="color:#abe338">file</span>>
<<span style="color:#abe338">rollingPolicy</span> <span style="color:#abe338">class</span>="<span style="color:#abe338">ch</span>.<span style="color:#abe338">qos</span>.<span style="color:#abe338">logback</span>.<span style="color:#abe338">core</span>.<span style="color:#abe338">rolling</span>.<span style="color:#abe338">TimeBasedRollingPolicy</span>">
<<span style="color:#abe338">fileNamePattern</span>>/<span style="color:#abe338">path</span>/<span style="color:#abe338">to</span>/<span style="color:#abe338">logs</span>/<span style="color:#abe338">myapp</span>.%<span style="color:#abe338">d</span>{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %<span style="color:#f5ab35">-5</span>level %logger{<span style="color:#f5ab35">36</span>} - %msg%n</pattern>
</encoder>
</appender></code></span></span></span></span>- b. 定義控制臺(tái)輸出
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder><!-- 按照上面配置的 LOG_PATTERN 來(lái)打印日志 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
</configuration>在logback.xml文件中,我們可以使用<追加器>節(jié)點(diǎn)來(lái)設(shè)置日志的輸出目的地,例如控制臺(tái)輸出。將控制臺(tái)輸出定義為一個(gè)名為CONSOLE的appender,類(lèi)型為ConsoleAppender,表示輸出到控制臺(tái)。為了使輸出的日志信息更清晰一點(diǎn)兒和方便閱讀,可以使用預(yù)定義的輸出格式LOG_PATTERN來(lái)格式化日志信息,然后通過(guò)${}引用該格式即可。
- c. 定義日志文件的相關(guān)參數(shù)
在logback.xml文件中,我們可以使用<追加器>節(jié)點(diǎn)來(lái)定義日志文件的相關(guān)參數(shù)
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/path/to/logs/myapp.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/path/to/logs/myapp.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>1.4.4 使用Logger打印日志
在代碼中一般使用 Logger 對(duì)象來(lái)打印出一些 log 信息,可以指定打印出的日志級(jí)別,也支持占位符,很方便的。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
private final static Logger logger = LoggerFactory.getLogger(TestController.class);
@RequestMapping("/log")
public String testLog() {
logger.debug("=====測(cè)試日志 debug 級(jí)別打印====");
logger.info("======測(cè)試日志 info 級(jí)別打印=====");
logger.error("=====測(cè)試日志 error 級(jí)別打印====");
logger.warn("======測(cè)試日志 warn 級(jí)別打印=====");
// 可以使用占位符打印出一些參數(shù)信息
String str1 = "blog.yan.com";
String str2 = "blog.csdn.net/yanjun";
// 輸出日志內(nèi)容時(shí),允許使用{}表示一個(gè)占位符,后續(xù)參數(shù)按照位置對(duì)應(yīng)進(jìn)行賦值
logger.info("======閆峻的個(gè)人博客:{};閆峻的 CSDN 博客:{}", str1, str2);
return "success";
}
}二、項(xiàng)目配置
2.1 情景一:只有少量配置
在logback.xml文件中,如果只需要配置少量的信息,可以使用最簡(jiǎn)單的配置方式,例如:
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>這種簡(jiǎn)單的配置方式適用于應(yīng)用程序比較小,只需要輸出到控制臺(tái)并且不需要滾動(dòng)日志的情形。如果需要更多的配置選項(xiàng),可以使用更復(fù)雜的配置方式。
2.2 情景二:有多個(gè)配置
在logback.xml文件中,如果需要配置多個(gè)信息,可以使用更復(fù)雜的配置方式,例如:
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/path/to/logs/myapp.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/path/to/logs/myapp.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.example" level="DEBUG">
<appender-ref ref="FILE" />
</logger>
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>這種復(fù)雜的配置方式適用于應(yīng)用程序比較大,需要輸出到多個(gè)輸出目的地并且需要更復(fù)雜的日志管理的情形。根據(jù)實(shí)際需要,可以靈活地添加和修改<appender>和<logger>元素,以滿足日志管理的需要。
2.3 指定項(xiàng)目配置文件
在實(shí)際項(xiàng)目中,一般有兩個(gè)環(huán)境:開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境。
開(kāi)發(fā)環(huán)境中的配置和生產(chǎn)環(huán)境中的配置是不同的哈,例如有環(huán)境、端口、數(shù)據(jù)庫(kù)、相關(guān)地址等。實(shí)際上不可能在開(kāi)發(fā)環(huán)境調(diào)試好之后,就部署到生產(chǎn)環(huán)境后,又要將配置信息全部修改成生產(chǎn)環(huán)境上的配置,這樣太麻煩了。
我認(rèn)為最好的解決方法就是開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境都有一套對(duì)用的配置信息,然后在開(kāi)發(fā)的時(shí)候,指定讀取開(kāi)發(fā)環(huán)境的配置,把項(xiàng)目部署到服務(wù)器上,再指定去讀取生產(chǎn)環(huán)境的配置。
三、MVC支持
Spring Boot 的 MVC 支持主要來(lái)最常用的幾個(gè)注解,包括@RestController 用于聲明控制器、@RequestMapping用于實(shí)現(xiàn)方法映射地址、@PathVariable 用于接受路徑中的參數(shù)、@RequestParam 用于接受 request 請(qǐng)求中的參數(shù)以及@RequestBody 用于接受 application/json 類(lèi)型的請(qǐng)求信息。
以下是幾個(gè)注解常用的使用方式和特點(diǎn):
3.1 @RestController
@RestController 是 Spring Boot 新增加的一個(gè)注解,相當(dāng)于@Controller+@ResponseBody
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
String value() default "";
}可以看出@RestController 注解包含了原來(lái)的@Controller 和@ResponseBody 注解,使用過(guò) Spring 的對(duì)@Controller 注解已經(jīng)非常了解了,@ResponseBody 注解是將返回的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為 Json 格式。
@RestController可以看作是@Controller和@ResponseBody的結(jié)合體,為了編碼方便建議使用@RestController后就不用再使用@Controller 了。@Controller 則返回的是邏輯地址名。
如果使用@Controller 注解則表示返回一個(gè)邏輯地址名 user 字符串,需要依賴(lài)于 ViewResovler 組件將邏輯地址名稱(chēng)轉(zhuǎn)換為物理地址。在 Spring Boot 集成 Thymeleaf 模板引擎中會(huì)使用。
spring.mvc.view.prefix=/ spring.mvc.view.suffix=.html
如果使用@Controller,方法的返回值是字符串 user,則前后綴自動(dòng)生效,將邏輯地址名
user 轉(zhuǎn)換為物理地址名/user.html,靜態(tài)頁(yè)面默認(rèn)存儲(chǔ)位置可以考慮使用resources/static 目錄
3.2 @RequestMapping
@RequestMapping 是一個(gè)用來(lái)處理請(qǐng)求地址映射的注解,它可以用于類(lèi)上,也可以用于方法上。
在類(lèi)的級(jí)別上的注解會(huì)將一個(gè)特定請(qǐng)求或者請(qǐng)求模式映射到一個(gè)控制器之上,表示類(lèi)中的所有響應(yīng)請(qǐng)求的方法都是以該地址作為父路徑;在方法的級(jí)別表示進(jìn)一步指定到處理方法的映射關(guān)系。
@Controller
@RequestMapping("/test") 表示當(dāng)前類(lèi)中每個(gè)方法映射路徑的統(tǒng)一前綴/test
public class TestController {
@RequestMapping("/get") 針對(duì)方法的映射,加上類(lèi)上的映射配置,則當(dāng)前方法
的請(qǐng)求地址為/test/get
public String get(){
return "user";
}
}3.3 @PathVariable
@PathVariable 注解主要是用來(lái)獲取 url 參數(shù),Spring Boot 支持 restfull 風(fēng)格的 url,比如一個(gè) GET 請(qǐng)求攜帶一個(gè)參數(shù) id 過(guò)來(lái) localhost:8080/user?id=123,可以將 id 作為參數(shù)接收,注解使用RequestParam。
注意問(wèn)題:如果想要 url 中占位符中的{id}值直接賦值到參數(shù) id 中,需要保證 url 中的參數(shù)和方法接收參數(shù)一致,否則就無(wú)法接收。
如果不一樣的話,其實(shí)也可以解決,需要用@PathVariable 中的 value 屬性來(lái)指定對(duì)應(yīng)關(guān)系。
@RequestMapping("/user/{idd}")
public String testPathVariable(@PathVariable(value = "idd") Integer id) {
System.out.println("獲取到的 id 為:" + id);
return "success";
}對(duì)于訪問(wèn)的 url,占位符的位置可以在任何位置,不一定非要在最后,比如這樣也行/xxx/{id}/user。另外 url也支持多個(gè)占位符,方法參數(shù)使用同樣數(shù)量的參數(shù)來(lái)接收,原理和一個(gè)參數(shù)是一樣的@GetMapping("/user/{idd}/{name}") 例如對(duì)應(yīng)的請(qǐng)求地址為 localhost:8080/user/123/abc,按照位置對(duì)應(yīng)的 idd=123,name=abc。
public String testPathVariable(@PathVariable(value = "idd") Integer id, @PathVariable String name) {
System.out.println("獲取到的 id 為:" + id);
System.out.println("獲取到的 name 為:" + name);
return "success";
}3.4 @RequestParam
@RequestParam 和 @PathValiable 注解一樣也都是獲取請(qǐng)求參數(shù)的。
@RequestParam 和 @PathVariable不同:
- @PathValiable 是從 url 模板中獲取參數(shù)值, 即這種風(fēng)格的 url 為 http://localhost:8080/user/{id} ;
- @RequestParam 是從 request 里面獲取參數(shù)值,即這 種風(fēng)格的 http://localhost:8080/user?id=1 。
如果參數(shù)不是 String 類(lèi)型,就會(huì)自動(dòng)執(zhí)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換 :
public String testRequestParam(@RequestParam Integer id) {
System.out.println("獲取到的 id 為:" + id);
return "success";
}可以正確的從控制臺(tái)打印出 id 信息。 url 上面的參數(shù)和方法的參數(shù)需要一樣,如果不一樣,也需要使用 value 屬性來(lái)說(shuō)明。
具體測(cè)試:
可以使用 postman 來(lái)模擬一下表單提交,測(cè)試一下接口。但是如果表單數(shù)據(jù)很多,不可能在后臺(tái)
方法中寫(xiě)上很多參數(shù),每個(gè)參數(shù)還要 @RequestParam 注解。針對(duì)這種情況,需要封裝一個(gè)實(shí)體類(lèi)來(lái)接收這些 參數(shù),實(shí)體中的屬性名和表單中的參數(shù)名一致就行了!??!
public class User {
private String username;
private String password;
// set get
}使用實(shí)體接收的話,不能在前面加 @RequestParam 注解了,直接使用!
@PostMapping("/form2")
public String testForm(User user) {
System.out.println("獲取到的 username 為:" + user.getUsername());
System.out.println("獲取到的 password 為:" + user.getPassword());
return "success";
}如果寫(xiě)成 public String testForm(User user , String username) 則提交的請(qǐng)求參數(shù) username 的值會(huì)賦值兩個(gè) 地址,一個(gè) user 中的 username 屬性;
另一個(gè)是方法的參數(shù) username 可以使用 postman 再次測(cè)試一下表單提交,觀察一下返回值和控制臺(tái)打印出的日志即可。
在我見(jiàn)到的實(shí)際項(xiàng)目中,一 般都是封裝一個(gè)實(shí)體類(lèi)來(lái)接收表單數(shù)據(jù),因?yàn)閷?shí)際項(xiàng)目中表單數(shù)據(jù)一般都很多。
3.5 @RequestBody
@RequestBody 注解用于接收前端傳來(lái)的實(shí)體,接收參數(shù)也是對(duì)應(yīng)的實(shí)體, 使用 @RequestBody 接收會(huì)非常方便。

public class User {
private String username;
private String password;
// set get
}控制器中方法的定義
@PostMapping("/user")
public String testRequestBody(@RequestBody User user) {
System.out.println("獲取到的 username 為:" + user.getUsername());
System.out.println("獲取到的 password 為:" + user.getPassword());
return "success";
}然后使用 postman 工具來(lái)測(cè)試一下效果,打開(kāi) postman 后輸入請(qǐng)求地址和參數(shù),參數(shù)用 json 來(lái)模擬,調(diào)用 之后返回 success 。
同時(shí)看一下后臺(tái)控制臺(tái)輸出的日志:
獲取到的 username 為:徐苗
獲取到的 password 為: 123456
可以看出, @RequestBody 注解用于 POST 請(qǐng)求上,接收 json 實(shí)體參數(shù)。它和上面表單提交有點(diǎn)類(lèi)似,只不過(guò) 參數(shù)的格式不同,一個(gè)是 json 實(shí)體,一個(gè)是表單提交。
在實(shí)際項(xiàng)目中根據(jù)具體場(chǎng)景和需要使用對(duì)應(yīng)的注解就OK?。。。?!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中的Set接口實(shí)現(xiàn)類(lèi)HashSet和LinkedHashSet詳解
這篇文章主要介紹了Java中的Set接口實(shí)現(xiàn)類(lèi)HashSet和LinkedHashSet詳解,Set接口和java.util.List接口一樣,同樣繼承自Collection接口,它與Collection接口中的方法基本一致,并沒(méi)有對(duì)Collection接口進(jìn)行功能上的擴(kuò)充,只是比Collection接口更加嚴(yán)格了,需要的朋友可以參考下2024-01-01
詳解使用Spring Cloud Consul實(shí)現(xiàn)服務(wù)的注冊(cè)和發(fā)現(xiàn)
這篇文章主要介紹了詳解使用Spring Cloud Consul實(shí)現(xiàn)服務(wù)的注冊(cè)和發(fā)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Spring Boot中使用AOP統(tǒng)一處理web層異常的方法
這篇文章主要介紹了Spring Boot中使用AOP統(tǒng)一處理web層異常的相關(guān)資料,需要的朋友可以參考下2018-03-03
java中將漢字轉(zhuǎn)換成拼音的實(shí)現(xiàn)代碼
java中將漢字轉(zhuǎn)換成拼音的實(shí)現(xiàn)代碼。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10
Springboot集成minio實(shí)現(xiàn)文件存儲(chǔ)的實(shí)現(xiàn)代碼
MinIO?是一款基于Go語(yǔ)言的高性能對(duì)象存儲(chǔ)服務(wù),本文主要介紹了Springboot集成minio實(shí)現(xiàn)文件存儲(chǔ)的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Java JDK1.7對(duì)字符串的BASE64編碼解碼方法
今天小編就為大家分享一篇Java JDK1.7對(duì)字符串的BASE64編碼解碼方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10
SpringBoot實(shí)現(xiàn)對(duì)超大文件進(jìn)行異步壓縮下載的使用示例
在Web應(yīng)用中,文件下載功能是一個(gè)常見(jiàn)的需求,本文介紹了SpringBoot實(shí)現(xiàn)對(duì)超大文件進(jìn)行異步壓縮下載的使用示例,具有一定的參考價(jià)值,感興趣的可以了解一下,2023-09-09
基于Java實(shí)現(xiàn)文件和base64字符串轉(zhuǎn)換
這篇文章主要介紹了基于Java實(shí)現(xiàn)文件和base64字符串轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
springboot 如何解決cross跨域請(qǐng)求的問(wèn)題
這篇文章主要介紹了springboot 如何解決cross跨域請(qǐng)求的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
當(dāng)面試官問(wèn)我ArrayList和LinkedList哪個(gè)更占空間時(shí),我是這么答的(面試官必問(wèn))
今天介紹一下Java的兩個(gè)集合類(lèi),ArrayList和LinkedList,這兩個(gè)集合的知識(shí)點(diǎn)幾乎可以說(shuō)面試必問(wèn)的。感興趣的朋友跟隨小編一起看看吧2020-08-08

