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