springboot下,基本全标簽化了,spring标簽很多,有時候會混淆,簡單記錄下,以免有時候會迷糊。
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朋友們,分享一些他們的技術見解和生活故事。