SpringBoot如何使用slf4j日志及其項(xiàng)目配置、MVC支持
一、Slf4j日志的使用
我一直以來用的都是最傳統(tǒng)的System.out.println()
來打印一些錯(cuò)誤信息時(shí),其實(shí)我也面臨過一些問題。
這樣做的話,錯(cuò)誤信息和別的輸出結(jié)果混在一起,我一直都很難從結(jié)果里面找到我調(diào)試出來的問題。而且我用這種傳統(tǒng)的沒有明確的標(biāo)識和格式,也總是花太多時(shí)間。
控制臺打印日志的話,就比如像下面這樣:
而且我也知道,實(shí)際開發(fā)肯定會有很多的輸出信息,所以接下來最近的學(xué)習(xí)我就專門從一些優(yōu)秀博客中了解到了slf4j日志,發(fā)現(xiàn)別人這樣用效率真的很高,我也得知,SpringBoot提供了一套日志系統(tǒng),最好的就是那個(gè),logback。
1.1 外觀模式
作為一種設(shè)計(jì)模式,當(dāng)然是我應(yīng)該了解的一個(gè)重點(diǎn),我還是接著看了許多博客,看完大概十來篇吧,也是基本都已經(jīng)了解了。
它的核心思想就是將子系統(tǒng)的復(fù)雜性進(jìn)行抽象和封裝,客戶端就能通過一個(gè)簡單的接口,來訪問子系統(tǒng),不需要了解子系統(tǒng)的具體實(shí)現(xiàn)細(xì)節(jié)。
我理解就是:
外觀模式可以想象成一個(gè)房子的門面,門面是整個(gè)房子的外觀,我光通過門面來訪問房子,而不需要了解房子內(nèi)部的具體實(shí)現(xiàn)和結(jié)構(gòu)。門面向外提供了一個(gè)簡單的接口,我只用知道如何使用這個(gè)接口訪問房子內(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)的門面(外觀),這個(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(); } }
再比如說, 電腦的例子其實(shí)更能理解一點(diǎn),
電腦整機(jī)是CPU、內(nèi)存、硬盤的外觀。有了外觀以后,啟動(dòng)電腦和關(guān)閉電腦都簡化了。直接new一個(gè)電腦。在new電腦的同時(shí)把cpu、內(nèi)存、硬盤都初始化好并且接好線。對外暴露方法(啟動(dòng)電腦,關(guān)閉電腦)。
- 啟動(dòng)電腦(按一下電源鍵):啟動(dòng)CPU、啟動(dòng)內(nèi)存、啟動(dòng)硬盤
- 關(guān)閉電腦(按一下電源鍵):關(guān)閉硬盤、關(guān)閉內(nèi)存、關(guān)閉CPU
1.2 slf4j簡介
SLF4J查了一下單詞,他是Simple Logging Facade for Java)其實(shí)我覺得每次有專有名詞,就查一下完整的英文,更能幫助我理解并且記住這個(gè)新知識。
它是一個(gè)簡單的Java日志門面框架,提供通用的接口,用于訪問不同的日志實(shí)現(xiàn),有Log4j、Logback、JCL等。SLF4J的目標(biāo)是為不同的日志實(shí)現(xiàn)提供一個(gè)統(tǒng)一的接口,這樣我以后就可以在不同的日志實(shí)現(xiàn)之間進(jìn)行無縫切換了。
還有個(gè)Log4j,博客我看了一些,還是選擇再多看看視頻,雖然知道這個(gè)是在干啥,但是我習(xí)慣了傳統(tǒng)的輸出方式,對于這個(gè)點(diǎn)再多學(xué)一下就可以懂的,他說是Log4j可以將日志信息輸出到控制臺、而且它還支持很多不同的日志格式,像什么HTML、XML、JSON這些。
下面這句話是我看到的大佬總結(jié):在項(xiàng)目中使用了slf4j記錄日志,并且綁定了log4j,即導(dǎo)入相應(yīng)的依賴,則日志會以log4j的風(fēng)格輸出;后期需要改為以logback的風(fēng)格輸出日志,只需要將log4j替換成logback即可,不用修改項(xiàng)目中的代碼。
但是不止查到了它的知識,我還發(fā)現(xiàn)網(wǎng)上有人說之前l(fā)og4j2在大概2021年出現(xiàn)過一件大事,特別大的漏洞,也有很多大佬對這個(gè)漏洞做了分析。因?yàn)檫@個(gè)漏洞太嚴(yán)重,很多廠商都發(fā)布了安全公告,提醒用戶立刻去升級別的版本。
1.3 通過slf調(diào)用log4j
1.3.1 添加依賴
<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。
然后我來分析一下這個(gè)配置信息吧
//根日志記錄器,參數(shù)1為需要輸出的日志等級,參數(shù)2為日志輸出的目標(biāo)地名稱stuout log4j.rootLogger=DEBUG,stdout,logFile //設(shè)置stdout是控制臺輸出 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(控制臺)
- 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ò)誤了,所以還是必須記下來,當(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("=====測試日志debug級別打印======"); logger.info("=====測試日志info級別打印======"); logger.error("=====測試日志error級別打印======"); logger.warn("=====測試日志warn級別打印======"); 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í)顯示相互之間的依賴關(guān)系。僅僅用于開發(fā)階段,產(chǎn)品階段一定關(guān)閉,或者刪除該配置。
切記,在實(shí)際項(xiàng)目中,使用 slf4j 作為自己的日志框架。使用 slf4j 記錄日志非常簡單,直接使用 LoggerFactory 創(chuàng)建即可。
1.4.1 logback SpringBoot 針對日志系統(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配置文件來配置日志信息。在這個(gè)文件中,我們可以設(shè)置日志級別、輸出目的地、輸出格式等。
比如,下面是一個(gè)簡單的應(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表示日志級別,root表示根日志級別。在這個(gè)示例中,根日志級別為INFO,表示只輸出INFO及以上級別的日志。
如果我們想要將日志輸出到文件,可以在配置文件中添加如下配置:
<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>
這樣,日志就會被輸出到名為myapp.log的文件中。
1.4.3 logback.xml配置文件解析
logback.xml是一個(gè)用于配置logback日志框架的XML文件。在logback.xml中,我們可以指定日志的輸出格式、輸出目的地、日志級別等等,以滿足不同應(yīng)用程序的日志需求。
總之,logback.xml是一種非常靈活和強(qiáng)大的日志配置文件格式,通過合理配置可以幫助我們更好地了解應(yīng)用程序的運(yùn)行情況,以及快速定位和解決問題。
- a. 定義日志輸出格式和存儲路徑
使用<編碼器>節(jié)點(diǎn)來定義日志的輸出格式,例如:
<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)來定義日志的存儲路徑,例如:
<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. 定義控制臺輸出
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder><!-- 按照上面配置的 LOG_PATTERN 來打印日志 --> <pattern>${LOG_PATTERN}</pattern> </encoder> </appender> </configuration>
在logback.xml文件中,我們可以使用<追加器>節(jié)點(diǎn)來設(shè)置日志的輸出目的地,例如控制臺輸出。將控制臺輸出定義為一個(gè)名為CONSOLE的appender,類型為ConsoleAppender,表示輸出到控制臺。為了使輸出的日志信息更清晰一點(diǎn)兒和方便閱讀,可以使用預(yù)定義的輸出格式LOG_PATTERN來格式化日志信息,然后通過${}引用該格式即可。
- c. 定義日志文件的相關(guān)參數(shù)
在logback.xml文件中,我們可以使用<追加器>節(jié)點(diǎn)來定義日志文件的相關(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 對象來打印出一些 log 信息,可以指定打印出的日志級別,也支持占位符,很方便的。
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("=====測試日志 debug 級別打印===="); logger.info("======測試日志 info 級別打印====="); logger.error("=====測試日志 error 級別打印===="); logger.warn("======測試日志 warn 級別打印====="); // 可以使用占位符打印出一些參數(shù)信息 String str1 = "blog.yan.com"; String str2 = "blog.csdn.net/yanjun"; // 輸出日志內(nèi)容時(shí),允許使用{}表示一個(gè)占位符,后續(xù)參數(shù)按照位置對應(yīng)進(jìn)行賦值 logger.info("======閆峻的個(gè)人博客:{};閆峻的 CSDN 博客:{}", str1, str2); return "success"; } }
二、項(xiàng)目配置
2.1 情景一:只有少量配置
在logback.xml文件中,如果只需要配置少量的信息,可以使用最簡單的配置方式,例如:
<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>
這種簡單的配置方式適用于應(yīng)用程序比較小,只需要輸出到控制臺并且不需要滾動(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)境:開發(fā)環(huán)境和生產(chǎn)環(huán)境。
開發(fā)環(huán)境中的配置和生產(chǎn)環(huán)境中的配置是不同的哈,例如有環(huán)境、端口、數(shù)據(jù)庫、相關(guān)地址等。實(shí)際上不可能在開發(fā)環(huán)境調(diào)試好之后,就部署到生產(chǎn)環(huán)境后,又要將配置信息全部修改成生產(chǎn)環(huán)境上的配置,這樣太麻煩了。
我認(rèn)為最好的解決方法就是開發(fā)環(huán)境和生產(chǎn)環(huán)境都有一套對用的配置信息,然后在開發(fā)的時(shí)候,指定讀取開發(fā)環(huán)境的配置,把項(xiàng)目部署到服務(wù)器上,再指定去讀取生產(chǎn)環(huán)境的配置。
三、MVC支持
Spring Boot 的 MVC 支持主要來最常用的幾個(gè)注解,包括@RestController 用于聲明控制器、@RequestMapping用于實(shí)現(xiàn)方法映射地址、@PathVariable 用于接受路徑中的參數(shù)、@RequestParam 用于接受 request 請求中的參數(shù)以及@RequestBody 用于接受 application/json 類型的請求信息。
以下是幾個(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 注解包含了原來的@Controller 和@ResponseBody 注解,使用過 Spring 的對@Controller 注解已經(jīng)非常了解了,@ResponseBody 注解是將返回的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為 Json 格式。
@RestController可以看作是@Controller和@ResponseBody的結(jié)合體,為了編碼方便建議使用@RestController后就不用再使用@Controller 了。@Controller 則返回的是邏輯地址名。
如果使用@Controller 注解則表示返回一個(gè)邏輯地址名 user 字符串,需要依賴于 ViewResovler 組件將邏輯地址名稱轉(zhuǎn)換為物理地址。在 Spring Boot 集成 Thymeleaf 模板引擎中會使用。
spring.mvc.view.prefix=/ spring.mvc.view.suffix=.html
如果使用@Controller,方法的返回值是字符串 user,則前后綴自動(dòng)生效,將邏輯地址名
user 轉(zhuǎn)換為物理地址名/user.html,靜態(tài)頁面默認(rèn)存儲位置可以考慮使用resources/static 目錄
3.2 @RequestMapping
@RequestMapping 是一個(gè)用來處理請求地址映射的注解,它可以用于類上,也可以用于方法上。
在類的級別上的注解會將一個(gè)特定請求或者請求模式映射到一個(gè)控制器之上,表示類中的所有響應(yīng)請求的方法都是以該地址作為父路徑;在方法的級別表示進(jìn)一步指定到處理方法的映射關(guān)系。
@Controller @RequestMapping("/test") 表示當(dāng)前類中每個(gè)方法映射路徑的統(tǒng)一前綴/test public class TestController { @RequestMapping("/get") 針對方法的映射,加上類上的映射配置,則當(dāng)前方法 的請求地址為/test/get public String get(){ return "user"; } }
3.3 @PathVariable
@PathVariable 注解主要是用來獲取 url 參數(shù),Spring Boot 支持 restfull 風(fēng)格的 url,比如一個(gè) GET 請求攜帶一個(gè)參數(shù) id 過來 localhost:8080/user?id=123,可以將 id 作為參數(shù)接收,注解使用RequestParam。
注意問題:如果想要 url 中占位符中的{id}值直接賦值到參數(shù) id 中,需要保證 url 中的參數(shù)和方法接收參數(shù)一致,否則就無法接收。
如果不一樣的話,其實(shí)也可以解決,需要用@PathVariable 中的 value 屬性來指定對應(yīng)關(guān)系。
@RequestMapping("/user/{idd}") public String testPathVariable(@PathVariable(value = "idd") Integer id) { System.out.println("獲取到的 id 為:" + id); return "success"; }
對于訪問的 url,占位符的位置可以在任何位置,不一定非要在最后,比如這樣也行/xxx/{id}/user。另外 url也支持多個(gè)占位符,方法參數(shù)使用同樣數(shù)量的參數(shù)來接收,原理和一個(gè)參數(shù)是一樣的@GetMapping("/user/{idd}/{name}") 例如對應(yīng)的請求地址為 localhost:8080/user/123/abc,按照位置對應(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 注解一樣也都是獲取請求參數(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 類型,就會自動(dòng)執(zhí)行數(shù)據(jù)類型轉(zhuǎn)換 :
public String testRequestParam(@RequestParam Integer id) { System.out.println("獲取到的 id 為:" + id); return "success"; }
可以正確的從控制臺打印出 id 信息。 url 上面的參數(shù)和方法的參數(shù)需要一樣,如果不一樣,也需要使用 value 屬性來說明。
具體測試:
可以使用 postman 來模擬一下表單提交,測試一下接口。但是如果表單數(shù)據(jù)很多,不可能在后臺
方法中寫上很多參數(shù),每個(gè)參數(shù)還要 @RequestParam 注解。針對這種情況,需要封裝一個(gè)實(shí)體類來接收這些 參數(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"; }
如果寫成 public String testForm(User user , String username) 則提交的請求參數(shù) username 的值會賦值兩個(gè) 地址,一個(gè) user 中的 username 屬性;
另一個(gè)是方法的參數(shù) username 可以使用 postman 再次測試一下表單提交,觀察一下返回值和控制臺打印出的日志即可。
在我見到的實(shí)際項(xiàng)目中,一 般都是封裝一個(gè)實(shí)體類來接收表單數(shù)據(jù),因?yàn)閷?shí)際項(xiàng)目中表單數(shù)據(jù)一般都很多。
3.5 @RequestBody
@RequestBody 注解用于接收前端傳來的實(shí)體,接收參數(shù)也是對應(yīng)的實(shí)體, 使用 @RequestBody 接收會非常方便。
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 工具來測試一下效果,打開 postman 后輸入請求地址和參數(shù),參數(shù)用 json 來模擬,調(diào)用 之后返回 success 。
同時(shí)看一下后臺控制臺輸出的日志:
獲取到的 username 為:徐苗
獲取到的 password 為: 123456
可以看出, @RequestBody 注解用于 POST 請求上,接收 json 實(shí)體參數(shù)。它和上面表單提交有點(diǎn)類似,只不過 參數(shù)的格式不同,一個(gè)是 json 實(shí)體,一個(gè)是表單提交。
在實(shí)際項(xiàng)目中根據(jù)具體場景和需要使用對應(yīng)的注解就OK?。。。。?/p>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis中使用InsertProvider注解報(bào)錯(cuò)解決全過程
這篇文章主要介紹了mybatis中使用InsertProvider注解報(bào)錯(cuò)解決全過程,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Java集合框架Collections原理及用法實(shí)例
這篇文章主要介紹了Java集合框架Collections原理及用法實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08設(shè)置Myeclipse中的代碼格式化、注釋模板及保存時(shí)自動(dòng)格式化
這篇文章主要介紹了設(shè)置Myeclipse中的代碼格式化、注釋模板及保存時(shí)自動(dòng)格式化方法,需要的朋友可以參考下2014-10-10SpringMVC MethodArgumentResolver的作用與實(shí)現(xiàn)
這篇文章主要介紹了SpringMVC MethodArgumentResolver的作用與實(shí)現(xiàn),MethodArgumentResolver采用一種策略模式,在Handler的方法被調(diào)用前,Spring MVC會自動(dòng)將HTTP請求中的參數(shù)轉(zhuǎn)換成方法參數(shù)2023-04-04Java中使用Preferences 的 API設(shè)置用戶偏好
這篇文章主要介紹了Java中使用Preferences 的 API設(shè)置用戶偏好的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09Java中字符串轉(zhuǎn)int數(shù)據(jù)類型的三種方式
這篇文章主要介紹了Java中字符串轉(zhuǎn)int數(shù)據(jù)類型的三種方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03