《JAVA》初學筆記-Spring WebMVC

帶註釋的控制器

Spring MVC提供了一個基於註釋的編程模型,其中@Controller和@RestController組件使用註釋來表達請求映射,請求輸入,異常處理等。帶註釋的控制器具有靈活的方法簽名,無需擴展基類或實現特定的接口。以下示例顯示了由註釋定義的控制器:

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String handle(Model model) {
        model.addAttribute("message", "Hello World!");
        return "index";
    }
}

在前面的示例中,該方法接受Model並以String的形式返回視圖名稱,但是還存在許多其他選項,本章稍後將對其進行說明。
1.3.1. 聲明
您可以使用Servlet的WebApplicationContext中的標準Spring bean定義來定義控制器bean。 @Controller構造型允許自動檢測,與Spring對在類路徑中檢測@Component類併爲其自動註冊Bean定義的常規支持保持一致。它還充當帶註釋類的構造型,表明其作爲Web組件的作用。

要啓用對此類@Controller bean的自動檢測,可以將組件掃描添加到Java配置中,如以下示例所示:

@Configuration
@ComponentScan("org.example.web")
public class WebConfig {

    // ...
}

下面的示例顯示與前面的示例等效的XML配置:



<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="org.example.web"/>

    <!-- ... -->

</beans>


@RestController是一個組合的批註,其本身使用@Controller和@ResponseBody進行了元註釋,以指示其每個方法都繼承類型級別@ResponseBody批註的控制器,因此直接將其寫入響應主體(相對於視圖分辨率)並使用HTML模板。
AOP 代理
在某些情況下,許多人需要在運行時用AOP代理裝飾控制器。一個示例是,如果您選擇直接在控制器上具有@Transactional批註。在這種情況下,特別是對於控制器,我們建議使用基於類的代理。這通常是控制器的默認選擇。但是,如果控制器必須實現不是Spring Context回調的接口(例如InitializingBean,* Aware等),則可能需要顯式配置基於類的代理。例如,使用<tx:annotation-driven />,可以更改爲<tx:annotation-driven /> proxy-target-class \u003d“ true” />。1.3.2. 請求映射
您可以使用@RequestMapping批註將請求映射到控制器方法。它具有各種屬性,可以通過URL,HTTP方法,請求參數,標頭和媒體類型進行匹配。您可以在類級別使用它來表示共享的映射,也可以在方法級別使用它來縮小到特定的端點映射。、
@RequestMapping還有HTTP方法特定的快捷方式:

@GetMapping

@PostMapping

@PutMapping

@DeleteMapping

@PatchMapping

快捷方式是提供的“自定義註釋”,因爲可以說,大多數控制器方法應該映射到特定的HTTP方法,而不是使用@RequestMapping,後者默認情況下與所有HTTP方法匹配。同時,在類級別仍需要@RequestMapping來表示共享映射。

@RestController
@RequestMapping("/persons")
class PersonController {

    @GetMapping("/{id}")
    public Person getPerson(@PathVariable Long id) {
        // ...
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public void add(@RequestBody Person person) {
        // ...
    }
}

URI模式
您可以使用以下glob模式和通配符來映射請求:
?匹配一個字符

*匹配路徑段中的零個或多個字符
**匹配零個或多個路徑段
您還可以聲明URI變量並使用@PathVariable訪問其值,如以下示例所示:

@GetMapping("/owners/{ownerId}/pets/{petId}")
public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
    // ...
}

您可以在類和方法級別聲明URI變量,如以下示例所示:

@Controller
@RequestMapping("/owners/{ownerId}")
public class OwnerController {

    @GetMapping("/pets/{petId}")
    public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
        // ...
    }
}

1.3.3、處理程序方法
@RequestMapping處理程序方法具有靈活的簽名,可以從一系列受支持的控制器方法參數和返回值中進行選擇
下表描述了受支持的控制器方法參數。任何參數均不支持反應性類型。

支持JDK 8的java.util.Optional作爲方法參數,並與具有必需屬性(例如,@ RequestParam,@ RequestHeader等)的註釋結合在一起,等效於required \u003d false。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章