1、問題描述
springboot下,基本全標籤化了,spring標籤很多,有時候會混淆,簡單記錄下,以免有時候會迷糊。
2、解決方案
2.1 @Controller/@Service/@Repository/@Component
簡單說明:
@Controller用於標註控制層組件;
@Service用於標註業務層組件;
@Repository用於標註數據訪問組件,即DAO組件;
@Component泛指組件,組件不好分類的的時候,使用該標籤;
(1)2.5以前這幾個標籤作用是一樣的,都是用於將POJO加載到spring容器中,不同是的業務層面,不同的標籤名字讓人一目瞭然類的作用,但實際作用一樣;
(2)spring5開始,@Controller有點不一樣了,簡單來說就是隻有被標註爲@Controller的類,Spring纔會自動的去掃描該類裏面的@RequestMapping,假如類被標記爲其他標籤,裏面的@RequestMapping是不會被識別的,通過頁面訪問,會報找不到該資源;
2.2 @RequestMapping
非常重要的一個標籤,用於映射請求,也就是通過它來指定控制器可以處理哪些URL請求,簡單來說用戶頁面通過IP:端口/該地址,後臺就能捕獲/接收到該請求;
相當於Servlet中在web.xml中配置的映射作用一致
<servlet>
<servlet-name>servletName</servlet-name>
<servlet-class>ServletClass</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletName</servlet-name>
<url-pattern>url</url-pattern>
</servlet-mapping>
@RequestMapping類:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
(1)@Target({ElementType.TYPE, ElementType.METHOD}),表明@RequestMapping()既可以標註類上面,也可以標註再方法上,同時標註的話,瀏覽器訪問需要拼接起來,例如:IP:端口號/項目名稱/類上的標註value/方法value
(2)可以看到註解中的屬性除了 name() 返回的字符串,其它的方法均返回數組,也就是可以定義多個屬性值,例如 value() 和 path() 都可以同時定義多個字符串值來接收多個URL請求;
@RestController
@RequestMapping("/hello")
public class Hello {
@RequestMapping(value = {
"/test",
"/aa"
})
public String test() {
return "老王是帥哥";
}
}
當瀏覽器錄入:
http://localhost:6060/hello/aa
或者
http://localhost:6060/hello/test
(3)其他還有很多設置,比如@GetMapping("/test"),@PostMapping("/test"),其實就是設置了method,還有參數佔位等就不多說,比較散,用的時候自己查一下吧。
2.3 RequestBody與ResponseBody
@RequestBody 註解則是將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個對象。
作用:
-
該註解用於讀取Request請求的body部分數據,使用系統默認配置的HttpMessageConverter進行解析,然後把相應的數據綁定到要返回的對象上;
-
再把HttpMessageConverter返回的對象數據綁定到 controller中方法的參數上。
@ResponseBody註解的作用是將controller的方法返回的對象通過適當的轉換器轉換爲指定的格式之後,寫入到response對象的body區,通常用來返回JSON數據。
示例:
@RequestMapping(value = "user/login")
@ResponseBody
public User login(@RequestBody User user) {
// 這樣就不會再被解析爲跳轉路徑,而是直接將user對象寫入 HTTP 響應正文中
return user;
}
2.4 @Controller和@RestController
@RestController相當於@Controller+@ResponseBody合在一起使用的效果,返回json數據格式。
2.5 springboot約定訪問(static與templates)
前端資源,有兩個約定的目錄,resources\static和resources\templates,現在前後端分離,這兩個目錄用的比較少,但是也是需要知道這兩個目錄幹嘛用的,有時候後端測試的時候可以用一下,static用戶放置資源,一般是圖片、js等靜態資源;templates用於放置動態頁面;
(1)靜態資源,約定放到resources\static下面就可以直接訪問;
直接訪問:
(2)動態頁面,約定放置到resources\templates下面
默認放置到templates目錄下面的動態html頁面(1.html)不能直接訪問的,springboot默認的前端開發是thymeleaf,需要添加該pom依賴;
(1)添加pom依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
(2)cotroller跳轉,不能使用@RestController,要使用@Controller
@Controller
public class test {
@GetMapping("/test")
public String test() {
return "1";
}
}
效果:
更多信息請關注公衆號:「軟件老王」,關注不迷路,軟件老王和他的IT朋友們,分享一些他們的技術見解和生活故事。